Browse Source

Storage configuration on Preferences dialog handles INI files specified on a command-line better

Source commit: 396643b716f44e6a67d442e276b155ebc83c1993
Martin Prikryl 5 years ago
parent
commit
fedeb6ad26

+ 6 - 4
source/core/Configuration.cpp

@@ -1154,9 +1154,9 @@ void __fastcall TConfiguration::SetDefaultStorage()
   FStorage = stDetect;
 }
 //---------------------------------------------------------------------------
-void __fastcall TConfiguration::SetIniFileStorageName(UnicodeString value)
+void __fastcall TConfiguration::SetExplicitIniFileStorageName(const UnicodeString & FileName)
 {
-  FIniFileStorageName = value;
+  FIniFileStorageName = FileName;
   FStorage = stIniFile;
 }
 //---------------------------------------------------------------------------
@@ -1247,7 +1247,6 @@ UnicodeString __fastcall TConfiguration::GetIniFileParamValue()
   {
     Result = INI_NUL;
   }
-  // See the comment in GetIniFileStorageName
   else if ((Storage == stIniFile) && !FIniFileStorageName.IsEmpty())
   {
     Result = FIniFileStorageName;
@@ -1258,7 +1257,6 @@ UnicodeString __fastcall TConfiguration::GetIniFileParamValue()
 UnicodeString __fastcall TConfiguration::GetIniFileStorageName(bool ReadingOnly)
 {
   UnicodeString Result;
-  // This does not work correctly with MoveStorage
   if (!FIniFileStorageName.IsEmpty())
   {
     Result = FIniFileStorageName;
@@ -1322,10 +1320,12 @@ UnicodeString __fastcall TConfiguration::GetRootKeyStr()
 void __fastcall TConfiguration::MoveStorage(TStorage AStorage, const UnicodeString & ACustomIniFileStorageName)
 {
   if ((FStorage != AStorage) ||
+      ((FStorage == stIniFile) && !FIniFileStorageName.IsEmpty()) ||
       !IsPathToSameFile(FCustomIniFileStorageName, ACustomIniFileStorageName))
   {
     TStorage StorageBak = FStorage;
     UnicodeString CustomIniFileStorageNameBak = FCustomIniFileStorageName;
+    UnicodeString IniFileStorageNameBak = FIniFileStorageName;
     try
     {
       THierarchicalStorage * SourceStorage = NULL;
@@ -1338,6 +1338,7 @@ void __fastcall TConfiguration::MoveStorage(TStorage AStorage, const UnicodeStri
 
         FStorage = AStorage;
         FCustomIniFileStorageName = ACustomIniFileStorageName;
+        FIniFileStorageName = UnicodeString();
 
         TargetStorage = CreateConfigStorage();
         TargetStorage->AccessMode = smReadWrite;
@@ -1366,6 +1367,7 @@ void __fastcall TConfiguration::MoveStorage(TStorage AStorage, const UnicodeStri
       //   (possible, when the INI file is in Program Files folder)
       FStorage = StorageBak;
       FCustomIniFileStorageName = CustomIniFileStorageNameBak;
+      FIniFileStorageName = IniFileStorageNameBak;
       throw;
     }
   }

+ 3 - 2
source/core/Configuration.h

@@ -124,7 +124,6 @@ private:
   UnicodeString __fastcall GetIniFileStorageNameForReadingWriting();
   UnicodeString __fastcall GetIniFileStorageNameForReading();
   UnicodeString __fastcall GetIniFileStorageName(bool ReadingOnly);
-  void __fastcall SetIniFileStorageName(UnicodeString value);
   void __fastcall SetOptionsStorage(TStrings * value);
   TStrings * __fastcall GetOptionsStorage();
   UnicodeString __fastcall GetPartialExt() const;
@@ -216,6 +215,7 @@ public:
   void __fastcall SaveExplicit();
   void __fastcall MoveStorage(TStorage AStorage, const UnicodeString & ACustomIniFileStorageName);
   void __fastcall ScheduleCustomIniFileStorageUse(const UnicodeString & ACustomIniFileStorageName);
+  void __fastcall SetExplicitIniFileStorageName(const UnicodeString & FileName);
   void __fastcall SetNulStorage();
   void __fastcall SetDefaultStorage();
   UnicodeString __fastcall GetAutomaticIniFileStorageName(bool ReadingOnly);
@@ -327,7 +327,8 @@ public:
   __property TStorage Storage  = { read=GetStorage };
   __property UnicodeString RegistryStorageKey  = { read=GetRegistryStorageKey };
   __property UnicodeString CustomIniFileStorageName  = { read=FCustomIniFileStorageName };
-  __property UnicodeString IniFileStorageName  = { read=GetIniFileStorageNameForReadingWriting, write=SetIniFileStorageName };
+  __property UnicodeString ExplicitIniFileStorageName  = { read=FIniFileStorageName };
+  __property UnicodeString IniFileStorageName  = { read=GetIniFileStorageNameForReadingWriting };
   __property UnicodeString IniFileStorageNameForReading  = { read=GetIniFileStorageNameForReading };
   __property TStrings * OptionsStorage = { read = GetOptionsStorage, write = SetOptionsStorage };
   __property bool Persistent = { read = GetPersistent };

+ 6 - 6
source/forms/Preferences.cpp

@@ -355,8 +355,10 @@ void __fastcall TPreferencesDialog::LoadConfiguration()
 
     // select none when stNul
     RegistryStorageButton->Checked = (Configuration->Storage == stRegistry);
-    AutomaticIniFileStorageButton->Checked = (Configuration->Storage == stIniFile) && Configuration->CustomIniFileStorageName.IsEmpty();
-    CustomIniFileStorageButton->Checked = (Configuration->Storage == stIniFile) && !Configuration->CustomIniFileStorageName.IsEmpty();
+    AutomaticIniFileStorageButton->Checked =
+      (Configuration->Storage == stIniFile) && Configuration->ExplicitIniFileStorageName.IsEmpty() && Configuration->CustomIniFileStorageName.IsEmpty();
+    CustomIniFileStorageButton->Checked =
+      (Configuration->Storage == stIniFile) && Configuration->ExplicitIniFileStorageName.IsEmpty() && !Configuration->CustomIniFileStorageName.IsEmpty();
     CustomIniFileStorageEdit->Text = Configuration->CustomIniFileStorageName;
     if (Configuration->CustomIniFileStorageName.IsEmpty())
     {
@@ -1333,11 +1335,9 @@ void __fastcall TPreferencesDialog::UpdateControls()
       DDCustomTemporaryDirectoryButton->Checked);
     EnableControl(ConfirmTemporaryDirectoryCleanupCheck,
       TemporaryDirectoryCleanupCheck->Checked);
-    // allow only when some of the known storages is selected,
-    // and particularly do not allow switching storage, when we start with stNul,
+    // do not allow switching storage, when we start with stNul,
     // as that would destroy the stored configuration
-    EnableControl(StorageGroup,
-      RegistryStorageButton->Checked || AutomaticIniFileStorageButton->Checked || CustomIniFileStorageButton->Checked);
+    EnableControl(StorageGroup, Configuration->Storage != stNul);
     AutomaticIniFileStorageLabel->UpdateStatus();
     EnableControl(CustomIniFileStorageEdit, CustomIniFileStorageButton->Checked);
 

+ 1 - 1
source/windows/UserInterface.cpp

@@ -45,7 +45,7 @@ TConfiguration * __fastcall CreateConfiguration()
     else if (CheckSafe(Params))
     {
       IniFileName = ExpandFileName(ExpandEnvironmentVariables(IniFileName));
-      WinConfiguration->IniFileStorageName = IniFileName;
+      WinConfiguration->SetExplicitIniFileStorageName(IniFileName);
     }
   }