//--------------------------------------------------------------------------- #include #pragma hdrstop #include #include "CustomWinConfiguration.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- class THistoryStrings : public TStringList { public: __fastcall THistoryStrings() : TStringList() { FModified = false; }; __property bool Modified = { read = FModified, write = FModified }; private: bool FModified; }; //--------------------------------------------------------------------------- __fastcall TCustomWinConfiguration::TCustomWinConfiguration(): TGUIConfiguration() { FHistory = new TStringList(); FEmptyHistory = new TStringList(); } //--------------------------------------------------------------------------- __fastcall TCustomWinConfiguration::~TCustomWinConfiguration() { ClearHistory(); delete FHistory; delete FEmptyHistory; } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::ClearHistory() { assert(FHistory != NULL); THistoryStrings * HistoryStrings; for (int Index = 0; Index < FHistory->Count; Index++) { HistoryStrings = dynamic_cast(FHistory->Objects[Index]); FHistory->Objects[Index] = NULL; delete HistoryStrings; } FHistory->Clear(); } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::Default() { TGUIConfiguration::Default(); FShowAdvancedLoginOptions = false; FInterface = ifCommander; FLogView = lvNone; FSynchronizeChecklist.WindowParams = "0;-1;-1;600;450;0"; FSynchronizeChecklist.ListParams = "1;1|150,1;100,1;80,1;130,1;25,1;100,1;80,1;130,1|0;1;2;3;4;5;6;7"; FConsoleWin.WindowSize = "570,430"; ClearHistory(); } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::Saved() { TGUIConfiguration::Saved(); THistoryStrings * HistoryStrings; for (int Index = 0; Index < FHistory->Count; Index++) { HistoryStrings = dynamic_cast(FHistory->Objects[Index]); assert(HistoryStrings != NULL); HistoryStrings->Modified = false; } } //--------------------------------------------------------------------------- // duplicated from core\configuration.cpp #define LASTELEM(ELEM) \ ELEM.SubString(ELEM.LastDelimiter(".>")+1, ELEM.Length() - ELEM.LastDelimiter(".>")) #define BLOCK(KEY, CANCREATE, BLOCK) \ if (Storage->OpenSubKey(KEY, CANCREATE)) try { BLOCK } __finally { Storage->CloseSubKey(); } #define REGCONFIG(CANCREATE) \ BLOCK("Interface", CANCREATE, \ KEY(Integer, Interface); \ KEY(Bool, ShowAdvancedLoginOptions); \ ) \ BLOCK("Logging", CANCREATE, \ KEY(Integer, LogView); \ ) \ BLOCK("Interface\\SynchronizeChecklist", CANCREATE, \ KEY(String, SynchronizeChecklist.WindowParams); \ KEY(String, SynchronizeChecklist.ListParams); \ ); \ BLOCK("Interface\\ConsoleWin", CANCREATE, \ KEY(String, ConsoleWin.WindowSize); \ ); \ //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::SaveData( THierarchicalStorage * Storage, bool All) { TGUIConfiguration::SaveData(Storage, All); // duplicated from core\configuration.cpp #define KEY(TYPE, VAR) Storage->Write ## TYPE(LASTELEM(AnsiString(#VAR)), VAR) REGCONFIG(true); #undef KEY if (FHistory->Count > 0) { if (Storage->OpenSubKey("History", true)) { try { THistoryStrings * HistoryStrings; for (int Index = 0; Index < FHistory->Count; Index++) { HistoryStrings = dynamic_cast(FHistory->Objects[Index]); assert(HistoryStrings != NULL); if (All || HistoryStrings->Modified) { if (Storage->OpenSubKey(FHistory->Strings[Index], true)) { try { Storage->WriteValues(HistoryStrings); } __finally { Storage->CloseSubKey(); } } } } } __finally { Storage->CloseSubKey(); } } if (Storage->OpenSubKey("HistoryParams", true)) { try { THistoryStrings * HistoryStrings; for (int Index = 0; Index < FHistory->Count; Index++) { HistoryStrings = dynamic_cast(FHistory->Objects[Index]); assert(HistoryStrings != NULL); if (All || HistoryStrings->Modified) { bool HasData = false; for (int VIndex = 0; !HasData && (VIndex < HistoryStrings->Count); VIndex++) { HasData = (HistoryStrings->Objects[VIndex] != NULL); } if (!HasData) { Storage->RecursiveDeleteSubKey(FHistory->Strings[Index]); } else if (Storage->OpenSubKey(FHistory->Strings[Index], true)) { try { Storage->ClearValues(); for (int VIndex = 0; VIndex < HistoryStrings->Count; VIndex++) { void * Data = HistoryStrings->Objects[VIndex]; Storage->WriteBinaryData(IntToStr(VIndex), &Data, sizeof(Data)); } } __finally { Storage->CloseSubKey(); } } } } } __finally { Storage->CloseSubKey(); } } } } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::LoadData( THierarchicalStorage * Storage) { TGUIConfiguration::LoadData(Storage); // duplicated from core\configuration.cpp #define KEY(TYPE, VAR) VAR = Storage->Read ## TYPE(LASTELEM(AnsiString(#VAR)), VAR) #pragma warn -eas REGCONFIG(false); #pragma warn +eas #undef KEY ClearHistory(); if (Storage->OpenSubKey("History", false)) { TStrings * Names = NULL; try { Names = new TStringList(); Storage->GetSubKeyNames(Names); THistoryStrings * HistoryStrings; for (int Index = 0; Index < Names->Count; Index++) { HistoryStrings = NULL; if (Storage->OpenSubKey(Names->Strings[Index], false)) { try { HistoryStrings = new THistoryStrings(); Storage->ReadValues(HistoryStrings); FHistory->AddObject(Names->Strings[Index], HistoryStrings); HistoryStrings = NULL; } __finally { Storage->CloseSubKey(); delete HistoryStrings; } } } } __finally { Storage->CloseSubKey(); delete Names; } } if (Storage->OpenSubKey("HistoryParams", false)) { try { THistoryStrings * HistoryStrings; for (int Index = 0; Index < FHistory->Count; Index++) { HistoryStrings = dynamic_cast(FHistory->Objects[Index]); if (Storage->OpenSubKey(FHistory->Strings[Index], false)) { try { for (int VIndex = 0; VIndex < HistoryStrings->Count; VIndex++) { void * Data; if (Storage->ReadBinaryData(IntToStr(VIndex), &Data, sizeof(Data)) == sizeof(Data)) { HistoryStrings->Objects[VIndex] = reinterpret_cast(Data); } } } __finally { Storage->CloseSubKey(); } } } } __finally { Storage->CloseSubKey(); } } } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::SetShowAdvancedLoginOptions(bool value) { SET_CONFIG_PROPERTY(ShowAdvancedLoginOptions); } //--------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::SetLogView(TLogView value) { SET_CONFIG_PROPERTY(LogView); } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::SetInterface(TInterface value) { SET_CONFIG_PROPERTY(Interface); } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::SetHistory(const AnsiString Index, TStrings * value) { int I = FHistory->IndexOf(Index); bool NonEmpty = (value != NULL) && (value->Count > 0); THistoryStrings * HistoryStrings = NULL; if (I >= 0) { HistoryStrings = dynamic_cast(FHistory->Objects[I]); if (HistoryStrings->Equals(value)) { HistoryStrings = NULL; } } else if (NonEmpty) { HistoryStrings = new THistoryStrings(); FHistory->AddObject(Index, HistoryStrings); } if (HistoryStrings != NULL) { if (NonEmpty) { HistoryStrings->Assign(value); while (HistoryStrings->Count > MaxHistoryCount) { HistoryStrings->Delete(HistoryStrings->Count - 1); } } else { HistoryStrings->Clear(); } HistoryStrings->Modified = true; } } //--------------------------------------------------------------------------- TStrings * __fastcall TCustomWinConfiguration::GetHistory(const AnsiString Index) { int I = FHistory->IndexOf(Index); return I >= 0 ? dynamic_cast(FHistory->Objects[I]) : FEmptyHistory; } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::SetSynchronizeChecklist(TSynchronizeChecklistConfiguration value) { SET_CONFIG_PROPERTY(SynchronizeChecklist); } //--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::SetConsoleWin(TConsoleWinConfiguration value) { SET_CONFIG_PROPERTY(ConsoleWin); }