/ide/frames/editor_general_options.pas

http://github.com/graemeg/lazarus · Pascal · 432 lines · 341 code · 54 blank · 37 comment · 22 complexity · 5d5fa1b3ba2d9cb1fea6ce53d52a8c95 MD5 · raw file

  1. {
  2. ***************************************************************************
  3. * *
  4. * This source is free software; you can redistribute it and/or modify *
  5. * it under the terms of the GNU General Public License as published by *
  6. * the Free Software Foundation; either version 2 of the License, or *
  7. * (at your option) any later version. *
  8. * *
  9. * This code is distributed in the hope that it will be useful, but *
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of *
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
  12. * General Public License for more details. *
  13. * *
  14. * A copy of the GNU General Public License is available on the World *
  15. * Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
  16. * obtain it by writing to the Free Software Foundation, *
  17. * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  18. * *
  19. ***************************************************************************
  20. }
  21. unit editor_general_options;
  22. {$mode objfpc}{$H+}
  23. interface
  24. uses
  25. Classes, SysUtils, LCLProc, LCLType, StdCtrls, Controls, ExtCtrls, Graphics,
  26. EditorOptions, LazarusIDEStrConsts, IDEProcs, IDEOptionsIntf,
  27. IDEUtils, SynEdit, SynHighlighterPas, SynPluginMultiCaret, DividerBevel;
  28. type
  29. TPreviewEditor = TSynEdit;
  30. { TEditorGeneralOptionsFrame }
  31. TEditorGeneralOptionsFrame = class(TAbstractIDEOptionsEditor)
  32. chkMultiCaretColumnMode: TCheckBox;
  33. chkMultiCaretMode: TCheckBox;
  34. MultiCaretOnColumnSelection: TCheckBox;
  35. CursorSkipsTabCheckBox: TCheckBox;
  36. CaretGroupDivider: TDividerBevel;
  37. BlockGroupDivider: TDividerBevel;
  38. ScrollGroupDivider: TDividerBevel;
  39. UndoGroupDivider: TDividerBevel;
  40. EndKeyJumpsToNearestStartCheckBox: TCheckBox;
  41. KeepCursorXCheckBox: TCheckBox;
  42. CenterLabel:TLabel;
  43. OverwriteBlockCheckBox: TCheckBox;
  44. PersistentCursorCheckBox: TCheckBox;
  45. AlwaysVisibleCursorCheckBox: TCheckBox;
  46. CursorSkipsSelectionCheckBox: TCheckBox;
  47. HomeKeyJumpsToNearestStartCheckBox: TCheckBox;
  48. PersistentBlockCheckBox: TCheckBox;
  49. HalfPageScrollCheckBox: TCheckBox;
  50. ScrollPastEndFileCheckBox: TCheckBox;
  51. ScrollPastEndLineCheckBox: TCheckBox;
  52. ScrollByOneLessCheckBox: TCheckBox;
  53. UndoAfterSaveCheckBox: TCheckBox;
  54. GroupUndoCheckBox: TCheckBox;
  55. UndoLimitComboBox: TComboBox;
  56. UndoLimitLabel: TLabel;
  57. chkScrollHint: TCheckBox;
  58. procedure AlwaysVisibleCursorCheckBoxChange(Sender: TObject);
  59. procedure CursorSkipsSelectionCheckBoxChange(Sender: TObject);
  60. procedure CursorSkipsTabCheckBoxChange(Sender: TObject);
  61. procedure EndKeyJumpsToNearestStartCheckBoxChange(Sender: TObject);
  62. procedure GroupUndoCheckBoxChange(Sender: TObject);
  63. procedure HalfPageScrollCheckBoxChange(Sender: TObject);
  64. procedure HomeKeyJumpsToNearestStartCheckBoxChange(Sender: TObject);
  65. procedure KeepCursorXCheckBoxChange(Sender: TObject);
  66. procedure OverwriteBlockCheckBoxChange(Sender: TObject);
  67. procedure PersistentBlockCheckBoxChange(Sender: TObject);
  68. procedure PersistentCursorCheckBoxChange(Sender: TObject);
  69. procedure ScrollByOneLessCheckBoxChange(Sender: TObject);
  70. procedure ScrollPastEndFileCheckBoxChange(Sender: TObject);
  71. procedure ScrollPastEndLineCheckBoxChange(Sender: TObject);
  72. private
  73. FDefaultBookmarkImages: TImageList;
  74. FDialog: TAbstractOptionsEditorDialog;
  75. FPasExtendedKeywordsMode: Boolean;
  76. FPasStringKeywordMode: TSynPasStringMode;
  77. function DefaultBookmarkImages: TImageList;
  78. procedure SetExtendedKeywordsMode(const AValue: Boolean);
  79. procedure SetStringKeywordMode(const AValue: TSynPasStringMode);
  80. public
  81. PreviewEdits: array of TPreviewEditor;
  82. procedure AddPreviewEdit(AEditor: TPreviewEditor);
  83. procedure SetPreviewOption(AValue: Boolean; AnOption: TSynEditorOption); overload;
  84. procedure SetPreviewOption(AValue: Boolean; AnOption: TSynEditorOption2); overload;
  85. procedure UpdatePrevieEdits;
  86. constructor Create(AOwner: TComponent); override;
  87. function GetTitle: String; override;
  88. procedure Setup(ADialog: TAbstractOptionsEditorDialog); override;
  89. procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
  90. procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
  91. class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
  92. // current previewmode
  93. property PasExtendedKeywordsMode: Boolean
  94. read FPasExtendedKeywordsMode write SetExtendedKeywordsMode default False;
  95. property PasStringKeywordMode: TSynPasStringMode
  96. read FPasStringKeywordMode write SetStringKeywordMode default spsmDefault;
  97. end;
  98. implementation
  99. {$R *.lfm}
  100. { TEditorGeneralOptionsFrame }
  101. function TEditorGeneralOptionsFrame.GetTitle: String;
  102. begin
  103. Result := lisGeneral;
  104. end;
  105. procedure TEditorGeneralOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
  106. begin
  107. FDialog := ADialog;
  108. // undo
  109. UndoGroupDivider.Caption := dlgUndoGroupOptions;
  110. UndoAfterSaveCheckBox.Caption := dlgUndoAfterSave;
  111. GroupUndoCheckBox.Caption := dlgGroupUndo;
  112. UndoLimitLabel.Caption := dlgUndoLimit;
  113. // scroll
  114. ScrollGroupDivider.Caption := dlgScrollGroupOptions;
  115. HalfPageScrollCheckBox.Caption := dlgHalfPageScroll;
  116. ScrollByOneLessCheckBox.Caption := dlgScrollByOneLess;
  117. ScrollPastEndFileCheckBox.Caption := dlgScrollPastEndFile;
  118. ScrollPastEndLineCheckBox.Caption := dlgScrollPastEndLine;
  119. chkScrollHint.Caption := dlgScrollHint;
  120. // caret + key navigation
  121. CaretGroupDivider.Caption := dlgCursorGroupOptions;
  122. KeepCursorXCheckBox.Caption := dlgKeepCursorX;
  123. PersistentCursorCheckBox.Caption := dlgPersistentCursor;
  124. AlwaysVisibleCursorCheckBox.Caption := dlgAlwaysVisibleCursor;
  125. CursorSkipsSelectionCheckBox.Caption := dlgCursorSkipsSelection;
  126. CursorSkipsTabCheckBox.Caption := dlgCursorSkipsTab;
  127. HomeKeyJumpsToNearestStartCheckBox.Caption := dlgHomeKeyJumpsToNearestStart;
  128. EndKeyJumpsToNearestStartCheckBox.Caption := dlgEndKeyJumpsToNearestStart;
  129. MultiCaretOnColumnSelection.Caption := dlgMultiCaretOnColumnSelection;
  130. chkMultiCaretColumnMode.Caption := dlgMultiCaretColumnMode;
  131. chkMultiCaretMode.Caption := dlgMultiCaretMode;
  132. // Block
  133. BlockGroupDivider.Caption := dlgBlockGroupOptions;
  134. PersistentBlockCheckBox.Caption := dlgPersistentBlock;
  135. OverwriteBlockCheckBox.Caption := dlgOverwriteBlock;
  136. end;
  137. procedure TEditorGeneralOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
  138. var
  139. i: integer;
  140. begin
  141. with AOptions as TEditorOptions do
  142. begin
  143. // undo
  144. UndoAfterSaveCheckBox.Checked := UndoAfterSave;
  145. GroupUndoCheckBox.Checked := eoGroupUndo in SynEditOptions;
  146. SetComboBoxText(UndoLimitComboBox, IntToStr(UndoLimit), cstCaseInsensitive);
  147. // scroll
  148. HalfPageScrollCheckBox.Checked := eoHalfPageScroll in SynEditOptions;
  149. ScrollByOneLessCheckBox.Checked := eoScrollByOneLess in SynEditOptions;
  150. ScrollPastEndFileCheckBox.Checked := eoScrollPastEoF in SynEditOptions;
  151. ScrollPastEndLineCheckBox.Checked := eoScrollPastEoL in SynEditOptions;
  152. chkScrollHint.Checked := eoShowScrollHint in SynEditOptions;
  153. // cursor
  154. KeepCursorXCheckBox.Checked := eoKeepCaretX in SynEditOptions;
  155. PersistentCursorCheckBox.Checked := eoPersistentCaret in SynEditOptions;
  156. AlwaysVisibleCursorCheckBox.Checked := eoAlwaysVisibleCaret in SynEditOptions2;
  157. CursorSkipsSelectionCheckBox.Checked := eoCaretSkipsSelection in SynEditOptions2;
  158. CursorSkipsTabCheckBox.Checked := eoCaretSkipTab in SynEditOptions2;
  159. HomeKeyJumpsToNearestStartCheckBox.Checked := eoEnhanceHomeKey in SynEditOptions;
  160. EndKeyJumpsToNearestStartCheckBox.Checked := eoEnhanceEndKey in SynEditOptions2;
  161. MultiCaretOnColumnSelection.Checked := MultiCaretOnColumnSelect;
  162. chkMultiCaretColumnMode.Checked := MultiCaretDefaultColumnSelectMode = mcmMoveAllCarets;
  163. chkMultiCaretMode.Checked := MultiCaretDefaultMode = mcmMoveAllCarets;
  164. // block
  165. PersistentBlockCheckBox.Checked := eoPersistentBlock in SynEditOptions2;
  166. OverwriteBlockCheckBox.Checked := eoOverwriteBlock in SynEditOptions2;
  167. for i := Low(PreviewEdits) to High(PreviewEdits) do
  168. if PreviewEdits[i] <> nil then
  169. GetSynEditPreviewSettings(PreviewEdits[i]);
  170. end;
  171. end;
  172. procedure TEditorGeneralOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
  173. procedure UpdateOptionFromBool(AValue: Boolean; AnOption: TSynEditorOption); overload;
  174. begin
  175. if AValue then
  176. TEditorOptions(AOptions).SynEditOptions := TEditorOptions(AOptions).SynEditOptions + [AnOption]
  177. else
  178. TEditorOptions(AOptions).SynEditOptions := TEditorOptions(AOptions).SynEditOptions - [AnOption];
  179. end;
  180. procedure UpdateOptionFromBool(AValue: Boolean; AnOption: TSynEditorOption2); overload;
  181. begin
  182. if AValue then
  183. TEditorOptions(AOptions).SynEditOptions2 := TEditorOptions(AOptions).SynEditOptions2 + [AnOption]
  184. else
  185. TEditorOptions(AOptions).SynEditOptions2 := TEditorOptions(AOptions).SynEditOptions2 - [AnOption];
  186. end;
  187. var
  188. i: integer;
  189. begin
  190. with AOptions as TEditorOptions do
  191. begin
  192. // undo
  193. UndoAfterSave := UndoAfterSaveCheckBox.Checked;
  194. UpdateOptionFromBool(GroupUndoCheckBox.Checked, eoGroupUndo);
  195. i := StrToIntDef(UndoLimitComboBox.Text, 32767);
  196. if i < 1 then
  197. i := 1;
  198. if i > 32767 then
  199. i := 32767;
  200. UndoLimit := i;
  201. // scroll
  202. UpdateOptionFromBool(HalfPageScrollCheckBox.Checked, eoHalfPageScroll);
  203. UpdateOptionFromBool(ScrollByOneLessCheckBox.Checked, eoScrollByOneLess);
  204. UpdateOptionFromBool(ScrollPastEndFileCheckBox.Checked, eoScrollPastEoF);
  205. UpdateOptionFromBool(ScrollPastEndLineCheckBox.Checked, eoScrollPastEoL);
  206. UpdateOptionFromBool(chkScrollHint.Checked, eoShowScrollHint);
  207. // cursor
  208. UpdateOptionFromBool(KeepCursorXCheckBox.Checked, eoKeepCaretX);
  209. UpdateOptionFromBool(PersistentCursorCheckBox.Checked, eoPersistentCaret);
  210. UpdateOptionFromBool(AlwaysVisibleCursorCheckBox.Checked, eoAlwaysVisibleCaret);
  211. UpdateOptionFromBool(CursorSkipsSelectionCheckBox.Checked, eoCaretSkipsSelection);
  212. UpdateOptionFromBool(CursorSkipsTabCheckBox.Checked, eoCaretSkipTab);
  213. UpdateOptionFromBool(HomeKeyJumpsToNearestStartCheckBox.Checked, eoEnhanceHomeKey);
  214. UpdateOptionFromBool(EndKeyJumpsToNearestStartCheckBox.Checked, eoEnhanceEndKey);
  215. MultiCaretOnColumnSelect := MultiCaretOnColumnSelection.Checked;
  216. if chkMultiCaretColumnMode.Checked then
  217. MultiCaretDefaultColumnSelectMode := mcmMoveAllCarets
  218. else
  219. MultiCaretDefaultColumnSelectMode := mcmCancelOnCaretMove;
  220. if chkMultiCaretMode.Checked then
  221. MultiCaretDefaultMode := mcmMoveAllCarets
  222. else
  223. MultiCaretDefaultMode := mcmCancelOnCaretMove;
  224. // block
  225. UpdateOptionFromBool(PersistentBlockCheckBox.Checked, eoPersistentBlock);
  226. UpdateOptionFromBool(OverwriteBlockCheckBox.Checked, eoOverwriteBlock);
  227. end;
  228. end;
  229. class function TEditorGeneralOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
  230. begin
  231. Result := TEditorOptions;
  232. end;
  233. procedure TEditorGeneralOptionsFrame.SetPreviewOption(AValue: Boolean; AnOption: TSynEditorOption);
  234. var
  235. a: Integer;
  236. begin
  237. for a := Low(PreviewEdits) to High(PreviewEdits) do
  238. begin
  239. if PreviewEdits[a] <> nil then
  240. if AValue then
  241. PreviewEdits[a].Options := PreviewEdits[a].Options + [AnOption]
  242. else
  243. PreviewEdits[a].Options := PreviewEdits[a].Options - [AnOption];
  244. end;
  245. end;
  246. procedure TEditorGeneralOptionsFrame.SetPreviewOption(AValue: Boolean; AnOption: TSynEditorOption2);
  247. var
  248. a: Integer;
  249. begin
  250. for a := Low(PreviewEdits) to High(PreviewEdits) do
  251. begin
  252. if PreviewEdits[a] <> nil then
  253. if AValue then
  254. PreviewEdits[a].Options2 := PreviewEdits[a].Options2 + [AnOption]
  255. else
  256. PreviewEdits[a].Options2 := PreviewEdits[a].Options2 - [AnOption];
  257. end;
  258. end;
  259. procedure TEditorGeneralOptionsFrame.UpdatePrevieEdits;
  260. var
  261. a: Integer;
  262. begin
  263. for a := Low(PreviewEdits) to High(PreviewEdits) do
  264. if PreviewEdits[a].Highlighter is TSynPasSyn then begin
  265. TSynPasSyn(PreviewEdits[a].Highlighter).ExtendedKeywordsMode := PasExtendedKeywordsMode;
  266. TSynPasSyn(PreviewEdits[a].Highlighter).StringKeywordMode := PasStringKeywordMode;
  267. end;
  268. end;
  269. procedure TEditorGeneralOptionsFrame.AlwaysVisibleCursorCheckBoxChange(
  270. Sender: TObject);
  271. begin
  272. SetPreviewOption(AlwaysVisibleCursorCheckBox.Checked, eoAlwaysVisibleCaret);
  273. end;
  274. procedure TEditorGeneralOptionsFrame.CursorSkipsSelectionCheckBoxChange(
  275. Sender: TObject);
  276. begin
  277. SetPreviewOption(CursorSkipsSelectionCheckBox.Checked, eoCaretSkipsSelection);
  278. end;
  279. procedure TEditorGeneralOptionsFrame.CursorSkipsTabCheckBoxChange(Sender: TObject);
  280. begin
  281. SetPreviewOption(CursorSkipsTabCheckBox.Checked, eoCaretSkipTab);
  282. end;
  283. procedure TEditorGeneralOptionsFrame.EndKeyJumpsToNearestStartCheckBoxChange(
  284. Sender: TObject);
  285. begin
  286. SetPreviewOption(EndKeyJumpsToNearestStartCheckBox.Checked, eoEnhanceEndKey);
  287. end;
  288. procedure TEditorGeneralOptionsFrame.GroupUndoCheckBoxChange(Sender: TObject);
  289. begin
  290. SetPreviewOption(GroupUndoCheckBox.Checked, eoGroupUndo);
  291. end;
  292. procedure TEditorGeneralOptionsFrame.HalfPageScrollCheckBoxChange(
  293. Sender: TObject);
  294. begin
  295. SetPreviewOption(HalfPageScrollCheckBox.Checked, eoHalfPageScroll);
  296. end;
  297. procedure TEditorGeneralOptionsFrame.HomeKeyJumpsToNearestStartCheckBoxChange(
  298. Sender: TObject);
  299. begin
  300. SetPreviewOption(HomeKeyJumpsToNearestStartCheckBox.Checked, eoEnhanceHomeKey);
  301. end;
  302. procedure TEditorGeneralOptionsFrame.KeepCursorXCheckBoxChange(Sender: TObject);
  303. begin
  304. SetPreviewOption(KeepCursorXCheckBox.Checked, eoKeepCaretX);
  305. end;
  306. procedure TEditorGeneralOptionsFrame.OverwriteBlockCheckBoxChange(Sender: TObject);
  307. begin
  308. SetPreviewOption(KeepCursorXCheckBox.Checked, eoOverwriteBlock);
  309. end;
  310. procedure TEditorGeneralOptionsFrame.PersistentBlockCheckBoxChange(Sender: TObject);
  311. begin
  312. SetPreviewOption(PersistentBlockCheckBox.Checked, eoPersistentBlock);
  313. end;
  314. procedure TEditorGeneralOptionsFrame.PersistentCursorCheckBoxChange(
  315. Sender: TObject);
  316. begin
  317. SetPreviewOption(PersistentCursorCheckBox.Checked, eoPersistentCaret);
  318. end;
  319. procedure TEditorGeneralOptionsFrame.ScrollByOneLessCheckBoxChange(
  320. Sender: TObject);
  321. begin
  322. SetPreviewOption(ScrollByOneLessCheckBox.Checked, eoScrollByOneLess);
  323. end;
  324. procedure TEditorGeneralOptionsFrame.ScrollPastEndFileCheckBoxChange(
  325. Sender: TObject);
  326. begin
  327. SetPreviewOption(ScrollPastEndFileCheckBox.Checked, eoScrollPastEoF);
  328. end;
  329. procedure TEditorGeneralOptionsFrame.ScrollPastEndLineCheckBoxChange(
  330. Sender: TObject);
  331. begin
  332. SetPreviewOption(ScrollPastEndLineCheckBox.Checked, eoScrollPastEoL);
  333. end;
  334. function TEditorGeneralOptionsFrame.DefaultBookmarkImages: TImageList;
  335. var
  336. i: integer;
  337. begin
  338. if FDefaultBookmarkImages = nil then
  339. begin
  340. FDefaultBookmarkImages := TImageList.Create(Self);
  341. FDefaultBookmarkImages.Width := 11;
  342. FDefaultBookmarkImages.Height := 11;
  343. for i := 0 to 9 do
  344. FDefaultBookmarkImages.AddResourceName(HInstance, 'bookmark' + IntToStr(i));
  345. end;
  346. Result := FDefaultBookmarkImages;
  347. end;
  348. procedure TEditorGeneralOptionsFrame.SetExtendedKeywordsMode(const AValue: Boolean);
  349. begin
  350. if FPasExtendedKeywordsMode = AValue then exit;
  351. FPasExtendedKeywordsMode := AValue;
  352. UpdatePrevieEdits;
  353. end;
  354. procedure TEditorGeneralOptionsFrame.SetStringKeywordMode(const AValue: TSynPasStringMode);
  355. begin
  356. if FPasStringKeywordMode = AValue then exit;
  357. FPasStringKeywordMode := AValue;
  358. UpdatePrevieEdits;
  359. end;
  360. procedure TEditorGeneralOptionsFrame.AddPreviewEdit(AEditor: TPreviewEditor);
  361. begin
  362. SetLength(PreviewEdits, Length(PreviewEdits) + 1);
  363. PreviewEdits[Length(PreviewEdits)-1] := AEditor;
  364. if AEditor.BookMarkOptions.BookmarkImages = nil then
  365. AEditor.BookMarkOptions.BookmarkImages := DefaultBookmarkImages;
  366. end;
  367. constructor TEditorGeneralOptionsFrame.Create(AOwner: TComponent);
  368. begin
  369. inherited Create(AOwner);
  370. PreviewEdits := nil;
  371. if EditorOpts <> nil then begin
  372. FPasExtendedKeywordsMode := EditorOpts.PasExtendedKeywordsMode;
  373. FPasStringKeywordMode := EditorOpts.PasStringKeywordMode;
  374. end;
  375. end;
  376. initialization
  377. RegisterIDEOptionsEditor(GroupEditor, TEditorGeneralOptionsFrame, EdtOptionsGeneral);
  378. end.