From e2a763708b26e11205f06d858e0d0afd956ccb64 Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Sat, 17 Oct 2015 00:16:55 +0200 Subject: [PATCH] shortcuts, manage conflicts --- src/ce_editoroptions.pas | 19 +++++++++++-------- src/ce_shortcutseditor.lfm | 8 ++++---- src/ce_shortcutseditor.pas | 27 +++++++++++++++++++++------ 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/ce_editoroptions.pas b/src/ce_editoroptions.pas index ea593e5a..decf7867 100644 --- a/src/ce_editoroptions.pas +++ b/src/ce_editoroptions.pas @@ -460,9 +460,10 @@ end; procedure TCEEditorOptions.applyChangeToEditor(anEditor: TCESynMemo); var - i, j: Integer; + i, j, k: Integer; shc: TCEPersistentShortcut; kst: TSynEditKeyStroke; + dup: boolean; begin anEditor.D2Highlighter.Assign(D2Syn); anEditor.TxtHighlighter.Assign(TxtSyn); @@ -491,19 +492,21 @@ begin kst := anEditor.Keystrokes.Items[i]; for j := 0 to fShortCuts.Count-1 do begin + dup := false; shc := TCEPersistentShortcut(fShortCuts.Items[j]); if shc.actionName = EditorCommandToCodeString(kst.Command) then begin try - // if anEditor.Keystrokes.FindShortcut(); - // try to find, if not match cur action, set to 0 - kst.ShortCut := shc.shortcut; + for k := 0 to i-1 do + if anEditor.Keystrokes.Items[k].shortCut = shc.shortcut then + if shc.shortCut <> 0 then + dup := true; + if not dup then + kst.shortCut := shc.shortcut; except - kst.ShortCut := 0; + kst.shortCut := 0; shc.shortcut := 0; - // TODO-cimprovement: manage shortcuts conflicts - // either here or in the shortcut editor. - // by default and if a conflict exists synedit will raise an exception here. + // in case of conflict synedit raises an exception. end; break; end; diff --git a/src/ce_shortcutseditor.lfm b/src/ce_shortcutseditor.lfm index 8c28e641..b5356f5c 100644 --- a/src/ce_shortcutseditor.lfm +++ b/src/ce_shortcutseditor.lfm @@ -20,7 +20,7 @@ object CEShortcutEditor: TCEShortcutEditor TabOrder = 0 object fltItems: TTreeFilterEdit Left = 2 - Height = 23 + Height = 20 Top = 2 Width = 420 ButtonWidth = 28 @@ -33,14 +33,14 @@ object CEShortcutEditor: TCEShortcutEditor end object tree: TTreeView Left = 2 - Height = 404 - Top = 29 + Height = 407 + Top = 26 Width = 420 Align = alClient AutoExpand = True BorderSpacing.Top = 2 BorderSpacing.Around = 2 - DefaultItemHeight = 18 + DefaultItemHeight = 16 HideSelection = False ReadOnly = True ScrollBars = ssAutoBoth diff --git a/src/ce_shortcutseditor.pas b/src/ce_shortcutseditor.pas index 55b9e32c..d3b89cd9 100644 --- a/src/ce_shortcutseditor.pas +++ b/src/ce_shortcutseditor.pas @@ -7,7 +7,8 @@ interface uses Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Menus, Graphics, ExtCtrls, LCLProc, ComCtrls, StdCtrls, Buttons, LCLType, - ce_sharedres, ce_observer, ce_interfaces, ce_common, ce_writableComponent; + ce_sharedres, ce_observer, ce_interfaces, ce_common, ce_writableComponent, + ce_dialogs; type @@ -39,7 +40,7 @@ type procedure assign(aValue: TPersistent); override; // function findIdentifier(const identifier: string): boolean; - function findShortcut(aShortcut: Word): boolean; + function findShortcut(aShortcut: Word): TShortcutItem; // property count: Integer read getCount; property item[index: Integer]: TShortcutItem read getItem; default; @@ -158,14 +159,14 @@ begin exit(true); end; -function TShortCutCollection.findShortcut(aShortcut: Word): boolean; +function TShortCutCollection.findShortcut(aShortcut: Word): TShortcutItem; var i: Integer; begin - result := false; + result := nil; for i := 0 to count-1 do if item[i].data = aShortcut then - exit(true); + exit(item[i]); end; {$ENDREGION} @@ -281,7 +282,12 @@ end; procedure TCEShortcutEditor.LabeledEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var + i: integer; sh: TShortCut; + sht: string; + dup: TShortcutItem = nil; +const + msg = '"%s" is already assigned in the same category by "%s". The new shortcut will be ignored'; begin if tree.Selected = nil then exit; if tree.Selected.Level = 0 then exit; @@ -292,7 +298,16 @@ begin else begin sh := Shortcut(Key, Shift); - if TShortcutItem(tree.Selected.Data).data <> sh then + sht := shortCutToText(sh); + if sht = '' then + exit; + for i:= 0 to tree.Selected.Parent.Count-1 do + if i <> tree.Selected.Index then + if TShortcutItem(tree.Selected.Parent.Items[i].Data).data = sh then + dup := TShortcutItem(tree.Selected.Parent.Items[i].Data); + if assigned(dup) then + dlgOkInfo(format(msg,[ShortCutToText(sh), dup.identifier])) + else if TShortcutItem(tree.Selected.Data).data <> sh then begin TShortcutItem(tree.Selected.Data).data := sh; fHasChanged := true;