瀏覽代碼

Bug 1872: Automatically restore external editor defaults when changing editor command from Notepad to 3rd party editor

https://winscp.net/tracker/1872
(cherry picked from commit 27e1860ba0a06defeffb2220984d4f9d86ac8690)

Source commit: 468a6ea6a83f5d15234e1228c9ff6df8caec255a
Martin Prikryl 5 年之前
父節點
當前提交
97696ffa9b

+ 1 - 1
source/forms/CustomScpExplorer.cpp

@@ -3411,7 +3411,7 @@ void __fastcall TCustomScpExplorerForm::EditorAutoConfig()
         TEditorData EditorData;
         EditorData.Editor = edExternal;
         EditorData.ExternalEditor = FormatCommand(Executable, L"");
-        EditorData.DecideExternalEditorText();
+        EditorData.ExternalEditorOptionsAutodetect();
 
         TEditorList EditorList;
         EditorList = *WinConfiguration->EditorList;

+ 20 - 6
source/forms/EditorPreferences.cpp

@@ -117,6 +117,7 @@ bool __fastcall TEditorPreferencesDialog::Execute(TEditorData * Editor, bool & R
   }
   ExternalEditorEdit->Text = ExternalEditor;
   ExternalEditorEdit->Items = CustomWinConfiguration->History[L"ExternalEditor"];
+  FExternalEditorDefaults = GetExternalEditorDefaults();
   MaskEdit->Text = Editor->FileMask.Masks;
   MaskEdit->Items = CustomWinConfiguration->History[L"Mask"];
   ExternalEditorTextCheck->Checked = Editor->ExternalEditorText;
@@ -176,14 +177,27 @@ void __fastcall TEditorPreferencesDialog::ExternalEditorEditExit(
     throw;
   }
 
-  DecideExternalEditorText();
+  ExternalEditorOptionsAutodetect();
 }
 //---------------------------------------------------------------------------
-void __fastcall TEditorPreferencesDialog::DecideExternalEditorText()
+TEditorData __fastcall TEditorPreferencesDialog::GetExternalEditorDefaults()
 {
-  if (TEditorData::DecideExternalEditorText(ExternalEditorEdit->Text))
+  TEditorData Result;
+  Result.ExternalEditor = ExternalEditorEdit->Text;
+  Result.ExternalEditorOptionsAutodetect();
+  return Result;
+}
+//---------------------------------------------------------------------------
+void __fastcall TEditorPreferencesDialog::ExternalEditorOptionsAutodetect()
+{
+  DebugAssert(EditorExternalButton->Checked);
+  TEditorData Defaults = GetExternalEditorDefaults();
+
+  if (!(FExternalEditorDefaults == Defaults))
   {
-    ExternalEditorTextCheck->Checked = true;
+    ExternalEditorTextCheck->Checked = Defaults.ExternalEditorText;
+    SDIExternalEditorCheck->Checked = Defaults.SDIExternalEditor;
+    FExternalEditorDefaults = Defaults;
     UpdateControls();
   }
 }
@@ -194,7 +208,7 @@ void __fastcall TEditorPreferencesDialog::ExternalEditorBrowseButtonClick(
   BrowseForExecutable(ExternalEditorEdit,
     LoadStr(PREFERENCES_SELECT_EXTERNAL_EDITOR),
     LoadStr(EXECUTABLE_FILTER), true, false);
-  DecideExternalEditorText();
+  ExternalEditorOptionsAutodetect();
 }
 //---------------------------------------------------------------------------
 void __fastcall TEditorPreferencesDialog::HelpButtonClick(TObject * /*Sender*/)
@@ -242,6 +256,6 @@ void __fastcall TEditorPreferencesDialog::DefaultButtonClick(TObject * /*Sender*
   EditorExternalButton->Checked = true;
   ExternalEditorEdit->Text = FSystemExternalEditor;
   UpdateControls();
-  DecideExternalEditorText();
+  ExternalEditorOptionsAutodetect();
 }
 //---------------------------------------------------------------------------

+ 3 - 1
source/forms/EditorPreferences.h

@@ -47,10 +47,12 @@ public:
 
 private:
   void __fastcall UpdateControls();
-  void __fastcall DecideExternalEditorText();
+  TEditorData __fastcall GetExternalEditorDefaults();
+  void __fastcall ExternalEditorOptionsAutodetect();
 
   bool FMayRemote;
   UnicodeString FSystemExternalEditor;
+  TEditorData FExternalEditorDefaults;
 
   INTERFACE_HOOK;
 };

+ 6 - 14
source/windows/WinConfiguration.cpp

@@ -109,32 +109,24 @@ bool __fastcall TEditorData::operator==(const TEditorData & rhd) const
 }
 #undef C
 //---------------------------------------------------------------------------
-bool __fastcall TEditorData::DecideExternalEditorText(UnicodeString ExternalEditor)
+void __fastcall TEditorData::ExternalEditorOptionsAutodetect()
 {
-  bool Result = false;
   // By default we use default transfer mode (binary),
   // as all reasonable 3rd party editors support all EOL styles.
   // A notable exception is Windows Notepad, so here's an exception for it.
   // Notepad support unix line endings since Windows 10 1809. Once that's widespread, remove this.
 
-  ReformatFileNameCommand(ExternalEditor);
-  UnicodeString ProgramName = ExtractProgramName(ExternalEditor);
+  UnicodeString Command = ExternalEditor;
+  ReformatFileNameCommand(Command);
+  UnicodeString ProgramName = ExtractProgramName(Command);
   // We explicitly do not use TEditorPreferences::GetDefaultExternalEditor(),
   // as we need to explicitly refer to the Notepad, even if the default external
   // editor ever changes
   UnicodeString NotepadProgramName = ExtractProgramName(NotepadName);
   if (SameText(ProgramName, NotepadProgramName))
-  {
-    Result = true;
-  }
-  return Result;
-}
-//---------------------------------------------------------------------------
-void __fastcall TEditorData::DecideExternalEditorText()
-{
-  if (DecideExternalEditorText(ExternalEditor))
   {
     ExternalEditorText = true;
+    SDIExternalEditor = true;
   }
 }
 //---------------------------------------------------------------------------
@@ -167,7 +159,7 @@ UnicodeString __fastcall TEditorPreferences::GetDefaultExternalEditor()
 void __fastcall TEditorPreferences::LegacyDefaults()
 {
   FData.ExternalEditor = GetDefaultExternalEditor();
-  FData.DecideExternalEditorText();
+  FData.ExternalEditorOptionsAutodetect();
 }
 //---------------------------------------------------------------------------
 UnicodeString __fastcall TEditorPreferences::ExtractExternalEditorName() const

+ 1 - 2
source/windows/WinConfiguration.h

@@ -248,8 +248,7 @@ struct TEditorData
   bool DetectMDIExternalEditor;
 
   bool __fastcall operator ==(const TEditorData & rhd) const;
-  void __fastcall DecideExternalEditorText();
-  static bool __fastcall DecideExternalEditorText(UnicodeString ExternalEditor);
+  void __fastcall ExternalEditorOptionsAutodetect();
 };
 //---------------------------------------------------------------------------
 struct TFileColorData