2
***************************************************************************
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. *
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. *
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. *
19
***************************************************************************
21
unit editor_display_options;
28
Classes, SysUtils, Graphics, Dialogs, StdCtrls,
29
Spin, LCLType, SynEdit, SynEditMouseCmds, EditorOptions, LazarusIDEStrConsts,
30
IDEOptionsIntf, editor_general_options, editor_color_options, IDEProcs,
31
SynGutterLineNumber, SynGutterLineOverview, SynGutter, SourceSynEditor;
34
{ TEditorDisplayOptionsFrame }
36
TEditorDisplayOptionsFrame = class(TAbstractIDEOptionsEditor)
37
chkTopInfoView: TCheckBox;
38
chkShowOverview: TCheckBox;
39
DisableAntialiasingCheckBox: TCheckBox;
40
DisplayPreview: TSynEdit;
41
EditorFontButton: TButton;
42
EditorFontComboBox: TComboBox;
43
EditorFontGroupBox: TGroupBox;
44
EditorFontSizeSpinEdit: TSpinEdit;
45
EditorFontSizeLabel: TLabel;
46
ExtraCharSpacingComboBox: TComboBox;
47
ExtraCharSpacingLabel: TLabel;
48
ExtraLineSpacingComboBox: TComboBox;
49
ExtraLineSpacingLabel: TLabel;
50
GutterSeparatorIndexLabel: TLabel;
51
MarginAndGutterGroupBox: TGroupBox;
52
RightMarginColorLink: TLabel;
53
RightMarginComboBox: TComboBox;
54
RightMarginLabel: TLabel;
55
ShowLineNumbersCheckBox: TCheckBox;
56
ShowOnlyLineNumbersMultiplesOfLabel: TLabel;
57
ShowOnlyLineNumbersMultiplesOfSpinEdit: TSpinEdit;
58
GutterSeparatorIndexSpinBox: TSpinEdit;
59
VisibleGutterCheckBox: TCheckBox;
60
VisibleRightMarginCheckBox: TCheckBox;
61
procedure EditorFontButtonClick(Sender: TObject);
62
procedure EditorFontComboBoxEditingDone(Sender: TObject);
63
procedure EditorFontSizeSpinEditChange(Sender: TObject);
64
procedure ComboboxOnExit(Sender: TObject);
65
procedure ComboBoxOnKeyDown(Sender: TObject; var Key: Word;
67
procedure ComboboxOnChange(Sender: TObject);
68
procedure GeneralCheckBoxOnChange(Sender: TObject);
69
procedure RightMarginColorLinkClick(Sender: TObject);
70
procedure RightMarginColorLinkMouseEnter(Sender: TObject);
71
procedure RightMarginColorLinkMouseLeave(Sender: TObject);
72
procedure ShowLineNumbersCheckBoxClick(Sender: TObject);
74
FDialog: TAbstractOptionsEditorDialog;
75
FUpdatingFontSizeRange: Boolean;
76
function FontSizeNegativeToPositive(NegativeSize: Integer): Integer;
77
function GeneralPage: TEditorGeneralOptionsFrame; inline;
78
procedure SetEditorFontSizeSpinEditValue(FontSize: Integer);
80
procedure FontDialogApplyClicked(Sender: TObject);
81
function DoSynEditMouse(var AnInfo: TSynEditMouseActionInfo;
82
HandleActionProc: TSynEditMouseActionHandler): Boolean;
84
function GetTitle: String; override;
85
procedure Setup(ADialog: TAbstractOptionsEditorDialog); override;
86
procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
87
procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
88
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
98
function TEditorDisplayOptionsFrame.FontSizeNegativeToPositive(NegativeSize: Integer): Integer;
102
DisplayPreview.Canvas.Font.Assign(DisplayPreview.Font);
103
if LCLIntf.GetTextMetrics(DisplayPreview.Canvas.Handle, tm) then
104
Result := -(NegativeSize + MulDiv(tm.tmInternalLeading, 72, DisplayPreview.Font.PixelsPerInch))
106
Result := -NegativeSize;
109
procedure TEditorDisplayOptionsFrame.FontDialogApplyClicked(Sender: TObject);
114
for a := Low(PreviewEdits) to High(PreviewEdits) do
115
if PreviewEdits[a] <> nil then
116
PreviewEdits[a].Font.Assign(TFontDialog(Sender).Font);
118
SetComboBoxText(EditorFontComboBox, DisplayPreview.Font.Name,cstCaseInsensitive);
119
SetEditorFontSizeSpinEditValue(DisplayPreview.Font.Size);
122
function TEditorDisplayOptionsFrame.DoSynEditMouse(var AnInfo: TSynEditMouseActionInfo;
123
HandleActionProc: TSynEditMouseActionHandler): Boolean;
128
procedure TEditorDisplayOptionsFrame.EditorFontButtonClick(Sender: TObject);
130
FontDialog: TFontDialog;
131
CurFontSize: Integer;
133
FontDialog := TFontDialog.Create(nil);
137
Font.Name := EditorFontComboBox.Text;
138
CurFontSize := EditorFontSizeSpinEdit.Value;
139
if CurFontSize < 0 then
141
CurFontSize := FontSizeNegativeToPositive(CurFontSize);
142
RepairEditorFontSize(CurFontSize);
144
Font.Size := CurFontSize;
145
Options := Options + [fdApplyButton];
146
OnApplyClicked := @FontDialogApplyClicked;
148
FontDialogApplyClicked(FontDialog);
155
procedure TEditorDisplayOptionsFrame.EditorFontComboBoxEditingDone(Sender: TObject);
160
for i := Low(PreviewEdits) to High(PreviewEdits) do
161
if PreviewEdits[i] <> nil then
162
PreviewEdits[i].Font.Name := EditorFontComboBox.Text;
165
procedure TEditorDisplayOptionsFrame.EditorFontSizeSpinEditChange(Sender: TObject);
169
NewVal := EditorFontSizeSpinEdit.Value;
170
if (NewVal < 0) and (NewVal > -EditorOptionsMinimumFontSize) then
172
// Skip to minimum positive value. Will trigger OnChange again.
173
SetEditorFontSizeSpinEditValue(EditorOptionsMinimumFontSize);
177
if (NewVal > 0) and not FUpdatingFontSizeRange then
178
EditorFontSizeSpinEdit.MinValue := EditorOptionsMinimumFontSize;
181
for a := Low(PreviewEdits) to High(PreviewEdits) do
182
if PreviewEdits[a] <> nil then
183
PreviewEdits[a].Font.Size := NewVal;
187
procedure TEditorDisplayOptionsFrame.ComboboxOnExit(Sender: TObject);
191
if Sender = ExtraCharSpacingComboBox then
193
NewVal := StrToIntDef(ExtraCharSpacingComboBox.Text, DisplayPreview.ExtraCharSpacing);
194
SetComboBoxText(ExtraCharSpacingComboBox, IntToStr(NewVal),cstCaseInsensitive);
196
for a := Low(PreviewEdits) to High(PreviewEdits) do
197
if PreviewEdits[a] <> Nil then
198
PreviewEdits[a].ExtraCharSpacing := NewVal;
201
if Sender = ExtraLineSpacingComboBox then
203
NewVal := StrToIntDef(ExtraLineSpacingComboBox.Text, DisplayPreview.ExtraLineSpacing);
204
SetComboBoxText(ExtraLineSpacingComboBox, IntToStr(NewVal),cstCaseInsensitive);
206
for a := Low(PreviewEdits) to High(PreviewEdits) do
207
if PreviewEdits[a] <> Nil then
208
PreviewEdits[a].ExtraLineSpacing := NewVal;
211
if Sender = RightMarginComboBox then
213
NewVal := StrToIntDef(RightMarginComboBox.Text, DisplayPreview.RightEdge);
214
SetComboBoxText(RightMarginComboBox, IntToStr(NewVal),cstCaseInsensitive);
216
for a := Low(PreviewEdits) to High(PreviewEdits) do
217
if PreviewEdits[a] <> nil then
219
PreviewEdits[a].RightEdge := NewVal;
220
if VisibleRightMarginCheckBox.Checked then
221
PreviewEdits[a].Options := PreviewEdits[a].Options - [eoHideRightMargin]
223
PreviewEdits[a].Options := PreviewEdits[a].Options + [eoHideRightMargin];
228
procedure TEditorDisplayOptionsFrame.ComboBoxOnKeyDown(Sender: TObject; var Key: Word;
231
if (ssCtrl in Shift) and (Key = VK_S) then
232
ComboBoxOnExit(Sender);
235
procedure TEditorDisplayOptionsFrame.ComboboxOnChange(Sender: TObject);
237
ComboBox: TComboBox absolute Sender;
239
if ComboBox.Items.IndexOf(ComboBox.Text) >= 0 then
240
ComboBoxOnExit(Sender);
243
procedure TEditorDisplayOptionsFrame.GeneralCheckBoxOnChange(Sender: TObject);
246
AGeneralPage: TEditorGeneralOptionsFrame;
247
Separator: TSynGutterSeparator;
249
AGeneralPage := GeneralPage;
251
if AGeneralPage = nil then
255
for a := Low(PreviewEdits) to High(PreviewEdits) do
256
if PreviewEdits[a] <> nil then
258
PreviewEdits[a].Gutter.Visible := VisibleGutterCheckBox.Checked;
259
PreviewEdits[a].RightGutter.Visible := chkShowOverview.Checked;
260
PreviewEdits[a].Gutter.LineNumberPart.Visible
261
:= ShowLineNumbersCheckBox.Checked;
262
if Assigned(PreviewEdits[a].Gutter.Parts.ByClass[TSynGutterLineNumber, 0]) then
263
TSynGutterLineNumber(PreviewEdits[a].Gutter.Parts.ByClass[TSynGutterLineNumber, 0])
264
.ShowOnlyLineNumbersMultiplesOf := ShowOnlyLineNumbersMultiplesOfSpinEdit.Value;
266
Separator := TSynGutterSeparator(PreviewEdits[a].Gutter.Parts.ByClass[TSynGutterSeparator, 0]);
267
if Assigned(Separator) then
269
Separator.Visible := GutterSeparatorIndexSpinBox.Value <> -1;
270
if Separator.Visible then
271
Separator.Index := GutterSeparatorIndexSpinBox.Value;
273
PreviewEdits[a].RightEdge := StrToIntDef(RightMarginComboBox.Text, 80);
274
if VisibleRightMarginCheckBox.Checked then
275
PreviewEdits[a].Options := PreviewEdits[a].Options - [eoHideRightMargin]
277
PreviewEdits[a].Options := PreviewEdits[a].Options + [eoHideRightMargin];
278
if DisableAntialiasingCheckBox.Checked then
279
PreviewEdits[a].Font.Quality := fqNonAntialiased
281
PreviewEdits[a].Font.Quality := fqDefault;
285
procedure TEditorDisplayOptionsFrame.RightMarginColorLinkClick(Sender: TObject);
287
col: TEditorColorOptionsFrame;
289
col := TEditorColorOptionsFrame(FDialog.FindEditor(TEditorColorOptionsFrame));
290
if col = nil then exit;
291
FDialog.OpenEditor(TEditorColorOptionsFrame);
292
col.SelectAhaColor(ahaRightMargin);
295
procedure TEditorDisplayOptionsFrame.RightMarginColorLinkMouseEnter(Sender: TObject);
297
(Sender as TLabel).Font.Underline := True;
298
(Sender as TLabel).Font.Color := clRed;
301
procedure TEditorDisplayOptionsFrame.RightMarginColorLinkMouseLeave(Sender: TObject);
303
(Sender as TLabel).Font.Underline := False;
304
(Sender as TLabel).Font.Color := clBlue;
307
procedure TEditorDisplayOptionsFrame.ShowLineNumbersCheckBoxClick(Sender: TObject);
309
ShowOnlyLineNumbersMultiplesOfSpinEdit.Enabled := ShowLineNumbersCheckBox.Checked;
310
ShowOnlyLineNumbersMultiplesOfLabel.Enabled := ShowLineNumbersCheckBox.Checked;
313
function TEditorDisplayOptionsFrame.GeneralPage: TEditorGeneralOptionsFrame; inline;
315
Result := TEditorGeneralOptionsFrame(FDialog.FindEditor(TEditorGeneralOptionsFrame));
318
procedure TEditorDisplayOptionsFrame.SetEditorFontSizeSpinEditValue(FontSize: Integer);
320
FUpdatingFontSizeRange := True;
322
EditorFontSizeSpinEdit.MinValue := -EditorFontSizeSpinEdit.MaxValue
324
EditorFontSizeSpinEdit.MinValue := EditorOptionsMinimumFontSize;
325
FUpdatingFontSizeRange := False;
326
EditorFontSizeSpinEdit.Value := FontSize;
329
function TEditorDisplayOptionsFrame.GetTitle: String;
331
Result := dlgEdDisplay;
334
procedure TEditorDisplayOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
336
// Prevent the caret from moving
337
DisplayPreview.RegisterMouseActionSearchHandler(@DoSynEditMouse);
339
FUpdatingFontSizeRange := False;
341
MarginAndGutterGroupBox.Caption := dlgMarginGutter;
342
VisibleRightMarginCheckBox.Caption := dlgVisibleRightMargin;
343
VisibleGutterCheckBox.Caption := dlgVisibleGutter;
344
ShowLineNumbersCheckBox.Caption := dlgShowLineNumbers;
345
ShowOnlyLineNumbersMultiplesOfLabel.Caption := lisEveryNThLineNumber;
346
GutterSeparatorIndexLabel.Caption := dlgGutterSeparatorIndex;
347
RightMarginLabel.Caption := dlgRightMargin;
348
EditorFontGroupBox.Caption := dlgDefaultEditorFont;
349
EditorFontSizeLabel.Caption := dlgEditorFontSize;
350
ExtraCharSpacingLabel.Caption := dlgExtraCharSpacing;
351
ExtraLineSpacingLabel.Caption := dlgExtraLineSpacing;
352
DisableAntialiasingCheckBox.Caption := dlgDisableAntialiasing;
353
RightMarginColorLink.Caption := dlgColorLink;
354
chkShowOverview.Caption := lisShowOverviewGutter;
355
chkTopInfoView.Caption := lisTopInfoView;
358
AddPreviewEdit(DisplayPreview);
360
with TSynGutterSeparator.Create(DisplayPreview.RightGutter.Parts) do
361
Name := 'DPSynGutterSeparatorR2';
362
with TSynGutterLineOverview.Create(DisplayPreview.RightGutter.Parts) do begin
363
Name := 'DPSynGutterLineOverview1';
364
with TIDESynGutterLOvProviderIDEMarks.Create(Providers) do
366
with TSynGutterLOvProviderModifiedLines.Create(Providers) do
368
with TSynGutterLOvProviderCurrentPage.Create(Providers) do
370
with TIDESynGutterLOvProviderPascal.Create(Providers) do
373
with TSynGutterSeparator.Create(DisplayPreview.RightGutter.Parts) do begin
374
Name := 'DPSynGutterSeparatorR3';
382
procedure TEditorDisplayOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
384
with AOptions as TEditorOptions do
386
// init the spin-edit first, since it does not trigger on change,
387
// but is copied when checkboxes are initalized
388
ShowOnlyLineNumbersMultiplesOfSpinEdit.Value := ShowOnlyLineNumbersMultiplesOf;
389
GutterSeparatorIndexSpinBox.Value := GutterSeparatorIndex;
390
VisibleRightMarginCheckBox.Checked := VisibleRightMargin;
391
VisibleGutterCheckBox.Checked := VisibleGutter;
392
ShowLineNumbersCheckBox.Checked := ShowLineNumbers;
393
VisibleRightMarginCheckBox.Checked := VisibleRightMargin;
394
SetComboBoxText(RightMarginComboBox, IntToStr(RightMargin),cstCaseInsensitive);
395
SetComboBoxText(EditorFontComboBox, EditorFont,cstCaseInsensitive);
396
SetEditorFontSizeSpinEditValue(EditorFontSize);
397
SetComboBoxText(ExtraCharSpacingComboBox, IntToStr(ExtraCharSpacing),cstCaseInsensitive);
398
SetComboBoxText(ExtraLineSpacingComboBox, IntToStr(ExtraLineSpacing),cstCaseInsensitive);
399
DisableAntialiasingCheckBox.Checked := DisableAntialiasing;
400
chkShowOverview.Checked := ShowOverviewGutter;
401
chkTopInfoView.Checked := TopInfoView;
404
ShowOnlyLineNumbersMultiplesOfLabel.Enabled := ShowLineNumbersCheckBox.Checked;
405
ShowOnlyLineNumbersMultiplesOfSpinEdit.Enabled := ShowLineNumbersCheckBox.Checked;
408
procedure TEditorDisplayOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
410
with AOptions as TEditorOptions do
412
VisibleRightMargin := VisibleRightMarginCheckBox.Checked;
413
VisibleGutter := VisibleGutterCheckBox.Checked;
414
ShowLineNumbers := ShowLineNumbersCheckBox.Checked;
415
ShowOnlyLineNumbersMultiplesOf := ShowOnlyLineNumbersMultiplesOfSpinEdit.Value;
416
GutterSeparatorIndex := GutterSeparatorIndexSpinBox.Value;
417
VisibleRightMargin := VisibleRightMarginCheckBox.Checked;
418
RightMargin := StrToIntDef(RightMarginComboBox.Text, 80);
419
EditorFont := EditorFontComboBox.Text;
420
EditorFontSize := EditorFontSizeSpinEdit.Value;
421
ExtraCharSpacing := StrToIntDef(ExtraCharSpacingComboBox.Text, ExtraCharSpacing);
422
ExtraLineSpacing := StrToIntDef(ExtraLineSpacingComboBox.Text, ExtraLineSpacing);
423
DisableAntialiasing := DisableAntialiasingCheckBox.Checked;
424
ShowOverviewGutter := chkShowOverview.Checked;
425
TopInfoView := chkTopInfoView.Checked;
429
class function TEditorDisplayOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
431
Result := TEditorOptions;
435
RegisterIDEOptionsEditor(GroupEditor, TEditorDisplayOptionsFrame, EdtOptionsDisplay);