EditorOptions: user defined mouse schemes

git-svn-id: trunk@25818 -
This commit is contained in:
martin 2010-06-01 19:20:46 +00:00
parent 9e6de7a287
commit 1b77293eb8
6 changed files with 1059 additions and 725 deletions

View File

@ -685,28 +685,48 @@ type
FTextDoubleSelLine: Boolean;
FTextDrag: Boolean;
FTextRightMoveCaret: Boolean;
FUserSchemes: TQuickStringlist;
private
FCustomSavedActions: Boolean;
FOptions: TEditorOptions;
FMainActions, FSelActions: TSynEditMouseActions;
FName: String;
FGutterActions: TSynEditMouseActions;
FGutterActionsFold, FGutterActionsFoldExp, FGutterActionsFoldCol: TSynEditMouseActions;
FGutterActionsLines: TSynEditMouseActions;
FSelectedUserScheme: String;
procedure ClearUserSchemes;
function GetUserSchemeNames(Index: Integer): String;
function GetUserSchemes(Index: String): TEditorMouseOptions;
function GetUserSchemesAtPos(Index: Integer): TEditorMouseOptions;
function GetSelectedUserSchemeIndex: Integer;
procedure SetSelectedUserScheme(const AValue: String);
procedure SetSelectedUserSchemeIndex(const AValue: Integer);
procedure AssignActions(Src: TEditorMouseOptions);
public
constructor Create(AOptions: TEditorOptions);
constructor Create;
destructor Destroy; override;
procedure Reset;
procedure Read;
procedure WriteBack;
procedure ResetGutterToDefault;
procedure ResetTextToDefault;
procedure ResetToUserScheme;
procedure AssignEx(Src: TEditorMouseOptions; WithUserSchemes: Boolean);
procedure Assign(Src: TEditorMouseOptions); reintroduce;
function IsPresetEqualToMouseActions: Boolean;
function CalcCustomSavedActions: Boolean;
function IsPresetEqualToMouseActions: Boolean;
function CalcCustomSavedActions: Boolean;
procedure LoadFromXml(aXMLConfig: TRttiXMLConfig; aPath: String; aOldPath: String = '');
procedure SaveToXml(aXMLConfig: TRttiXMLConfig; aPath: String);
procedure ImportFromXml(aXMLConfig: TRttiXMLConfig; aPath: String);
procedure ExportToXml(aXMLConfig: TRttiXMLConfig; aPath: String);
procedure LoadUserSchemes;
function UserSchemeCount: Integer;
function IndexOfUserScheme(SchemeName: String): Integer;
property Name: String read FName;
property UserSchemes[Index: String]: TEditorMouseOptions read GetUserSchemes;
property UserSchemesAtPos[Index: Integer]: TEditorMouseOptions read GetUserSchemesAtPos;
property UserSchemeNames[Index: Integer]: String read GetUserSchemeNames;
property SelectedUserSchemeIndex: Integer
read GetSelectedUserSchemeIndex write SetSelectedUserSchemeIndex;
property MainActions: TSynEditMouseActions read FMainActions;
property SelActions: TSynEditMouseActions read FSelActions;
@ -725,6 +745,7 @@ type
property TextCtrlLeftClick: TMouseOptTextCtrlLeft read FTextCtrlLeftClick write FTextCtrlLeftClick;
// the flag below is set by CalcCustomSavedActions
property CustomSavedActions: Boolean read FCustomSavedActions write FCustomSavedActions;
property SelectedUserScheme: String read FSelectedUserScheme write SetSelectedUserScheme;
end;
{ TEditorMouseOptionPresets }
@ -945,13 +966,7 @@ type
fKeyMap: TKeyCommandRelationList;
// Mouse Mappings options
fMouseMap: TSynEditMouseActions;
fMouseSelMap: TSynEditMouseActions;
FMouseGutterActions: TSynEditMouseActions;
FMouseGutterActionsFold: TSynEditMouseActions;
FMouseGutterActionsFoldCol: TSynEditMouseActions;
FMouseGutterActionsFoldExp: TSynEditMouseActions;
FMouseGutterActionsLines: TSynEditMouseActions;
FUserMouseSettings: TEditorMouseOptions;
FTempMouseSettings: TEditorMouseOptions;
// Color options
@ -1088,15 +1103,10 @@ type
property KeyMap: TKeyCommandRelationList read fKeyMap;
// Mouse Mappings
property MouseMap: TSynEditMouseActions read fMouseMap;
property MouseSelMap: TSynEditMouseActions read fMouseSelMap;
property MouseGutterActions: TSynEditMouseActions read FMouseGutterActions;
property MouseGutterActionsFold: TSynEditMouseActions read FMouseGutterActionsFold;
property MouseGutterActionsFoldExp: TSynEditMouseActions read FMouseGutterActionsFoldExp;
property MouseGutterActionsFoldCol: TSynEditMouseActions read FMouseGutterActionsFoldCol;
property MouseGutterActionsLines: TSynEditMouseActions read FMouseGutterActionsLines;
// Used by the 2 Mouse-option pages, so they share data
property TempMouseSettings: TEditorMouseOptions read FTempMouseSettings write FTempMouseSettings;
// Current saved config
property UserMouseSettings: TEditorMouseOptions read FUserMouseSettings;
// Used by the 2 Mouse-option pages, so they share data (un-saved)
property TempMouseSettings: TEditorMouseOptions read FTempMouseSettings;
// Color options
property HighlighterList: TEditOptLangList read fHighlighterList;
@ -2396,22 +2406,53 @@ end;
{ TEditorMouseOptions }
constructor TEditorMouseOptions.Create(AOptions: TEditorOptions);
procedure TEditorMouseOptions.ClearUserSchemes;
begin
while FUserSchemes.Count > 0 do begin
FUserSchemes.Objects[0].Free;
FUserSchemes.Delete(0);
end;
end;
function TEditorMouseOptions.GetUserSchemeNames(Index: Integer): String;
begin
Result := TEditorMouseOptions(FUserSchemes.Objects[Index]).Name;
end;
function TEditorMouseOptions.GetUserSchemes(Index: String): TEditorMouseOptions;
var
i: Integer;
begin
i := IndexOfUserScheme(Index);
if i >= 0 then
Result := UserSchemesAtPos[i]
else
Result := nil;
end;
function TEditorMouseOptions.GetUserSchemesAtPos(Index: Integer): TEditorMouseOptions;
begin
Result := TEditorMouseOptions(FUserSchemes.Objects[Index]);
end;
constructor TEditorMouseOptions.Create;
begin
inherited Create;
Reset;
FOptions := AOptions;
FMainActions := TSynEditMouseActions.Create(nil);
FSelActions := TSynEditMouseActions.Create(nil);
FGutterActions := TSynEditMouseActions.Create(nil);
FGutterActionsFold := TSynEditMouseActions.Create(nil);
FMainActions := TSynEditMouseActions.Create(nil);
FSelActions := TSynEditMouseActions.Create(nil);
FGutterActions := TSynEditMouseActions.Create(nil);
FGutterActionsFold := TSynEditMouseActions.Create(nil);
FGutterActionsFoldExp := TSynEditMouseActions.Create(nil);
FGutterActionsFoldCol := TSynEditMouseActions.Create(nil);
FGutterActionsLines := TSynEditMouseActions.Create(nil);
FGutterActionsLines := TSynEditMouseActions.Create(nil);
FUserSchemes := TQuickStringlist.Create;
end;
destructor TEditorMouseOptions.Destroy;
begin
ClearUserSchemes;
FUserSchemes.Free;
FMainActions.Free;
FSelActions.Free;
FGutterActions.Free;
@ -2425,35 +2466,13 @@ end;
procedure TEditorMouseOptions.Reset;
begin
FCustomSavedActions := False;
FGutterLeft := moGLDownClick;
FTextMiddleClick := moTMPaste;
FTextCtrlLeftClick := moTCLJump;
FTextDoubleSelLine := False;
FGutterLeft := moGLDownClick;
FTextMiddleClick := moTMPaste;
FTextCtrlLeftClick := moTCLJump;
FTextDoubleSelLine := False;
FTextRightMoveCaret := False;
FAltColumnMode := True;
FTextDrag := True;
end;
procedure TEditorMouseOptions.Read;
begin
FMainActions.Assign(FOptions.MouseMap);
FSelActions.Assign(FOptions.MouseSelMap);
FGutterActions.Assign(FOptions.MouseGutterActions);
FGutterActionsFold.Assign(FOptions.MouseGutterActionsFold);
FGutterActionsFoldExp.Assign(FOptions.MouseGutterActionsFoldExp);
FGutterActionsFoldCol.Assign(FOptions.MouseGutterActionsFoldCol);
FGutterActionsLines.Assign(FOptions.MouseGutterActionsLines);
end;
procedure TEditorMouseOptions.WriteBack;
begin
FOptions.MouseMap.Assign(FMainActions);
FOptions.MouseSelMap.Assign(FSelActions);
FOptions.MouseGutterActions.Assign(FGutterActions);
FOptions.MouseGutterActionsFold.Assign(FGutterActionsFold);
FOptions.MouseGutterActionsFoldExp.Assign(FGutterActionsFoldExp);
FOptions.MouseGutterActionsFoldCol.Assign(FGutterActionsFoldCol);
FOptions.MouseGutterActionsLines.Assign(FGutterActionsLines);
FAltColumnMode := True;
FTextDrag := True;
end;
procedure TEditorMouseOptions.ResetGutterToDefault;
@ -2571,16 +2590,17 @@ begin
end;
end;
procedure TEditorMouseOptions.Assign(Src: TEditorMouseOptions);
procedure TEditorMouseOptions.ResetToUserScheme;
var
i: LongInt;
begin
FAltColumnMode := Src.AltColumnMode;
FGutterLeft := Src.GutterLeft;
FTextMiddleClick := Src.TextMiddleClick;
FTextCtrlLeftClick := Src.TextCtrlLeftClick;
FTextDoubleSelLine := Src.TextDoubleSelLine;
FTextDrag := Src.TextDrag;
FTextRightMoveCaret := Src.TextRightMoveCaret;
i := SelectedUserSchemeIndex;
if i < 0 then exit;
AssignActions(UserSchemesAtPos[i]);
end;
procedure TEditorMouseOptions.AssignActions(Src: TEditorMouseOptions);
begin
FMainActions.Assign (Src.MainActions);
FSelActions.Assign (Src.SelActions);
FGutterActions.Assign (Src.GutterActions);
@ -2590,14 +2610,52 @@ begin
FGutterActionsLines.Assign (Src.GutterActionsLines);
end;
procedure TEditorMouseOptions.AssignEx(Src: TEditorMouseOptions; WithUserSchemes: Boolean);
var
i: Integer;
begin
FName := Src.FName;
FAltColumnMode := Src.AltColumnMode;
FGutterLeft := Src.GutterLeft;
FTextMiddleClick := Src.TextMiddleClick;
FTextCtrlLeftClick := Src.TextCtrlLeftClick;
FTextDoubleSelLine := Src.TextDoubleSelLine;
FTextDrag := Src.TextDrag;
FTextRightMoveCaret := Src.TextRightMoveCaret;
FSelectedUserScheme := Src.FSelectedUserScheme;
AssignActions(Src);
if WithUserSchemes then begin
ClearUserSchemes;
for i := 0 to Src.FUserSchemes.Count - 1 do begin
FUserSchemes.AddObject(Src.FUserSchemes[i], TEditorMouseOptions.Create);
TEditorMouseOptions(FUserSchemes.Objects[i]).Assign
( TEditorMouseOptions(Src.FUserSchemes.Objects[i]) );
end;
end;
end;
procedure TEditorMouseOptions.Assign(Src: TEditorMouseOptions);
begin
AssignEx(Src, True);
end;
function TEditorMouseOptions.IsPresetEqualToMouseActions: Boolean;
var
Temp: TEditorMouseOptions;
i: Integer;
begin
Temp := TEditorMouseOptions.Create(nil);
Temp.Assign(self);
Temp.ResetTextToDefault;
Temp.ResetGutterToDefault;
i := SelectedUserSchemeIndex;
Temp := TEditorMouseOptions.Create;
Temp.AssignEx(self, i >= 0);
if i >= 0 then begin
Temp.ResetToUserScheme;
end else begin
Temp.ResetTextToDefault;
Temp.ResetGutterToDefault;
end;
Result :=
Temp.MainActions.Equals(self.MainActions) and
Temp.SelActions.Equals (self.SelActions) and
@ -2610,14 +2668,8 @@ begin
end;
function TEditorMouseOptions.CalcCustomSavedActions: Boolean;
var
Temp: TEditorMouseOptions;
begin
Temp := TEditorMouseOptions.Create(FOptions);
Temp.Assign(self);
Temp.Read;
Result := not Temp.IsPresetEqualToMouseActions;
Temp.Free;
Result := not IsPresetEqualToMouseActions;
FCustomSavedActions := Result;
end;
@ -2681,22 +2733,27 @@ begin
CustomSavedActions := False;
aXMLConfig.ReadObject(aPath + 'Default/', Self);
if (FSelectedUserScheme <> '') and (UserSchemes[FSelectedUserScheme] = nil) then
FSelectedUserScheme := '';
if CustomSavedActions then begin
// Load
LoadMouseAct(aPath + 'Main/', FOptions.MouseMap);
LoadMouseAct(aPath + 'MainSelection/', FOptions.MouseSelMap);
LoadMouseAct(aPath + 'Gutter/', FOptions.MouseGutterActions);
LoadMouseAct(aPath + 'GutterFold/', FOptions.MouseGutterActionsFold);
LoadMouseAct(aPath + 'GutterFoldExp/', FOptions.MouseGutterActionsFoldExp);
LoadMouseAct(aPath + 'GutterFoldCol/', FOptions.MouseGutterActionsFoldCol);
LoadMouseAct(aPath + 'GutterLineNum/', FOptions.MouseGutterActionsLines);
LoadMouseAct(aPath + 'Main/', MainActions);
LoadMouseAct(aPath + 'MainSelection/', SelActions);
LoadMouseAct(aPath + 'Gutter/', GutterActions);
LoadMouseAct(aPath + 'GutterFold/', GutterActionsFold);
LoadMouseAct(aPath + 'GutterFoldExp/', GutterActionsFoldExp);
LoadMouseAct(aPath + 'GutterFoldCol/', GutterActionsFoldCol);
LoadMouseAct(aPath + 'GutterLineNum/', GutterActionsLines);
end
else begin
else
if (FSelectedUserScheme <> '') then begin
ResetToUserScheme;
end else begin
ResetTextToDefault;
ResetGutterToDefault;
WriteBack;
end;
end;
procedure TEditorMouseOptions.SaveToXml(aXMLConfig: TRttiXMLConfig; aPath: String);
@ -2724,30 +2781,29 @@ procedure TEditorMouseOptions.SaveToXml(aXMLConfig: TRttiXMLConfig; aPath: Strin
var
DefMouseSettings: TEditorMouseOptions;
begin
DefMouseSettings := TEditorMouseOptions.Create(FOptions);
DefMouseSettings := TEditorMouseOptions.Create;
CalcCustomSavedActions;
aXMLConfig.WriteObject('EditorOptions/Mouse/Default/', Self, DefMouseSettings);
aXMLConfig.WriteObject(aPath + 'Default/', Self, DefMouseSettings);
DefMouseSettings.Free;
if CustomSavedActions then begin
// Save full settings / based on empty
SaveMouseAct('EditorOptions/Mouse/Main/', FOptions.MouseMap);
SaveMouseAct('EditorOptions/Mouse/MainSelection/', FOptions.MouseSelMap);
SaveMouseAct('EditorOptions/Mouse/Gutter/', FOptions.MouseGutterActions);
SaveMouseAct('EditorOptions/Mouse/GutterFold/', FOptions.MouseGutterActionsFold);
SaveMouseAct('EditorOptions/Mouse/GutterFoldExp/', FOptions.MouseGutterActionsFoldExp);
SaveMouseAct('EditorOptions/Mouse/GutterFoldCol/', FOptions.MouseGutterActionsFoldCol);
SaveMouseAct('EditorOptions/Mouse/GutterLineNum/', FOptions.MouseGutterActionsLines);
SaveMouseAct(aPath + 'Main/', MainActions);
SaveMouseAct(aPath + 'MainSelection/', SelActions);
SaveMouseAct(aPath + 'Gutter/', GutterActions);
SaveMouseAct(aPath + 'GutterFold/', GutterActionsFold);
SaveMouseAct(aPath + 'GutterFoldExp/', GutterActionsFoldExp);
SaveMouseAct(aPath + 'GutterFoldCol/', GutterActionsFoldCol);
SaveMouseAct(aPath + 'GutterLineNum/', GutterActionsLines);
end else begin
// clear unused entries
aXMLConfig.DeletePath('EditorOptions/Mouse/Main');
aXMLConfig.DeletePath('EditorOptions/Mouse/MainSelection');
aXMLConfig.DeletePath('EditorOptions/Mouse/Gutter');
aXMLConfig.DeletePath('EditorOptions/Mouse/GutterFold');
aXMLConfig.DeletePath('EditorOptions/Mouse/GutterFoldExp');
aXMLConfig.DeletePath('EditorOptions/Mouse/GutterFoldCol');
aXMLConfig.DeletePath('EditorOptions/Mouse/GutterLineNum');
aXMLConfig.DeletePath(aPath + 'Main');
aXMLConfig.DeletePath(aPath + 'MainSelection');
aXMLConfig.DeletePath(aPath + 'Gutter');
aXMLConfig.DeletePath(aPath + 'GutterFold');
aXMLConfig.DeletePath(aPath + 'GutterFoldExp');
aXMLConfig.DeletePath(aPath + 'GutterFoldCol');
aXMLConfig.DeletePath(aPath + 'GutterLineNum');
end;
end;
procedure TEditorMouseOptions.ImportFromXml(aXMLConfig: TRttiXMLConfig; aPath: String);
@ -2821,6 +2877,72 @@ begin
MAct.Free;
end;
procedure TEditorMouseOptions.LoadUserSchemes;
var
i, j, k, c: Integer;
FileList: TStringList;
XMLConfig: TRttiXMLConfig;
n: String;
begin
ClearUserSchemes;
if DirectoryExistsUTF8(UserSchemeDirectory(False)) then begin
FileList := FindAllFiles(UserSchemeDirectory(False), '*.xml', False);
for i := 0 to FileList.Count - 1 do begin
XMLConfig := nil;
try
XMLConfig := TRttiXMLConfig.Create(FileList[i]);
c := XMLConfig.GetValue('Lazarus/MouseSchemes/Names/Count', 0);
for j := 0 to c-1 do begin
n := XMLConfig.GetValue('Lazarus/MouseSchemes/Names/Item'+IntToStr(j+1)+'/Value', '');
if n <> '' then begin
k := FUserSchemes.AddObject(UTF8UpperCase(n), TEditorMouseOptions.Create);
TEditorMouseOptions(FUserSchemes.Objects[k]).FName := n;
TEditorMouseOptions(FUserSchemes.Objects[k]).ImportFromXml
(XMLConfig, 'Lazarus/MouseSchemes/Scheme' + n + '/');
end;
end;
except
ShowMessage(Format(dlgUserSchemeError, [FileList[i]]));
end;
XMLConfig.Free;
end;
FileList.Free;
end;
end;
function TEditorMouseOptions.UserSchemeCount: Integer;
begin
Result := FUserSchemes.Count;
end;
function TEditorMouseOptions.IndexOfUserScheme(SchemeName: String): Integer;
begin
Result := FUserSchemes.IndexOf(UTF8UpperCase(SchemeName));
end;
function TEditorMouseOptions.GetSelectedUserSchemeIndex: Integer;
begin
if FSelectedUserScheme = '' then
Result := -1
else
Result := IndexOfUserScheme(FSelectedUserScheme);
end;
procedure TEditorMouseOptions.SetSelectedUserScheme(const AValue: String);
begin
if FSelectedUserScheme = AValue then exit;
FSelectedUserScheme := AValue;
ResetToUserScheme;
end;
procedure TEditorMouseOptions.SetSelectedUserSchemeIndex(const AValue: Integer);
begin
if AValue < 0 then
SelectedUserScheme := ''
else
SelectedUserScheme := TEditorMouseOptions(FUserSchemes.Objects[AValue]).Name;
end;
{ TEditorMouseOptionPresets }
constructor TEditorMouseOptionPresets.Create;
@ -3030,7 +3152,6 @@ begin
inherited Create;
InitLocale;
FTempMouseSettings := TEditorMouseOptions.Create(self);
ConfFileName := SetDirSeparators(GetPrimaryConfigPath + '/' +
EditOptsConfFileName);
CopySecondaryConfigFile(EditOptsConfFileName);
@ -3076,20 +3197,10 @@ begin
fKeyMap := TKeyCommandRelationList.Create;
// Mouse Mappings
fMouseMap := TSynEditMouseTextActions.Create(nil);
fMouseMap.ResetDefaults;
fMouseSelMap := TSynEditMouseSelActions.Create(nil);
fMouseSelMap.ResetDefaults;
FMouseGutterActions := TSynEditMouseActionsGutter.Create(nil);
FMouseGutterActions.ResetDefaults;
FMouseGutterActionsFold := TSynEditMouseActionsGutterFold.Create(nil);
FMouseGutterActionsFold.ResetDefaults;
FMouseGutterActionsFoldCol := TSynEditMouseActionsGutterFoldCollapsed.Create(nil);
FMouseGutterActionsFoldCol.ResetDefaults;
FMouseGutterActionsFoldExp := TSynEditMouseActionsGutterFoldExpanded.Create(nil);
FMouseGutterActionsFoldExp.ResetDefaults;
FMouseGutterActionsLines := TSynEditMouseActionsLineNum.Create(nil);
FMouseGutterActionsLines.ResetDefaults;
FUserMouseSettings := TEditorMouseOptions.Create;
FTempMouseSettings := TEditorMouseOptions.Create;
FUserMouseSettings.LoadUserSchemes;
// Color options
fHighlighterList := HighlighterListSingleton;
FUserColorSchemeSettings := TColorSchemeFactory.Create;
@ -3132,16 +3243,10 @@ end;
destructor TEditorOptions.Destroy;
begin
FreeAndNil(FUserColorSchemeSettings);
fMouseMap.Free;
fMouseSelMap.Free;
FMouseGutterActions.Free;
FMouseGutterActionsFold.Free;
FMouseGutterActionsFoldCol.Free;
FMouseGutterActionsFoldExp.Free;
FMouseGutterActionsLines.Free;
fKeyMap.Free;
FreeAndNil(FMultiWinEditAccessOrder);
XMLConfig.Free;
FUserMouseSettings.Free;
FTempMouseSettings.Free;
inherited Destroy;
end;
@ -3339,7 +3444,7 @@ begin
XMLConfig.GetValue(
'EditorOptions/CodeFolding/UseCodeFolding', True);
FTempMouseSettings.LoadFromXml(XMLConfig, 'EditorOptions/Mouse/',
FUserMouseSettings.LoadFromXml(XMLConfig, 'EditorOptions/Mouse/',
'EditorOptions/General/Editor/');
FMultiWinEditAccessOrder.LoadFromXMLConfig(XMLConfig, 'EditorOptions/MultiWin/');
@ -3511,7 +3616,7 @@ begin
XMLConfig.SetDeleteValue('EditorOptions/CodeFolding/UseCodeFolding',
FUseCodeFolding, True);
FTempMouseSettings.SaveToXml(XMLConfig, 'EditorOptions/Mouse/');
FUserMouseSettings.SaveToXml(XMLConfig, 'EditorOptions/Mouse/');
FMultiWinEditAccessOrder.SaveToXMLConfig(XMLConfig, 'EditorOptions/MultiWin/');
UserColorSchemeGroup.SaveToXml(XMLConfig, 'EditorOptions/Color/', ColorSchemeFactory);
@ -4046,16 +4151,16 @@ begin
end;
end;
ASynEdit.MouseActions.Assign(MouseMap);
ASynEdit.MouseSelActions.Assign(MouseSelMap);
ASynEdit.Gutter.MouseActions.Assign(MouseGutterActions);
ASynEdit.MouseActions.Assign(FUserMouseSettings.MainActions);
ASynEdit.MouseSelActions.Assign(FUserMouseSettings.SelActions);
ASynEdit.Gutter.MouseActions.Assign(FUserMouseSettings.GutterActions);
if ASynEdit.Gutter.CodeFoldPart <> nil then begin
ASynEdit.Gutter.CodeFoldPart.MouseActions.Assign(MouseGutterActionsFold);
ASynEdit.Gutter.CodeFoldPart.MouseActionsCollapsed.Assign(MouseGutterActionsFoldCol);
ASynEdit.Gutter.CodeFoldPart.MouseActionsExpanded.Assign(MouseGutterActionsFoldExp);
ASynEdit.Gutter.CodeFoldPart.MouseActions.Assign(FUserMouseSettings.GutterActionsFold);
ASynEdit.Gutter.CodeFoldPart.MouseActionsCollapsed.Assign(FUserMouseSettings.GutterActionsFoldCol);
ASynEdit.Gutter.CodeFoldPart.MouseActionsExpanded.Assign(FUserMouseSettings.GutterActionsFoldExp);
end;
if ASynEdit.Gutter.LineNumberPart <> nil then begin
ASynEdit.Gutter.LineNumberPart.MouseActions.Assign(MouseGutterActionsLines);
ASynEdit.Gutter.LineNumberPart.MouseActions.Assign(FUserMouseSettings.GutterActionsLines);
end;
end;

File diff suppressed because it is too large Load Diff

View File

@ -25,63 +25,78 @@ unit editor_mouseaction_options;
interface
uses
EditorOptions, LazarusIDEStrConsts, IDEOptionsIntf, SynEdit,
StdCtrls, ExtCtrls, Classes, LCLProc, editor_mouseaction_options_advanced;
math, EditorOptions, LazarusIDEStrConsts, IDEOptionsIntf, SynEdit,
StdCtrls, ExtCtrls, Classes, LCLProc, editor_mouseaction_options_advanced, Controls, Forms;
type
{ TEditorMouseOptionsFrame }
TEditorMouseOptionsFrame = class(TAbstractIDEOptionsEditor)
HideMouseCheckBox: TCheckBox;
DiffLabel: TLabel;
GenericDividerLeft: TBevel;
GenericDividerLabel: TLabel;
GenericDividerRight: TBevel;
TextDoubleSelLine: TCheckBox;
BottomDivider: TBevel;
chkPredefinedScheme: 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;
DiffLabel: TLabel;
dropUserSchemes: TComboBox;
GenericDividerLabel: TLabel;
GenericDividerLeft: TBevel;
GenericDividerRight: TBevel;
GutterDividerLabel: TLabel;
GutterDividerLeft: TBevel;
GutterDividerRight: TBevel;
GutterLeftRadio1: TRadioButton;
GutterLeftRadio2: TRadioButton;
HideMouseCheckBox: TCheckBox;
MiddleBtnLabel: TLabel;
pnlBottom: TPanel;
PanelGutter: TPanel;
PanelTextCheckBox: TPanel;
PanelTextCtrlLeft: TPanel;
PanelTextMiddle: TPanel;
pnlAllGutter: TPanel;
pnlAllText: TPanel;
pnlUserSchemes: TPanel;
ResetAllButton: TButton;
ResetGutterButton: TButton;
ResetTextButton: TButton;
RightMoveCaret: TCheckBox;
ScrollBox1: TScrollBox;
TextAltMode: TCheckBox;
TextDividerLabel: TLabel;
TextDividerLeft: TBevel;
TextDividerRight: TBevel;
TextDoubleSelLine: TCheckBox;
TextDrag: TCheckBox;
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);
WarnLabel: TLabel;
procedure CheckOrRadioChange(Sender: TObject);
procedure chkPredefinedSchemeChange(Sender: TObject);
procedure dropUserSchemesChange(Sender: TObject);
procedure dropUserSchemesKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ResetGutterButtonClick(Sender: TObject);
procedure ResetTextButtonClick(Sender: TObject);
procedure ResetAllButtonClick(Sender: TObject);
private
FDialog: TAbstractOptionsEditorDialog;
FOptions: TAbstractIDEOptions;
FTempMouseSettings: TEditorMouseOptions;
FInClickHandler: Integer;
function IsTextSettingsChanged: Boolean;
function IsGutterSettingsChanged: Boolean;
procedure UpdateButtons;
function IsUserSchemeChanged: Boolean;
function IsTextSettingsChanged: Boolean;
function IsGutterSettingsChanged: Boolean;
procedure SaveUserScheme;
procedure SaveTextSettings;
procedure SaveGutterSettings;
protected
procedure SetVisible(Value: Boolean); override;
public
@ -101,45 +116,142 @@ implementation
{ 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;
if FTempMouseSettings.IsPresetEqualToMouseActions then begin
// write settings to conf (and reset conf to settings)
SaveGutterSettings;
SaveTextSettings;
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;
UpdateButtons;
finally
Dec(FInClickHandler);
end;
end;
procedure TEditorMouseOptionsFrame.UpdateButtons;
begin
if FTempMouseSettings.IsPresetEqualToMouseActions then begin
ResetTextButton.Visible := False;
ResetGutterButton.Visible := False;
ResetAllButton.Visible := False;
WarnLabel.Visible := False;
DiffLabel.Visible := False;
BottomDivider.Visible := False;
end
else begin
ResetTextButton.Visible := (FTempMouseSettings.SelectedUserScheme = '') and IsTextSettingsChanged;
ResetGutterButton.Visible := (FTempMouseSettings.SelectedUserScheme = '') and IsGutterSettingsChanged;
ResetAllButton.Visible := True; // ResetTextButton.Enabled or ResetGutterButton.Enabled;
WarnLabel.Visible := (IsTextSettingsChanged or IsGutterSettingsChanged) and
( (FTempMouseSettings.SelectedUserScheme = '') or
IsUserSchemeChanged );
DiffLabel.Visible := (not WarnLabel.Visible);
BottomDivider.Visible := True;
end;
end;
procedure TEditorMouseOptionsFrame.dropUserSchemesChange(Sender: TObject);
begin
if Sender <> nil then begin;
chkPredefinedScheme.Checked := dropUserSchemes.ItemIndex > 0;
if dropUserSchemes.ItemIndex > 0 then
dropUserSchemes.tag := dropUserSchemes.ItemIndex;
end;
pnlAllGutter.Enabled := dropUserSchemes.ItemIndex = 0;
pnlAllText.Enabled := dropUserSchemes.ItemIndex = 0;
if FTempMouseSettings.IsPresetEqualToMouseActions then
SaveUserScheme;
UpdateButtons;
end;
procedure TEditorMouseOptionsFrame.dropUserSchemesKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
dropUserSchemesChange(Sender);
end;
procedure TEditorMouseOptionsFrame.chkPredefinedSchemeChange(Sender: TObject);
begin
if chkPredefinedScheme.Checked then
dropUserSchemes.ItemIndex := Max(dropUserSchemes.Tag, 1)
else
dropUserSchemes.ItemIndex := 0;
dropUserSchemesChange(nil);
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);
SaveGutterSettings;
UpdateButtons;
end;
procedure TEditorMouseOptionsFrame.ResetTextButtonClick(Sender: TObject);
begin
SaveTextSettings;
UpdateButtons;
end;
procedure TEditorMouseOptionsFrame.ResetAllButtonClick(Sender: TObject);
begin
SaveGutterSettings;
SaveTextSettings;
SaveUserScheme; // must be last
UpdateButtons;
end;
function TEditorMouseOptionsFrame.IsUserSchemeChanged: Boolean;
begin
Result := FTempMouseSettings.SelectedUserSchemeIndex <>
PtrInt(dropUserSchemes.Items.Objects[dropUserSchemes.ItemIndex]);
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;
function TEditorMouseOptionsFrame.IsGutterSettingsChanged: Boolean;
begin
Result := not (
( (GutterLeftRadio1.Checked and (FTempMouseSettings.GutterLeft = moGLDownClick)) or
(GutterLeftRadio2.Checked and (FTempMouseSettings.GutterLeft = moglUpClickAndSelect))
)
);
end;
procedure TEditorMouseOptionsFrame.SaveUserScheme;
var
i: Integer;
begin
i := PtrInt(dropUserSchemes.Items.Objects[dropUserSchemes.ItemIndex]);
FTempMouseSettings.SelectedUserSchemeIndex := i;
if i >= 0 then
FTempMouseSettings.ResetToUserScheme
else begin
FTempMouseSettings.ResetTextToDefault;
FTempMouseSettings.ResetGutterToDefault;
end;
if FDialog.FindEditor(TEditorMouseOptionsAdvFrame) <> nil then
TEditorMouseOptionsAdvFrame(FDialog.FindEditor(TEditorMouseOptionsAdvFrame)).RefreshSettings;
end;
procedure TEditorMouseOptionsFrame.SaveTextSettings;
begin
FTempMouseSettings.AltColumnMode := TextAltMode.Checked;
FTempMouseSettings.TextDrag := TextDrag.Checked;
@ -163,48 +275,24 @@ begin
FTempMouseSettings.ResetTextToDefault;
if FDialog.FindEditor(TEditorMouseOptionsAdvFrame) <> nil then
TEditorMouseOptionsAdvFrame(FDialog.FindEditor(TEditorMouseOptionsAdvFrame)).RefreshSettings;
CheckOrRadioChange(nil);
end;
procedure TEditorMouseOptionsFrame.ResetAllButtonClick(Sender: TObject);
procedure TEditorMouseOptionsFrame.SaveGutterSettings;
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))
)
);
if GutterLeftRadio2.Checked then
FTempMouseSettings.GutterLeft := moglUpClickAndSelect
else
FTempMouseSettings.GutterLeft := moGLDownClick;
FTempMouseSettings.ResetGutterToDefault;
if FDialog.FindEditor(TEditorMouseOptionsAdvFrame) <> nil then
TEditorMouseOptionsAdvFrame(FDialog.FindEditor(TEditorMouseOptionsAdvFrame)).RefreshSettings;
end;
procedure TEditorMouseOptionsFrame.SetVisible(Value: Boolean);
begin
inherited SetVisible(Value);
if Value and (FTempMouseSettings <> nil) then
CheckOrRadioChange(nil);
UpdateButtons;
end;
function TEditorMouseOptionsFrame.GetTitle: String;
@ -215,6 +303,7 @@ end;
procedure TEditorMouseOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
FDialog := ADialog;
chkPredefinedScheme.Caption := dlfMousePredefinedScheme;
GenericDividerLabel.Caption := dlfMouseSimpleGenericSect;
GutterDividerLabel.Caption := dlfMouseSimpleGutterSect;
GutterLeftRadio1.Caption := dlfMouseSimpleGutterLeftDown;
@ -242,11 +331,27 @@ end;
procedure TEditorMouseOptionsFrame.ReadSettings(
AOptions: TAbstractIDEOptions);
var
i: Integer;
begin
Inc(FInClickHandler);
FOptions := AOptions;
FTempMouseSettings := TEditorOptions(AOptions).TempMouseSettings;
FTempMouseSettings.Read;
FTempMouseSettings.Assign(TEditorOptions(AOptions).UserMouseSettings);
pnlUserSchemes.Visible := FTempMouseSettings.UserSchemeCount > 0;
dropUserSchemes.Clear;
for i := 0 to FTempMouseSettings.UserSchemeCount - 1 do begin
dropUserSchemes.Items.AddObject(FTempMouseSettings.UserSchemeNames[i],
TObject(PtrUInt(i)) );
end;
dropUserSchemes.Sorted := True;
dropUserSchemes.Sorted := False;
dropUserSchemes.Items.InsertObject(0, dlfNoPredefinedScheme, TObject(PtrUInt(-1)));
dropUserSchemes.ItemIndex := dropUserSchemes.Items.IndexOfObject
( TObject(PtrUInt(FTempMouseSettings.SelectedUserSchemeIndex)) );
dropUserSchemesChange(Self);
case FTempMouseSettings.GutterLeft of
moGLDownClick: GutterLeftRadio1.Checked := True;
moglUpClickAndSelect: GutterLeftRadio2.Checked := True;
@ -266,7 +371,7 @@ begin
moTCLJumpOrBlock: CtrlLeftRadio3.Checked := True;
end;
Dec(FInClickHandler);
CheckOrRadioChange(nil);
UpdateButtons;
HideMouseCheckBox.Checked := eoAutoHideCursor in TEditorOptions(AOptions).SynEditOptions2;
end;
@ -274,7 +379,7 @@ end;
procedure TEditorMouseOptionsFrame.WriteSettings(
AOptions: TAbstractIDEOptions);
begin
FTempMouseSettings.WriteBack;
TEditorOptions(AOptions).UserMouseSettings.Assign(FTempMouseSettings);
with TEditorOptions(AOptions) do begin
if HideMouseCheckBox.Checked then
SynEditOptions2 := SynEditOptions2 + [eoAutoHideCursor]

