EditorPreferences.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <Common.h>
  5. #include <WinConfiguration.h>
  6. #include <WinInterface.h>
  7. #include <VCLCommon.h>
  8. #include <TextsWin.h>
  9. #include <Tools.h>
  10. #include <CoreMain.h>
  11. #include "EditorPreferences.h"
  12. //---------------------------------------------------------------------------
  13. #pragma package(smart_init)
  14. #pragma link "HistoryComboBox"
  15. #pragma resource "*.dfm"
  16. //---------------------------------------------------------------------------
  17. bool __fastcall DoEditorPreferencesDialog(TEditorData * Editor,
  18. bool & Remember, TEditorPreferencesMode Mode, bool MayRemote)
  19. {
  20. bool Result;
  21. TEditorPreferencesDialog * Dialog = SafeFormCreate<TEditorPreferencesDialog>();
  22. try
  23. {
  24. Dialog->Init(Mode, MayRemote);
  25. Result = Dialog->Execute(Editor, Remember);
  26. }
  27. __finally
  28. {
  29. delete Dialog;
  30. }
  31. return Result;
  32. }
  33. //---------------------------------------------------------------------------
  34. __fastcall TEditorPreferencesDialog::TEditorPreferencesDialog(
  35. TComponent * Owner) :
  36. TForm(Owner)
  37. {
  38. SetCorrectFormParent(this);
  39. UseSystemSettings(this);
  40. UnicodeString ExecutableDescription;
  41. UnicodeString UsageState;
  42. bool TryNextTime;
  43. if (DetectSystemExternalEditor(true, FSystemExternalEditor, ExecutableDescription, UsageState, TryNextTime))
  44. {
  45. FSystemExternalEditor = FormatCommand(FSystemExternalEditor, L"");
  46. }
  47. }
  48. //---------------------------------------------------------------------------
  49. void __fastcall TEditorPreferencesDialog::Init(TEditorPreferencesMode Mode, bool MayRemote)
  50. {
  51. int CaptionId;
  52. switch (Mode)
  53. {
  54. case epmEdit:
  55. CaptionId = EDITOR_EDIT;
  56. break;
  57. case epmAdd:
  58. CaptionId = EDITOR_ADD;
  59. break;
  60. case epmAdHoc:
  61. CaptionId = EDITOR_AD_HOC;
  62. break;
  63. }
  64. Caption = LoadStr(CaptionId);
  65. if (Mode == epmAdHoc)
  66. {
  67. int Shift = ExternalEditorEdit->Left - MaskEdit->Left;
  68. ExternalEditorEdit->Left = MaskEdit->Left;
  69. ExternalEditorEdit->Width = ExternalEditorEdit->Width + Shift;
  70. Shift = ExternalEditorEdit->Top - MaskEdit->Top;
  71. ExternalEditorEdit->Top = MaskEdit->Top;
  72. ExternalEditorBrowseButton->Top = ExternalEditorBrowseButton->Top - Shift;
  73. Shift += (EditorExternalButton->Top - EditorInternalButton->Top);
  74. EditorGroup2->Height = EditorGroup2->Height - Shift;
  75. TLabel * ExternalEditorLabel = new TUIStateAwareLabel(this);
  76. ExternalEditorLabel->Caption = EditorExternalButton->Caption;
  77. ExternalEditorLabel->Parent = EditorGroup2;
  78. ExternalEditorLabel->Top = MaskLabel->Top;
  79. ExternalEditorLabel->Left = MaskLabel->Left;
  80. ExternalEditorLabel->FocusControl = ExternalEditorEdit;
  81. EditorInternalButton->Visible = false;
  82. EditorExternalButton->Visible = false;
  83. EditorOpenButton->Visible = false;
  84. DefaultButton->Top = DefaultButton->Top - Shift;
  85. DefaultButton->Left = ExternalEditorEdit->Left;
  86. Shift += ExternalEditorGroup->Top - MaskGroup->Top;
  87. MaskGroup->Visible = false;
  88. ExternalEditorGroup->Top = ExternalEditorGroup->Top - Shift;
  89. Height = Height - Shift;
  90. }
  91. else
  92. {
  93. int Shift = OkButton->Top - RememberCheck->Top;
  94. RememberCheck->Visible = false;
  95. Height = Height - Shift;
  96. }
  97. FMayRemote = MayRemote;
  98. }
  99. //---------------------------------------------------------------------------
  100. bool __fastcall TEditorPreferencesDialog::Execute(TEditorData * Editor, bool & Remember)
  101. {
  102. EditorInternalButton->Checked = (Editor->Editor == edInternal);
  103. EditorExternalButton->Checked = (Editor->Editor == edExternal);
  104. EditorOpenButton->Checked = (Editor->Editor == edOpen);
  105. UnicodeString ExternalEditor = Editor->ExternalEditor;
  106. if (!ExternalEditor.IsEmpty())
  107. {
  108. ReformatFileNameCommand(ExternalEditor);
  109. }
  110. ExternalEditorEdit->Text = ExternalEditor;
  111. ExternalEditorEdit->Items = CustomWinConfiguration->History[L"ExternalEditor"];
  112. FExternalEditorDefaults = GetExternalEditorDefaults();
  113. MaskEdit->Text = Editor->FileMask.Masks;
  114. MaskEdit->Items = CustomWinConfiguration->History[L"Mask"];
  115. ExternalEditorTextCheck->Checked = Editor->ExternalEditorText;
  116. SDIExternalEditorCheck->Checked = Editor->SDIExternalEditor;
  117. RememberCheck->Checked = Remember;
  118. UpdateControls();
  119. bool Result = (ShowModal() == DefaultResult(this));
  120. if (Result)
  121. {
  122. if (EditorExternalButton->Checked)
  123. {
  124. Editor->Editor = edExternal;
  125. }
  126. else if (EditorOpenButton->Checked)
  127. {
  128. Editor->Editor = edOpen;
  129. }
  130. else
  131. {
  132. Editor->Editor = edInternal;
  133. }
  134. Editor->ExternalEditor = ExternalEditorEdit->Text;
  135. ExternalEditorEdit->SaveToHistory();
  136. CustomWinConfiguration->History[L"ExternalEditor"] = ExternalEditorEdit->Items;
  137. Editor->FileMask = MaskEdit->Text;
  138. MaskEdit->SaveToHistory();
  139. CustomWinConfiguration->History[L"Mask"] = MaskEdit->Items;
  140. Editor->ExternalEditorText = ExternalEditorTextCheck->Checked;
  141. Editor->SDIExternalEditor = SDIExternalEditorCheck->Checked;
  142. Remember = RememberCheck->Checked;
  143. }
  144. return Result;
  145. }
  146. //---------------------------------------------------------------------------
  147. void __fastcall TEditorPreferencesDialog::ExternalEditorEditExit(
  148. TObject * Sender)
  149. {
  150. // duplicated in TPreferencesDialog::FilenameEditExit
  151. THistoryComboBox * FilenameEdit = dynamic_cast<THistoryComboBox *>(Sender);
  152. try
  153. {
  154. UnicodeString Filename = FilenameEdit->Text;
  155. if (!Filename.IsEmpty())
  156. {
  157. ReformatFileNameCommand(Filename);
  158. FilenameEdit->Text = Filename;
  159. }
  160. ControlChange(Sender);
  161. }
  162. catch(...)
  163. {
  164. FilenameEdit->SelectAll();
  165. FilenameEdit->SetFocus();
  166. throw;
  167. }
  168. ExternalEditorOptionsAutodetect();
  169. }
  170. //---------------------------------------------------------------------------
  171. TEditorData __fastcall TEditorPreferencesDialog::GetExternalEditorDefaults()
  172. {
  173. TEditorData Result;
  174. Result.ExternalEditor = ExternalEditorEdit->Text;
  175. Result.ExternalEditorOptionsAutodetect();
  176. return Result;
  177. }
  178. //---------------------------------------------------------------------------
  179. void __fastcall TEditorPreferencesDialog::ExternalEditorOptionsAutodetect()
  180. {
  181. DebugAssert(EditorExternalButton->Checked);
  182. TEditorData Defaults = GetExternalEditorDefaults();
  183. if (!(FExternalEditorDefaults == Defaults))
  184. {
  185. ExternalEditorTextCheck->Checked = Defaults.ExternalEditorText;
  186. SDIExternalEditorCheck->Checked = Defaults.SDIExternalEditor;
  187. FExternalEditorDefaults = Defaults;
  188. UpdateControls();
  189. }
  190. }
  191. //---------------------------------------------------------------------------
  192. void __fastcall TEditorPreferencesDialog::ExternalEditorBrowseButtonClick(
  193. TObject * /*Sender*/)
  194. {
  195. BrowseForExecutable(ExternalEditorEdit,
  196. LoadStr(PREFERENCES_SELECT_EXTERNAL_EDITOR),
  197. LoadStr(EXECUTABLE_FILTER), true, false);
  198. ExternalEditorOptionsAutodetect();
  199. }
  200. //---------------------------------------------------------------------------
  201. void __fastcall TEditorPreferencesDialog::HelpButtonClick(TObject * /*Sender*/)
  202. {
  203. FormHelp(this);
  204. }
  205. //---------------------------------------------------------------------------
  206. void __fastcall TEditorPreferencesDialog::ControlChange(TObject * /*Sender*/)
  207. {
  208. UpdateControls();
  209. }
  210. //---------------------------------------------------------------------------
  211. void __fastcall TEditorPreferencesDialog::UpdateControls()
  212. {
  213. EnableControl(OkButton,
  214. EditorInternalButton->Checked || EditorOpenButton->Checked ||
  215. !ExternalEditorEdit->Text.IsEmpty());
  216. EnableControl(ExternalEditorEdit, EditorExternalButton->Checked);
  217. EnableControl(ExternalEditorBrowseButton, EditorExternalButton->Checked);
  218. EnableControl(ExternalEditorGroup, EditorExternalButton->Checked && FMayRemote);
  219. EnableControl(DefaultButton, !FSystemExternalEditor.IsEmpty());
  220. }
  221. //---------------------------------------------------------------------------
  222. void __fastcall TEditorPreferencesDialog::FormCloseQuery(TObject * /*Sender*/,
  223. bool & /*CanClose*/)
  224. {
  225. if (ModalResult == DefaultResult(this))
  226. {
  227. ExitActiveControl(this);
  228. }
  229. }
  230. //---------------------------------------------------------------------------
  231. void __fastcall TEditorPreferencesDialog::MaskEditExit(TObject * /*Sender*/)
  232. {
  233. ValidateMaskEdit(MaskEdit);
  234. }
  235. //---------------------------------------------------------------------------
  236. void __fastcall TEditorPreferencesDialog::FormShow(TObject * /*Sender*/)
  237. {
  238. InstallPathWordBreakProc(ExternalEditorEdit);
  239. }
  240. //---------------------------------------------------------------------------
  241. void __fastcall TEditorPreferencesDialog::DefaultButtonClick(TObject * /*Sender*/)
  242. {
  243. EditorExternalButton->Checked = true;
  244. ExternalEditorEdit->Text = FSystemExternalEditor;
  245. UpdateControls();
  246. ExternalEditorOptionsAutodetect();
  247. }
  248. //---------------------------------------------------------------------------