mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 15:49:32 +01:00 
			
		
		
		
	EditorOptions, refactor mouse load/save
git-svn-id: trunk@25811 -
This commit is contained in:
		
							parent
							
								
									9682e60eea
								
							
						
					
					
						commit
						509ece6c49
					
				@ -703,6 +703,10 @@ type
 | 
			
		||||
    procedure Assign(Src: TEditorMouseOptions); reintroduce;
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
    property MainActions: TSynEditMouseActions read FMainActions;
 | 
			
		||||
    property SelActions: TSynEditMouseActions read FSelActions;
 | 
			
		||||
@ -723,6 +727,16 @@ type
 | 
			
		||||
    property CustomSavedActions: Boolean read FCustomSavedActions write FCustomSavedActions;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  { TEditorMouseOptionPresets }
 | 
			
		||||
 | 
			
		||||
  TEditorMouseOptionPresets = class
 | 
			
		||||
  private
 | 
			
		||||
    FPreset: TQuickStringlist;
 | 
			
		||||
  public
 | 
			
		||||
    constructor Create;
 | 
			
		||||
    destructor Destroy; override;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  TEditorOptionsEditAccessInViewState =
 | 
			
		||||
    (eoeaIgnoreInView,          // Find any editor
 | 
			
		||||
     eoeaInViewOnly,            // Only editors, with the jump-target in their current visible area
 | 
			
		||||
@ -2607,6 +2621,249 @@ begin
 | 
			
		||||
  FCustomSavedActions := Result;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TEditorMouseOptions.LoadFromXml(aXMLConfig: TRttiXMLConfig;
 | 
			
		||||
  aPath: String; aOldPath: String = '');
 | 
			
		||||
 | 
			
		||||
  Procedure LoadMouseAct(Path: String; MActions: TSynEditMouseActions);
 | 
			
		||||
  var
 | 
			
		||||
    c, i: Integer;
 | 
			
		||||
    MAct: TSynEditMouseActionKeyCmdHelper;
 | 
			
		||||
    //ErrShown: Boolean;
 | 
			
		||||
  begin
 | 
			
		||||
    //ErrShown := False;
 | 
			
		||||
    MActions.Clear;
 | 
			
		||||
    MAct := TSynEditMouseActionKeyCmdHelper.Create(nil);
 | 
			
		||||
 | 
			
		||||
    c := aXMLConfig.GetValue(Path + 'Count', 0);
 | 
			
		||||
    for i := 0 to c - 1 do begin
 | 
			
		||||
      try
 | 
			
		||||
        MActions.IncAssertLock;
 | 
			
		||||
        try
 | 
			
		||||
          // If the object would ever be extended, old configs will not have all properties.
 | 
			
		||||
          Mact.Clear;
 | 
			
		||||
          aXMLConfig.ReadObject(Path + 'M' + IntToStr(i) + '/', MAct);
 | 
			
		||||
          MActions.Add.Assign(MAct);
 | 
			
		||||
        finally
 | 
			
		||||
          MActions.DecAssertLock;
 | 
			
		||||
        end;
 | 
			
		||||
        MActions.AssertNoConflict(MAct);
 | 
			
		||||
      except
 | 
			
		||||
        MActions.Delete(MActions.Count-1);
 | 
			
		||||
        //if not ErrShown then
 | 
			
		||||
        //  MessageDlg(dlgMouseOptErrorDup, dlgMouseOptErrorDupText, mtError, [mbOk], 0);
 | 
			
		||||
        //ErrShown := True;
 | 
			
		||||
      end;
 | 
			
		||||
    end;
 | 
			
		||||
    MAct.Free;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  Reset;
 | 
			
		||||
  if aOldPath <> '' then begin
 | 
			
		||||
    // Read deprecated value
 | 
			
		||||
    // It is on by default, so only if a user switched it off, actions is required
 | 
			
		||||
    if not aXMLConfig.GetValue(aOldPath + 'DragDropEditing', True) then
 | 
			
		||||
      TextDrag := False;
 | 
			
		||||
    aXMLConfig.DeleteValue(aOldPath + 'DragDropEditing');
 | 
			
		||||
 | 
			
		||||
    if aXMLConfig.GetValue(aOldPath + 'AltSetsColumnMode', False) then
 | 
			
		||||
      AltColumnMode := True;
 | 
			
		||||
    aXMLConfig.DeleteValue(aOldPath + 'AltSetsColumnMode');
 | 
			
		||||
 | 
			
		||||
    if not aXMLConfig.GetValue(aOldPath + 'CtrlMouseLinks', True) then
 | 
			
		||||
      TextCtrlLeftClick := moTCLNone;
 | 
			
		||||
    aXMLConfig.DeleteValue(aOldPath + 'CtrlMouseLinks');
 | 
			
		||||
 | 
			
		||||
    if aXMLConfig.GetValue(aOldPath + 'DoubleClickSelectsLine', False) then
 | 
			
		||||
      TextDoubleSelLine := True;
 | 
			
		||||
    aXMLConfig.DeleteValue(aOldPath + 'DoubleClickSelectsLine');
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  CustomSavedActions := False;
 | 
			
		||||
  aXMLConfig.ReadObject(aPath + 'Default/', Self);
 | 
			
		||||
  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);
 | 
			
		||||
  end
 | 
			
		||||
  else begin
 | 
			
		||||
    ResetTextToDefault;
 | 
			
		||||
    ResetGutterToDefault;
 | 
			
		||||
    WriteBack;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TEditorMouseOptions.SaveToXml(aXMLConfig: TRttiXMLConfig; aPath: String);
 | 
			
		||||
 | 
			
		||||
  Procedure SaveMouseAct(Path: String; MActions: TSynEditMouseActions);
 | 
			
		||||
  var
 | 
			
		||||
    i, OldCnt: Integer;
 | 
			
		||||
    MAct: TSynEditMouseActionKeyCmdHelper;
 | 
			
		||||
  begin
 | 
			
		||||
    MAct := TSynEditMouseActionKeyCmdHelper.Create(nil);
 | 
			
		||||
    OldCnt := aXMLConfig.GetValue(Path + 'Count', 0);
 | 
			
		||||
    for i := 0 to MActions.Count - 1 do begin
 | 
			
		||||
      if MActions[i].Command = emcSynEditCommand then begin
 | 
			
		||||
        MAct.Assign(MActions[i]);
 | 
			
		||||
        aXMLConfig.WriteObject(Path + 'M' + IntToStr(i) + '/', MAct);
 | 
			
		||||
      end else
 | 
			
		||||
        aXMLConfig.WriteObject(Path + 'M' + IntToStr(i) + '/', MActions[i]);
 | 
			
		||||
    end;
 | 
			
		||||
    aXMLConfig.SetValue(Path + 'Count', MActions.Count);
 | 
			
		||||
    for i := MActions.Count to OldCnt do
 | 
			
		||||
      aXMLConfig.DeletePath(Path + 'M' + IntToStr(i));
 | 
			
		||||
    MAct.Free;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  DefMouseSettings: TEditorMouseOptions;
 | 
			
		||||
