IDE: Add conflict warning for External Tools keyboard shortcut. Issue #14876, patch from Ludo Brands

git-svn-id: trunk@42790 -
This commit is contained in:
juha 2013-09-14 07:04:47 +00:00
parent fdb9a6258b
commit 07d52d2075
2 changed files with 86 additions and 7 deletions

View File

@ -74,6 +74,7 @@ type
fOnFreeOutputFilter: TOnFreeOutputFilter; fOnFreeOutputFilter: TOnFreeOutputFilter;
fOnNeedsOutputFilter: TOnNeedsOutputFilter; fOnNeedsOutputFilter: TOnNeedsOutputFilter;
fRunningTools: TList; // list of TProcess fRunningTools: TList; // list of TProcess
fAllKeys: TKeyCommandRelationList;
function GetToolOpts(Index: integer): TExternalToolOptions; function GetToolOpts(Index: integer): TExternalToolOptions;
procedure SetToolOpts(Index: integer; NewTool: TExternalToolOptions); procedure SetToolOpts(Index: integer; NewTool: TExternalToolOptions);
procedure AddRunningTool(TheProcess: TProcess; ExecuteProcess: boolean); procedure AddRunningTool(TheProcess: TProcess; ExecuteProcess: boolean);
@ -244,6 +245,7 @@ begin
TProcess(fRunningTools[i]).Free; TProcess(fRunningTools[i]).Free;
fRunningTools.Free; fRunningTools.Free;
end; end;
fAllKeys.Free;
inherited Destroy; inherited Destroy;
end; end;
@ -299,6 +301,9 @@ var
i: integer; i: integer;
KeyCommandRelation: TKeyCommandRelation; KeyCommandRelation: TKeyCommandRelation;
begin begin
if not assigned(fAllKeys) then
fAllKeys:=TKeyCommandRelationList.Create;
fAllKeys.Assign(KeyCommandRelationList);
for i:=0 to Count-1 do begin for i:=0 to Count-1 do begin
KeyCommandRelation:=KeyCommandRelationList.FindByCommand(ecExtToolFirst+i); KeyCommandRelation:=KeyCommandRelationList.FindByCommand(ecExtToolFirst+i);
if KeyCommandRelation<>nil then begin if KeyCommandRelation<>nil then begin
@ -646,7 +651,9 @@ begin
{$ELSE} {$ELSE}
NewTool:=TExternalToolOptions.Create; NewTool:=TExternalToolOptions.Create;
{$ENDIF} {$ENDIF}
if ShowExtToolOptionDlg(fTransferMacros,NewTool)=mrOk then begin if ShowExtToolOptionDlg(fTransferMacros, NewTool,
TExternalToolList(EnvironmentOptions.ExternalTools).fAllKeys)=mrOk then
begin
fExtToolList.Add(NewTool); fExtToolList.Add(NewTool);
Listbox.Items.Add(ToolDescription(fExtToolList.Count-1)); Listbox.Items.Add(ToolDescription(fExtToolList.Count-1));
end else begin end else begin
@ -739,8 +746,9 @@ var
begin begin
i:=Listbox.ItemIndex; i:=Listbox.ItemIndex;
if i<0 then exit; if i<0 then exit;
if ShowExtToolOptionDlg(fTransferMacros,fExtToolList[i])=mrOk if ShowExtToolOptionDlg(fTransferMacros,fExtToolList[i],
then begin TExternalToolList(EnvironmentOptions.ExternalTools).fAllKeys)=mrOk then
begin
Listbox.Items[i]:=ToolDescription(i); Listbox.Items[i]:=ToolDescription(i);
EnableButtons; EnableButtons;
end; end;

View File