View File

@ -4,7 +4,6 @@ inherited EditorMouseOptionsAdvFrame: TEditorMouseOptionsAdvFrame
Anchors = [akTop]
ClientHeight = 420
ClientWidth = 610
TabOrder = 0
Visible = False
DesignLeft = 246
DesignTop = 209
@ -41,13 +40,13 @@ inherited EditorMouseOptionsAdvFrame: TEditorMouseOptionsAdvFrame
Align = alLeft
AutoExpand = True
Constraints.MinWidth = 50
DefaultItemHeight = 15
DefaultItemHeight = 17
ReadOnly = True
ShowButtons = False
ShowRoot = False
TabOrder = 1
OnChange = ContextTreeChange
Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowLines, tvoToolTips, tvoThemedDraw, tvoNoDoubleClickExpand]
Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowLines, tvoToolTips, tvoNoDoubleClickExpand, tvoThemedDraw]
end
object Splitter1: TSplitter[2]
Left = 130
@ -74,32 +73,32 @@ inherited EditorMouseOptionsAdvFrame: TEditorMouseOptionsAdvFrame
OnClick = BtnImportClick
end
object BtnExport: TToolButton
Left = 57
Left = 63
Top = 0
Caption = 'BtnExport'
OnClick = BtnExportClick
end
object ToolButton3: TToolButton
Left = 113
Left = 122
Top = 0
Width = 3
Width = 4
Caption = 'ToolButton3'
Style = tbsDivider
end
object UpdateButton: TToolButton
Left = 116
Left = 126
Top = 0
Caption = 'UpdateButton'
OnClick = UpdateButtonClick
end
object AddNewButton: TToolButton
Left = 191
Left = 208
Top = 0
Caption = 'AddNewButton'
OnClick = AddNewButtonClick
end
object DelButton: TToolButton
Left = 271
Left = 298
Top = 0
Caption = 'DelButton'
OnClick = DelButtonClick
@ -116,19 +115,19 @@ inherited EditorMouseOptionsAdvFrame: TEditorMouseOptionsAdvFrame
TabOrder = 4
object Panel1: TPanel
Left = 1
Height = 17
Height = 20
Top = 1
Width = 608
Align = alTop
AutoSize = True
ClientHeight = 17
ClientHeight = 20
ClientWidth = 608
TabOrder = 0
object OtherActionLabel: TLabel
Left = 1
Height = 15
Height = 18
Top = 1
Width = 84
Width = 94
Align = alLeft
Caption = 'OtherActionLabel'
ParentColor = False
@ -138,10 +137,10 @@ inherited EditorMouseOptionsAdvFrame: TEditorMouseOptionsAdvFrame
object OtherActToggleBox: TToggleBox
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 496
Height = 17
Left = 483
Height = 19
Top = 0
Width = 112
Width = 124
Anchors = [akTop, akRight]
AutoSize = True
Caption = 'OtherActToggleBox'
@ -153,8 +152,8 @@ inherited EditorMouseOptionsAdvFrame: TEditorMouseOptionsAdvFrame
end
object OtherActionGrid: TStringGrid
Left = 1
Height = 107
Top = 18
Height = 104
Top = 21
Width = 608
Align = alClient
AutoEdit = False