begin
 | 
			
		||||
  DefMouseSettings := TEditorMouseOptions.Create(FOptions);
 | 
			
		||||
  CalcCustomSavedActions;
 | 
			
		||||
  aXMLConfig.WriteObject('EditorOptions/Mouse/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);
 | 
			
		||||
  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');
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TEditorMouseOptions.ImportFromXml(aXMLConfig: TRttiXMLConfig; aPath: String);
 | 
			
		||||
 | 
			
		||||
  Procedure LoadMouseAct(Path: String; MActions: TSynEditMouseActions);
 | 
			
		||||
  var
 | 
			
		||||
    i, c: Integer;
 | 
			
		||||
    MAct: TSynEditMouseActionKeyCmdHelper;
 | 
			
		||||
  begin
 | 
			
		||||
    MActions.Clear;
 | 
			
		||||
    MAct := TSynEditMouseActionKeyCmdHelper.Create(nil);
 | 
			
		||||
    c := aXMLConfig.GetValue(Path + 'Count', 0);
 | 
			
		||||
    for i := 0 to c - 1 do begin
 | 
			
		||||
      try
 | 
			
		||||
        MActions.IncAssertLock;
 | 
			
		||||
        try
 | 
			
		||||
          Mact.Clear;
 | 
			
		||||
          aXMLConfig.ReadObject(Path + 'M' + IntToStr(i) + '/', MAct);
 | 
			
		||||
          MActions.Add.Assign(MAct);
 | 
			
		||||
        finally
 | 
			
		||||
          MActions.DecAssertLock;
 | 
			
		||||
        end;
 | 
			
		||||
        MActions.AssertNoConflict(MAct);
 | 
			
		||||
      except
 | 
			
		||||
        MActions.Delete(MActions.Count-1);
 | 
			
		||||
        MessageDlg(dlgMouseOptErrorDup, dlgMouseOptErrorDupText + LineEnding
 | 
			
		||||
                   + Path + 'M' + IntToStr(i) + LineEnding + MAct.DisplayName,
 | 
			
		||||
                   mtError, [mbOk], 0);
 | 
			
		||||
      end;
 | 
			
		||||
    end;
 | 
			
		||||
    Mact.Free;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  LoadMouseAct(aPath + 'Main/',          MainActions);
 | 
			
		||||
  LoadMouseAct(aPath + 'MainSel/',       SelActions);
 | 
			
		||||
  LoadMouseAct(aPath + 'Gutter/',        GutterActions);
 | 
			
		||||
  LoadMouseAct(aPath + 'GutterFold/',    GutterActionsFold);
 | 
			
		||||
  LoadMouseAct(aPath + 'GutterFoldExp/', GutterActionsFoldExp);
 | 
			
		||||
  LoadMouseAct(aPath + 'GutterFoldCol/', GutterActionsFoldCol);
 | 
			
		||||
  LoadMouseAct(aPath + 'GutterLineNum/', GutterActionsLines);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TEditorMouseOptions.ExportToXml(aXMLConfig: TRttiXMLConfig; aPath: String);
 | 
			
		||||
var
 | 
			
		||||
  MAct: TSynEditMouseActionKeyCmdHelper;
 | 
			
		||||
 | 
			
		||||
  Procedure SaveMouseAct(Path: String; MActions: TSynEditMouseActions);
 | 
			
		||||
  var
 | 
			
		||||
    i: Integer;
 | 
			
		||||
  begin
 | 
			
		||||
    for i := 0 to MActions.Count - 1 do
 | 
			
		||||
      if MActions[i].Command = emcSynEditCommand then begin
 | 
			
		||||
        MAct.Assign(MActions[i]);
 | 
			
		||||
        aXMLConfig.WriteObject(Path + 'M' + IntToStr(i) + '/', MAct);
 | 
			
		||||
      end
 | 
			
		||||
      else
 | 
			
		||||
        aXMLConfig.WriteObject(Path + 'M' + IntToStr(i) + '/', MActions[i]);
 | 
			
		||||
    aXMLConfig.SetValue(Path + 'Count', MActions.Count);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  MAct := TSynEditMouseActionKeyCmdHelper.Create(nil);
 | 
			
		||||
  SaveMouseAct(aPath + 'Main/',          MainActions);
 | 
			
		||||
  SaveMouseAct(aPath + 'MainSel/',       SelActions);
 | 
			
		||||
  SaveMouseAct(aPath + 'Gutter/',        GutterActions);
 | 
			
		||||
  SaveMouseAct(aPath + 'GutterFold/',    GutterActionsFold);
 | 
			
		||||
  SaveMouseAct(aPath + 'GutterFoldExp/', GutterActionsFoldExp);
 | 
			
		||||
  SaveMouseAct(aPath + 'GutterFoldCol/', GutterActionsFoldCol);
 | 
			
		||||
  SaveMouseAct(aPath + 'GutterLineNum/', GutterActionsLines);
 | 
			
		||||
  MAct.Free;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ TEditorMouseOptionPresets }
 | 
			
		||||
 | 
			
		||||
