lazarus/ide/frames/editor_mouseaction_options.pas
2010-01-14 10:17:35 +00:00

295 lines
11 KiB
ObjectPascal

{
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
***************************************************************************
}
unit editor_mouseaction_options;
{$mode objfpc}{$H+}
interface
uses
EditorOptions, LazarusIDEStrConsts, IDEOptionsIntf, SynEdit,
StdCtrls, ExtCtrls, Classes, LCLProc, editor_mouseaction_options_advanced;
type
{ TEditorMouseOptionsFrame }
TEditorMouseOptionsFrame = class(TAbstractIDEOptionsEditor)
HideMouseCheckBox: TCheckBox;
DiffLabel: TLabel;
GenericDividerLeft: TBevel;
GenericDividerLabel: TLabel;
GenericDividerRight: TBevel;
TextDoubleSelLine: TCheckBox;
CtrLLeftLabel: TLabel;
MiddleBtnLabel: TLabel;
PanelTextCtrlLeft: TPanel;
CtrlLeftRadio1: TRadioButton;
CtrlLeftRadio2: TRadioButton;
CtrlLeftRadio3: TRadioButton;
RightMoveCaret: TCheckBox;
TextDrag : TCheckBox;
PanelTextCheckBox : TPanel;
TextAltMode: TCheckBox;
WarnLabel: TLabel;
ResetTextButton: TButton;
ResetGutterButton: TButton;
PanelGutter: TPanel;
PanelTextMiddle: TPanel;
TextMidRadio1: TRadioButton;
TextMidRadio2: TRadioButton;
TextMidRadio3: TRadioButton;
GutterDividerLabel: TLabel;
BottomDivider: TBevel;
GutterLeftRadio1: TRadioButton;
GutterLeftRadio2: TRadioButton;
TextDividerLabel: TLabel;
GutterDividerLeft: TBevel;
TextDividerLeft: TBevel;
GutterDividerRight: TBevel;
TextDividerRight: TBevel;
RadioGroup1: TRadioGroup;
TextLeft: TCheckGroup;
TextMiddle: TRadioGroup;
GutterLeft: TRadioGroup;
ResetAllButton: TButton;
procedure ResetGutterButtonClick(Sender: TObject);
procedure ResetAllButtonClick(Sender: TObject);
procedure ResetTextButtonClick(Sender: TObject);
procedure CheckOrRadioChange(Sender: TObject);
private
FDialog: TAbstractOptionsEditorDialog;
FOptions: TAbstractIDEOptions;
FTempMouseSettings: TEditorMouseOptions;
FInClickHandler: Integer;
function IsTextSettingsChanged: Boolean;
function IsGutterSettingsChanged: Boolean;
protected
procedure SetVisible(Value: Boolean); override;
public
//constructor Create(AOwner: TComponent); override;
//destructor Destroy; override;
function GetTitle: String; override;
procedure Setup(ADialog: TAbstractOptionsEditorDialog); override;
procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
end;
implementation
{$R *.lfm}
{ TEditorMouseOptionsFrame }
procedure TEditorMouseOptionsFrame.CheckOrRadioChange(Sender: TObject);
var
MouseDiff: Boolean;
begin
if FInClickHandler > 0 then exit;
Inc(FInClickHandler);
try
MouseDiff := not FTempMouseSettings.IsPresetEqualToMouseActions;
if not MouseDiff then begin
ResetAllButtonClick(nil);
ResetTextButton.Visible := False;
ResetGutterButton.Visible := False;
ResetAllButton.Visible := False;
WarnLabel.Visible := False;
DiffLabel.Visible := False;
exit;
end;
ResetTextButton.Visible := True; // MouseDiff or IsTextSettingsChanged;
ResetGutterButton.Visible := True; // MouseDiff or IsGutterSettingsChanged;
ResetAllButton.Visible := True; // ResetTextButton.Enabled or ResetGutterButton.Enabled;
WarnLabel.Visible := IsTextSettingsChanged or IsGutterSettingsChanged;
DiffLabel.Visible := (not WarnLabel.Visible) and MouseDiff;
finally
Dec(FInClickHandler);
end;
end;
procedure TEditorMouseOptionsFrame.ResetGutterButtonClick(Sender: TObject);
begin
if GutterLeftRadio2.Checked then
FTempMouseSettings.GutterLeft := moglUpClickAndSelect
else
FTempMouseSettings.GutterLeft := moGLDownClick;
FTempMouseSettings.ResetGutterToDefault;
if FDialog.FindEditor(TEditorMouseOptionsAdvFrame) <> nil then
TEditorMouseOptionsAdvFrame(FDialog.FindEditor(TEditorMouseOptionsAdvFrame)).RefreshSettings;
CheckOrRadioChange(nil);
end;
procedure TEditorMouseOptionsFrame.ResetTextButtonClick(Sender: TObject);
begin
FTempMouseSettings.AltColumnMode := TextAltMode.Checked;
FTempMouseSettings.TextDrag := TextDrag.Checked;
FTempMouseSettings.TextRightMoveCaret := RightMoveCaret.Checked;
FTempMouseSettings.TextDoubleSelLine := TextDoubleSelLine.Checked;
if TextMidRadio3.Checked then
FTempMouseSettings.TextMiddleClick := moTMDeclarationJump
else if TextMidRadio2.Checked then
FTempMouseSettings.TextMiddleClick := moTMIgnore
else
FTempMouseSettings.TextMiddleClick := moTMPaste;
if CtrlLeftRadio3.Checked then
FTempMouseSettings.TextCtrlLeftClick := moTCLJumpOrBlock
else if CtrlLeftRadio2.Checked then
FTempMouseSettings.TextCtrlLeftClick := moTCLNone
else
FTempMouseSettings.TextCtrlLeftClick := moTCLJump;
FTempMouseSettings.ResetTextToDefault;
if FDialog.FindEditor(TEditorMouseOptionsAdvFrame) <> nil then
TEditorMouseOptionsAdvFrame(FDialog.FindEditor(TEditorMouseOptionsAdvFrame)).RefreshSettings;
CheckOrRadioChange(nil);
end;
procedure TEditorMouseOptionsFrame.ResetAllButtonClick(Sender: TObject);
begin
ResetTextButtonClick(nil);
ResetGutterButtonClick(nil);
end;
function TEditorMouseOptionsFrame.IsGutterSettingsChanged: Boolean;
begin
Result := not (
( (GutterLeftRadio1.Checked and (FTempMouseSettings.GutterLeft = moGLDownClick)) or
(GutterLeftRadio2.Checked and (FTempMouseSettings.GutterLeft = moglUpClickAndSelect))
)
);
end;
function TEditorMouseOptionsFrame.IsTextSettingsChanged: Boolean;
begin
Result := not (
(FTempMouseSettings.AltColumnMode = TextAltMode.Checked) and
(FTempMouseSettings.TextDrag = TextDrag.Checked) and
(FTempMouseSettings.TextRightMoveCaret = RightMoveCaret.Checked) and
(FTempMouseSettings.TextDoubleSelLine = TextDoubleSelLine.Checked) and
( (TextMidRadio1.Checked and (FTempMouseSettings.TextMiddleClick = moTMPaste)) or
(TextMidRadio2.Checked and (FTempMouseSettings.TextMiddleClick = moTMIgnore)) or
(TextMidRadio3.Checked and (FTempMouseSettings.TextMiddleClick = moTMDeclarationJump))
) and
( (CtrlLeftRadio1.Checked and (FTempMouseSettings.TextCtrlLeftClick = moTCLJump)) or
(CtrlLeftRadio2.Checked and (FTempMouseSettings.TextCtrlLeftClick = moTCLNone)) or
(CtrlLeftRadio3.Checked and (FTempMouseSettings.TextCtrlLeftClick = moTCLJumpOrBlock))
)
);
end;
procedure TEditorMouseOptionsFrame.SetVisible(Value: Boolean);
begin
inherited SetVisible(Value);
if Value and (FTempMouseSettings <> nil) then
CheckOrRadioChange(nil);
end;
function TEditorMouseOptionsFrame.GetTitle: String;
begin
Result := dlgMouseOptions;
end;
procedure TEditorMouseOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
FDialog := ADialog;
GenericDividerLabel.Caption := dlfMouseSimpleGenericSect;
GutterDividerLabel.Caption := dlfMouseSimpleGutterSect;
GutterLeftRadio1.Caption := dlfMouseSimpleGutterLeftDown;
GutterLeftRadio2.Caption := dlfMouseSimpleGutterLeftUp;
TextDividerLabel.Caption := dlfMouseSimpleTextSect;
TextAltMode.Caption := dlfMouseSimpleTextSectAlt;
TextDrag.Caption := dlfMouseSimpleTextSectDrag;
TextDoubleSelLine.Caption := dlfMouseSimpleTextSectDoubleSelLine;
RightMoveCaret.Caption := dlfMouseSimpleRightMoveCaret;
MiddleBtnLabel.Caption := dlfMouseSimpleTextSectMidLabel;
TextMidRadio1.Caption := dlfMouseSimpleTextSectMidPaste;
TextMidRadio2.Caption := dlfMouseSimpleTextSectMidNone;
TextMidRadio3.Caption := dlfMouseSimpleTextSectMidGoto;
CtrLLeftLabel.Caption := dlfMouseSimpleTextSectCtrlLeftLabel;
CtrlLeftRadio1.Caption := dlfMouseSimpleTextSectCtrlLeftRJump;
CtrlLeftRadio2.Caption := dlfMouseSimpleTextSectCtrlLeftRNone;
CtrlLeftRadio3.Caption := dlfMouseSimpleTextSectCtrlLeftRJumpOrBlock;
WarnLabel.Caption := dlfMouseSimpleWarning;
DiffLabel.Caption := dlfMouseSimpleDiff;
ResetAllButton.Caption := dlfMouseResetAll;
ResetGutterButton.Caption := dlfMouseResetGutter;
ResetTextButton.Caption := dlfMouseResetText;
HideMouseCheckBox.Caption := dlgAutoHideCursor;
end;
procedure TEditorMouseOptionsFrame.ReadSettings(
AOptions: TAbstractIDEOptions);
begin
Inc(FInClickHandler);
FOptions := AOptions;
FTempMouseSettings := TEditorOptions(AOptions).TempMouseSettings;
FTempMouseSettings.Read;
case FTempMouseSettings.GutterLeft of
moGLDownClick: GutterLeftRadio1.Checked := True;
moglUpClickAndSelect: GutterLeftRadio2.Checked := True;
end;
TextAltMode.Checked := FTempMouseSettings.AltColumnMode;
TextDrag.Checked := FTempMouseSettings.TextDrag;
RightMoveCaret.Checked := FTempMouseSettings.TextRightMoveCaret;
TextDoubleSelLine.Checked := FTempMouseSettings.TextDoubleSelLine;
case FTempMouseSettings.TextMiddleClick of
moTMPaste: TextMidRadio1.Checked := True;
moTMIgnore: TextMidRadio2.Checked := True;
moTMDeclarationJump: TextMidRadio3.Checked := True;
end;
case FTempMouseSettings.TextCtrlLeftClick of
moTCLJump: CtrlLeftRadio1.Checked := True;
moTCLNone: CtrlLeftRadio2.Checked := True;
moTCLJumpOrBlock: CtrlLeftRadio3.Checked := True;
end;
Dec(FInClickHandler);
CheckOrRadioChange(nil);
HideMouseCheckBox.Checked := eoAutoHideCursor in TEditorOptions(AOptions).SynEditOptions2;
end;
procedure TEditorMouseOptionsFrame.WriteSettings(
AOptions: TAbstractIDEOptions);
begin
FTempMouseSettings.WriteBack;
with TEditorOptions(AOptions) do begin
if HideMouseCheckBox.Checked then
SynEditOptions2 := SynEditOptions2 + [eoAutoHideCursor]
else
SynEditOptions2 := SynEditOptions2 - [eoAutoHideCursor]
end;
end;
class function TEditorMouseOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
Result := TEditorOptions;
end;
initialization
RegisterIDEOptionsEditor(GroupEditor, TEditorMouseOptionsFrame, EdtOptionsMouse);
end.