View File

@ -711,7 +711,8 @@ procedure TEditorMouseOptionsAdvFrame.ReadSettings(
AOptions: TAbstractIDEOptions);
begin
FTempMouseSettings := TEditorOptions(AOptions).TempMouseSettings;
FTempMouseSettings.Read;
FTempMouseSettings.Assign(TEditorOptions(AOptions).UserMouseSettings);
with AOptions as TEditorOptions do
begin
FKeyMap := KeyMap;
@ -723,7 +724,7 @@ end;
procedure TEditorMouseOptionsAdvFrame.WriteSettings(
AOptions: TAbstractIDEOptions);
begin
FTempMouseSettings.WriteBack;
TEditorOptions(AOptions).UserMouseSettings.Assign(FTempMouseSettings);
end;
procedure TEditorMouseOptionsAdvFrame.RefreshSettings;

View File

@ -1257,6 +1257,8 @@ resourcestring
dlgUseSyntaxHighlight = 'Use syntax highlight';
dlgUseCodeFolding = 'Code folding';
dlgCodeFoldingMouse = 'Mouse';
dlfMousePredefinedScheme = 'Use predefined scheme';
dlfNoPredefinedScheme = '< None >';
dlfMouseSimpleGenericSect = 'General';
dlfMouseSimpleGutterSect = 'Gutter';
dlfMouseSimpleGutterLeftDown = 'Standard, All actions (breakpoint, fold) on Mouse down';