constructor TEditorMouseOptionPresets.Create;
 | 
			
		||||
var
 | 
			
		||||
  FileList: TStringList;
 | 
			
		||||
  XMLConfig: TRttiXMLConfig;
 | 
			
		||||
  i, j, c: Integer;
 | 
			
		||||
  n: String;
 | 
			
		||||
  NewMouse: TEditorMouseOptions;
 | 
			
		||||
begin
 | 
			
		||||
  FPreset := TQuickStringlist.Create;
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
            //NewMouse := TEditorMouseOptions.Create;
 | 
			
		||||
 | 
			
		||||
            //Singleton.RegisterScheme(XMLConfig, n, 'Lazarus/MouseSchemes/');
 | 
			
		||||
          end;
 | 
			
		||||
        end;
 | 
			
		||||
      except
 | 
			
		||||
        ShowMessage(Format(dlgUserSchemeError, [FileList[i]]));
 | 
			
		||||
      end;
 | 
			
		||||
      XMLConfig.Free;
 | 
			
		||||
    end;
 | 
			
		||||
    FileList.Free;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
destructor TEditorMouseOptionPresets.Destroy;
 | 
			
		||||
begin
 | 
			
		||||
  inherited Destroy;
 | 
			
		||||
  FreeAndNil(FPreset);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ TEditorOptionsEditAccessOrderList }
 | 
			
		||||
 | 
			
		||||