@ -196,11 +196,13 @@ type
procedure OpenButtonClick({%H-}sender : TOBject); procedure OpenButtonClick({%H-}sender : TOBject);
procedure ScannersButtonClick(Sender: TObject); procedure ScannersButtonClick(Sender: TObject);
private private
fAllKeys: TKeyCommandRelationList;
fOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF}; fOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF};
fTransferMacros: TTransferMacroList; fTransferMacros: TTransferMacroList;
fScanners: TStrings; fScanners: TStrings;
fKeyBox: TShortCutGrabBox; fKeyBox: TShortCutGrabBox;
procedure FillMacroList; procedure FillMacroList;
function KeyConflicts(Key:word; Shift:TShiftState): TModalResult;
procedure LoadFromOptions; procedure LoadFromOptions;
procedure SaveToOptions; procedure SaveToOptions;
procedure UpdateButtons; procedure UpdateButtons;
@ -216,19 +218,23 @@ type
function ShowExtToolOptionDlg(TransferMacroList: TTransferMacroList; function ShowExtToolOptionDlg(TransferMacroList: TTransferMacroList;
ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF}):TModalResult; ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF};
AllKeys: TKeyCommandRelationList):TModalResult;
implementation implementation
{$R *.lfm} {$R *.lfm}
function ShowExtToolOptionDlg(TransferMacroList: TTransferMacroList; function ShowExtToolOptionDlg(TransferMacroList: TTransferMacroList;
ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF}):TModalResult; ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF};
var ExternalToolOptionDlg: TExternalToolOptionDlg; AllKeys: TKeyCommandRelationList):TModalResult;
var
ExternalToolOptionDlg: TExternalToolOptionDlg;
begin begin
Result:=mrCancel; Result:=mrCancel;
ExternalToolOptionDlg:=TExternalToolOptionDlg.Create(nil); ExternalToolOptionDlg:=TExternalToolOptionDlg.Create(nil);
try try
ExternalToolOptionDlg.fAllKeys:=AllKeys;
ExternalToolOptionDlg.Options:=ExternalToolOptions; ExternalToolOptionDlg.Options:=ExternalToolOptions;
ExternalToolOptionDlg.MacroList:=TransferMacroList; ExternalToolOptionDlg.MacroList:=TransferMacroList;
Result:=ExternalToolOptionDlg.ShowModal; Result:=ExternalToolOptionDlg.ShowModal;
@ -873,6 +879,60 @@ begin
MacrosListbox.Items.EndUpdate; MacrosListbox.Items.EndUpdate;
end; end;
function TExternalToolOptionDlg.KeyConflicts(Key: word; Shift: TShiftState
): TModalResult;
type
TConflictType = (ctNone,ctConflictKeyA,ctConflictKeyB);
var
i: Integer;
ct:TConflictType;
CurName: TCaption;
ConflictName: String;
begin
Result:=mrOK;
// look if we have already this key
if Key=VK_UNKNOWN then
exit;
i:=0;
for i:=0 to fAllKeys.RelationCount-1 do
begin
with fAllKeys.Relations[i] do
begin
ct:=ctnone;
if (ShortcutA.Key1=Key) and (ShortcutA.Shift1=Shift) then
ct:=ctConflictKeyA
else if (ShortcutB.Key1=Key) and (ShortcutB.Shift1=Shift) then
ct:=ctConflictKeyB;
if (ct<>ctNone) then begin
CurName:=TitleEdit.Text;
ConflictName:=GetCategoryAndName;
if ct=ctConflictKeyA then
ConflictName:=ConflictName
+' ('+KeyAndShiftStateToEditorKeyString(ShortcutA)
else
ConflictName:=ConflictName
+' ('+KeyAndShiftStateToEditorKeyString(ShortcutB);
case IDEMessageDialog(lisPEConflictFound,
Format(lisTheKeyIsAlreadyAssignedToRemoveTheOldAssignmentAnd, [
KeyAndShiftStateToKeyString(Key,Shift), LineEnding, ConflictName, LineEnding,
LineEnding, LineEnding, CurName]), mtConfirmation, [mbYes, mbNo, mbCancel])
of
mrYes: Result:=mrOK;
mrCancel: Result:=mrCancel;
else Result:=mrRetry;
end;
if Result=mrOK then begin
if (ct=ctConflictKeyA) then
ShortcutA:=ShortcutB;
ClearShortcutB;
end
else
break;
end;
end;
end;
end;
procedure TExternalToolOptionDlg.SetComboBox( procedure TExternalToolOptionDlg.SetComboBox(
AComboBox: TComboBox; const AValue: string); AComboBox: TComboBox; const AValue: string);
var i: integer; var i: integer;
@ -915,6 +975,17 @@ end;
procedure TExternalToolOptionDlg.OKButtonClick(Sender: TObject); procedure TExternalToolOptionDlg.OKButtonClick(Sender: TObject);
begin begin
case KeyConflicts(fKeyBox.Key,fKeyBox.ShiftState) of
mrCancel: begin
debugln('TExternalToolOptionDlg.OkButtonClick KeyConflicts failed for key1');
ModalResult:=mrCancel;
exit;
end;
mrRetry: begin
ModalResult:=mrNone;
exit;
end;
end;
if (TitleEdit.Text<>'') and (FilenameEdit.Text<>'') then if (TitleEdit.Text<>'') and (FilenameEdit.Text<>'') then
SaveToOptions SaveToOptions
else begin else begin