function TEditorOptionsEditAccessOrderList.GetItems(Index: Integer): TEditorOptionsEditAccessOrderEntry;
 | 
			
		||||
@ -2901,39 +3158,6 @@ var
 | 
			
		||||
  SynEditOpt2: TSynEditorOption2;
 | 
			
		||||
  FileVersion: LongInt;
 | 
			
		||||
 | 
			
		||||
  Procedure LoadMouseAct(Path: String; MActions: TSynEditMouseActions);
 | 
			
		||||
  var
 | 
			
		||||
    c, i: Integer;
 | 
			
		||||
    MAct: TSynEditMouseActionKeyCmdHelper;
 | 
			
		||||
    //ErrShown: Boolean;
 | 
			
		||||
  begin
 | 
			
		||||
    //ErrShown := False;
 | 
			
		||||
    MActions.Clear;
 | 
			
		||||
    MAct := TSynEditMouseActionKeyCmdHelper.Create(nil);
 | 
			
		||||
 | 
			
		||||
    c := XMLConfig.GetValue(Path + 'Count', 0);
 | 
			
		||||
    for i := 0 to c - 1 do begin
 | 
			
		||||
      try
 | 
			
		||||
        MActions.IncAssertLock;
 | 
			
		||||
        try
 | 
			
		||||
          // If the object would ever be extended, old configs will not have all properties.
 | 
			
		||||
          Mact.Clear;
 | 
			
		||||
          XMLConfig.ReadObject(Path + 'M' + IntToStr(i) + '/', MAct);
 | 
			
		||||
          MActions.Add.Assign(MAct);
 | 
			
		||||
        finally
 | 
			
		||||
          MActions.DecAssertLock;
 | 
			
		||||
        end;
 | 
			
		||||
        MActions.AssertNoConflict(MAct);
 | 
			
		||||
      except
 | 
			
		||||
        MActions.Delete(MActions.Count-1);
 | 
			
		||||
        //if not ErrShown then
 | 
			
		||||
        //  MessageDlg(dlgMouseOptErrorDup, dlgMouseOptErrorDupText, mtError, [mbOk], 0);
 | 
			
		||||
        //ErrShown := True;
 | 
			
		||||
      end;
 | 
			
		||||
    end;
 | 
			
		||||
    MAct.Free;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  try
 | 
			
		||||
    FileVersion:=XMLConfig.GetValue('EditorOptions/Version', 0);
 | 
			
		||||
@ -3115,42 +3339,8 @@ begin
 | 
			
		||||
      XMLConfig.GetValue(
 | 
			
		||||
      'EditorOptions/CodeFolding/UseCodeFolding', True);
 | 
			
		||||
 | 
			
		||||
    FTempMouseSettings.Reset;
 | 
			
		||||
    // Read deprecated value
 | 
			
		||||
    // It is on by default, so only if a user switched it off, actions is required
 | 
			
		||||
    if not XMLConfig.GetValue('EditorOptions/General/Editor/DragDropEditing', True) then
 | 
			
		||||
      FTempMouseSettings.TextDrag := False;
 | 
			
		||||
    XMLConfig.DeleteValue('EditorOptions/General/Editor/DragDropEditing');
 | 
			
		||||
 | 
			
		||||
    if XMLConfig.GetValue('EditorOptions/General/Editor/AltSetsColumnMode', False) then
 | 
			
		||||
      FTempMouseSettings.AltColumnMode := True;
 | 
			
		||||
    XMLConfig.DeleteValue('EditorOptions/General/Editor/AltSetsColumnMode');
 | 
			
		||||
 | 
			
		||||
    if not XMLConfig.GetValue('EditorOptions/General/Editor/CtrlMouseLinks', True) then
 | 
			
		||||
      FTempMouseSettings.TextCtrlLeftClick := moTCLNone;
 | 
			
		||||
    XMLConfig.DeleteValue('EditorOptions/General/Editor/CtrlMouseLinks');
 | 
			
		||||
 | 
			
		||||
    if XMLConfig.GetValue('EditorOptions/General/Editor/DoubleClickSelectsLine', False) then
 | 
			
		||||
      FTempMouseSettings.TextDoubleSelLine := True;
 | 
			
		||||
    XMLConfig.DeleteValue('EditorOptions/General/Editor/DoubleClickSelectsLine');
 | 
			
		||||
 | 
			
		||||
    FTempMouseSettings.CustomSavedActions := False;
 | 
			
		||||
    XMLConfig.ReadObject('EditorOptions/Mouse/Default/', FTempMouseSettings);
 | 
			
		||||
    if FTempMouseSettings.CustomSavedActions then begin
 | 
			
		||||
      // Load
 | 
			
		||||
      LoadMouseAct('EditorOptions/Mouse/Main/', MouseMap);
 | 
			
		||||
      LoadMouseAct('EditorOptions/Mouse/MainSelection/', MouseSelMap);
 | 
			
		||||
      LoadMouseAct('EditorOptions/Mouse/Gutter/', MouseGutterActions);
 | 
			
		||||
      LoadMouseAct('EditorOptions/Mouse/GutterFold/', MouseGutterActionsFold);
 | 
			
		||||
      LoadMouseAct('EditorOptions/Mouse/GutterFoldExp/', MouseGutterActionsFoldExp);
 | 
			
		||||
      LoadMouseAct('EditorOptions/Mouse/GutterFoldCol/', MouseGutterActionsFoldCol);
 | 
			
		||||
      LoadMouseAct('EditorOptions/Mouse/GutterLineNum/', MouseGutterActionsLines);
 | 
			
		||||
    end
 | 
			
		||||
    else begin
 | 
			
		||||
      FTempMouseSettings.ResetTextToDefault;
 | 
			
		||||
      FTempMouseSettings.ResetGutterToDefault;
 | 
			
		||||
      FTempMouseSettings.WriteBack;
 | 
			
		||||
    end;
 | 
			
		||||
    FTempMouseSettings.LoadFromXml(XMLConfig, 'EditorOptions/Mouse/',
 | 
			
		||||
                                  'EditorOptions/General/Editor/');
 | 
			
		||||
 | 
			
		||||
    FMultiWinEditAccessOrder.LoadFromXMLConfig(XMLConfig, 'EditorOptions/MultiWin/');
 | 
			
		||||
    UserColorSchemeGroup.LoadFromXml(XMLConfig, 'EditorOptions/Color/',
 | 
			
		||||
@ -3169,27 +3359,6 @@ var
 | 
			
		||||
  SynEditOptName: String;
 | 
			
		||||
  i: Integer;
 | 
			
		||||
  SynEditOpt2: TSynEditorOption2;
 | 
			
		||||
  DefMouseSettings: TEditorMouseOptions;
 | 
			
		||||
 | 
			
		||||
  Procedure SaveMouseAct(Path: String; MActions: TSynEditMouseActions);
 | 
			
		||||
  var
 | 
			
		||||
    i, OldCnt: Integer;
 | 
			
		||||
    MAct: TSynEditMouseActionKeyCmdHelper;
 | 
			
		||||
  begin
 | 
			
		||||
    MAct := TSynEditMouseActionKeyCmdHelper.Create(nil);
 | 
			
		||||
    OldCnt := XMLConfig.GetValue(Path + 'Count', 0);
 | 
			
		||||
    for i := 0 to MActions.Count - 1 do begin
 | 
			
		||||
      if MActions[i].Command = emcSynEditCommand then begin
 | 
			
		||||
        MAct.Assign(MActions[i]);
 | 
			
		||||
        XMLConfig.WriteObject(Path + 'M' + IntToStr(i) + '/', MAct);
 | 
			
		||||
      end else
 | 
			
		||||
        XMLConfig.WriteObject(Path + 'M' + IntToStr(i) + '/', MActions[i]);
 | 
			
		||||
    end;
 | 
			
		||||
    XMLConfig.SetValue(Path + 'Count', MActions.Count);
 | 
			
		||||
    for i := MActions.Count to OldCnt do
 | 
			
		||||
      XMLConfig.DeletePath(Path + 'M' + IntToStr(i));
 | 
			
		||||
    MAct.Free;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  try
 | 
			
		||||
@ -3342,29 +3511,7 @@ begin
 | 
			
		||||
    XMLConfig.SetDeleteValue('EditorOptions/CodeFolding/UseCodeFolding',
 | 
			
		||||
        FUseCodeFolding, True);
 | 
			
		||||
 | 
			
		||||
    DefMouseSettings := TEditorMouseOptions.Create(self);
 | 
			
		||||
    FTempMouseSettings.CalcCustomSavedActions;
 | 
			
		||||
    XMLConfig.WriteObject('EditorOptions/Mouse/Default/', FTempMouseSettings, DefMouseSettings);
 | 
			
		||||
    DefMouseSettings.Free;
 | 
			
		||||
    if FTempMouseSettings.CustomSavedActions then begin
 | 
			
		||||
      // Save full settings / based on empty
 | 
			
		||||
      SaveMouseAct('EditorOptions/Mouse/Main/',          MouseMap);
 | 
			
		||||
      SaveMouseAct('EditorOptions/Mouse/MainSelection/', MouseSelMap);
 | 
			
		||||
      SaveMouseAct('EditorOptions/Mouse/Gutter/',        MouseGutterActions);
 | 
			
		||||
      SaveMouseAct('EditorOptions/Mouse/GutterFold/',    MouseGutterActionsFold);
 | 
			
		||||
      SaveMouseAct('EditorOptions/Mouse/GutterFoldExp/', MouseGutterActionsFoldExp);
 | 
			
		||||
      SaveMouseAct('EditorOptions/Mouse/GutterFoldCol/', MouseGutterActionsFoldCol);
 | 
			
		||||
      SaveMouseAct('EditorOptions/Mouse/GutterLineNum/', MouseGutterActionsLines);
 | 
			
		||||
    end else begin
 | 
			
		||||
      // clear unused entries
 | 
			
		||||
      XMLConfig.DeletePath('EditorOptions/Mouse/Main');
 | 
			
		||||
      XMLConfig.DeletePath('EditorOptions/Mouse/MainSelection');
 | 
			
		||||
      XMLConfig.DeletePath('EditorOptions/Mouse/Gutter');
 | 
			
		||||
      XMLConfig.DeletePath('EditorOptions/Mouse/GutterFold');
 | 
			
		||||
      XMLConfig.DeletePath('EditorOptions/Mouse/GutterFoldExp');
 | 
			
		||||
      XMLConfig.DeletePath('EditorOptions/Mouse/GutterFoldCol');
 | 
			
		||||
      XMLConfig.DeletePath('EditorOptions/Mouse/GutterLineNum');
 | 
			
		||||
    end;
 | 
			
		||||
    FTempMouseSettings.SaveToXml(XMLConfig, 'EditorOptions/Mouse/');
 | 
			
		||||
 | 
			
		||||
    FMultiWinEditAccessOrder.SaveToXMLConfig(XMLConfig, 'EditorOptions/MultiWin/');
 | 
			
		||||
    UserColorSchemeGroup.SaveToXml(XMLConfig, 'EditorOptions/Color/', ColorSchemeFactory);
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ interface
 | 
			
		||||
uses
 | 
			
		||||
  EditorOptions, LazarusIDEStrConsts, IDEOptionsIntf, sysutils,
 | 
			
		||||
  StdCtrls, ExtCtrls, Classes, Controls, LCLProc, Grids, ComCtrls, Dialogs,
 | 
			
		||||
  SynEditMouseCmds, MouseActionDialog, math, KeyMapping, IDEImagesIntf;
 | 
			
		||||
  SynEditMouseCmds, Laz_XMLCfg, MouseActionDialog, math, KeyMapping, IDEImagesIntf;
 | 
			
		||||
 | 
			
		||||
type
 | 
			
		||||
 | 
			
		||||
@ -531,84 +531,49 @@ end;
 | 
			
		||||
procedure TEditorMouseOptionsAdvFrame.BtnExportClick(Sender: TObject);
 | 
			
		||||
var
 | 
			
		||||
  xml: TRttiXMLConfig;
 | 
			
		||||
  MAct: TSynEditMouseActionKeyCmdHelper;
 | 
			
		||||
 | 
			
		||||
  Procedure SaveMouseAct(Path: String; MActions: TSynEditMouseActions);
 | 
			
		||||
  var
 | 
			
		||||
    i: Integer;
 | 
			
		||||
  begin
 | 
			
		||||
    for i := 0 to MActions.Count - 1 do
 | 
			
		||||
      if MActions[i].Command = emcSynEditCommand then begin
 | 
			
		||||
        MAct.Assign(MActions[i]);
 | 
			
		||||
        xml.WriteObject(Path + 'M' + IntToStr(i) + '/', MAct);
 | 
			
		||||
      end
 | 
			
		||||
      else
 | 
			
		||||
        xml.WriteObject(Path + 'M' + IntToStr(i) + '/', MActions[i]);
 | 
			
		||||
    xml.SetValue(Path + 'Count', MActions.Count);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  NewName: String;
 | 
			
		||||
  l: Integer;
 | 
			
		||||
begin
 | 
			
		||||
  if SaveDialog1.Execute then begin
 | 
			
		||||
    MAct := TSynEditMouseActionKeyCmdHelper.Create(nil);
 | 
			
		||||
    xml := TRttiXMLConfig.CreateClean(SaveDialog1.FileName);
 | 
			
		||||
    SaveMouseAct('Mouse/Main/', FTempMouseSettings.MainActions);
 | 
			
		||||
    SaveMouseAct('Mouse/MainSel/', FTempMouseSettings.SelActions);
 | 
			
		||||
    SaveMouseAct('Mouse/Gutter/', FTempMouseSettings.GutterActions);
 | 
			
		||||
    SaveMouseAct('Mouse/GutterFold/', FTempMouseSettings.GutterActionsFold);
 | 
			
		||||
    SaveMouseAct('Mouse/GutterFoldExp/', FTempMouseSettings.GutterActionsFoldExp);
 | 
			
		||||
    SaveMouseAct('Mouse/GutterFoldCol/', FTempMouseSettings.GutterActionsFoldCol);
 | 
			
		||||
    SaveMouseAct('Mouse/GutterLineNum/', FTempMouseSettings.GutterActionsLines);
 | 
			
		||||
 | 
			
		||||
    NewName := ExtractFileName(SaveDialog1.FileName);
 | 
			
		||||
    l := length(ExtractFileExt(NewName));
 | 
			
		||||
    if (l > 0) and (l+1 < Length(NewName)) then
 | 
			
		||||
      NewName := Copy(NewName, 1, Length(NewName) - l);
 | 
			
		||||
    l := UTF8CharacterLength(PChar(NewName));
 | 
			
		||||
    if l > 0 then
 | 
			
		||||
      NewName := UTF8UpperCase(copy(NewName, 1, l)) + copy(NewName, 1+l, length(NewName));
 | 
			
		||||
 | 
			
		||||
    xml.SetValue('Lazarus/MouseSchemes/Names/Count', 1);
 | 
			
		||||
    xml.SetValue('Lazarus/MouseSchemes/Names/Item1/Value', NewName);
 | 
			
		||||
 | 
			
		||||
    FTempMouseSettings.ExportToXml(xml, 'Lazarus/MouseSchemes/Scheme' + NewName + '/' );
 | 
			
		||||
    xml.Flush;
 | 
			
		||||
    xml.Free;
 | 
			
		||||
    MAct.Free;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TEditorMouseOptionsAdvFrame.BtnImportClick(Sender: TObject);
 | 
			
		||||
var
 | 
			
		||||
  xml: TRttiXMLConfig;
 | 
			
		||||
 | 
			
		||||
  Procedure LoadMouseAct(Path: String; MActions: TSynEditMouseActions);
 | 
			
		||||
  var
 | 
			
		||||
    i, c: Integer;
 | 
			
		||||
    MAct: TSynEditMouseActionKeyCmdHelper;
 | 
			
		||||
  begin
 | 
			
		||||
    MActions.Clear;
 | 
			
		||||
    MAct := TSynEditMouseActionKeyCmdHelper.Create(nil);
 | 
			
		||||
    c := xml.GetValue(Path + 'Count', 0);
 | 
			
		||||
    for i := 0 to c - 1 do begin
 | 
			
		||||
      try
 | 
			
		||||
        MActions.IncAssertLock;
 | 
			
		||||
        try
 | 
			
		||||
          Mact.Clear;
 | 
			
		||||
          xml.ReadObject(Path + 'M' + IntToStr(i) + '/', MAct);
 | 
			
		||||
          MActions.Add.Assign(MAct);
 | 
			
		||||
        finally
 | 
			
		||||
          MActions.DecAssertLock;
 | 
			
		||||
        end;
 | 
			
		||||
        MActions.AssertNoConflict(MAct);
 | 
			
		||||
      except
 | 
			
		||||
        MActions.Delete(MActions.Count-1);
 | 
			
		||||
        MessageDlg(dlgMouseOptErrorDup, dlgMouseOptErrorDupText + LineEnding
 | 
			
		||||
                   + Path + 'M' + IntToStr(i) + LineEnding + MAct.DisplayName,
 | 
			
		||||
                   mtError, [mbOk], 0);
 | 
			
		||||
      end;
 | 
			
		||||
    end;
 | 
			
		||||
    Mact.Free;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  c: longint;
 | 
			
		||||
  n: String;
 | 
			
		||||
begin
 | 
			
		||||
  if OpenDialog1.Execute then begin
 | 
			
		||||
    xml := TRttiXMLConfig.Create(OpenDialog1.FileName);
 | 
			
		||||
    LoadMouseAct('Mouse/Main/', FTempMouseSettings.MainActions);
 | 
			
		||||
    LoadMouseAct('Mouse/MainSel/', FTempMouseSettings.SelActions);
 | 
			
		||||
    LoadMouseAct('Mouse/Gutter/', FTempMouseSettings.GutterActions);
 | 
			
		||||
    LoadMouseAct('Mouse/GutterFold/', FTempMouseSettings.GutterActionsFold);
 | 
			
		||||
    LoadMouseAct('Mouse/GutterFoldExp/', FTempMouseSettings.GutterActionsFoldExp);
 | 
			
		||||
    LoadMouseAct('Mouse/GutterFoldCol/', FTempMouseSettings.GutterActionsFoldCol);
 | 
			
		||||
    LoadMouseAct('Mouse/GutterLineNum/', FTempMouseSettings.GutterActionsLines);
 | 
			
		||||
    if xml.HasChildPaths('Mouse/') then begin
 | 
			
		||||
      // Load old export
 | 
			
		||||
      FTempMouseSettings.ImportFromXml(xml, 'Mouse/')
 | 
			
		||||
    end else begin
 | 
			
		||||
      c := xml.GetValue('Lazarus/MouseSchemes/Names/Count', 0);
 | 
			
		||||
      n := '';
 | 
			
		||||
      if c > 0 then   // Only reading First Scheme
 | 
			
		||||
        n := xml.GetValue('Lazarus/MouseSchemes/Names/Item1/Value', '');
 | 
			
		||||
      if n <> '' then
 | 
			
		||||
        FTempMouseSettings.ImportFromXml(xml, 'Lazarus/MouseSchemes/Scheme' + n+ '/');
 | 
			
		||||
    end;
 | 
			
		||||
    xml.Free;
 | 
			
		||||
 | 
			
		||||
    ContextTree.Selected := FMainNode;
 | 
			
		||||
    ContextTreeChange(nil, FMainNode);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user