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

View File

@ -196,11 +196,13 @@ type
procedure OpenButtonClick({%H-}sender : TOBject);
procedure ScannersButtonClick(Sender: TObject);
private
fAllKeys: TKeyCommandRelationList;
fOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF};
fTransferMacros: TTransferMacroList;
fScanners: TStrings;
fKeyBox: TShortCutGrabBox;
procedure FillMacroList;
function KeyConflicts(Key:word; Shift:TShiftState): TModalResult;
procedure LoadFromOptions;
procedure SaveToOptions;
procedure UpdateButtons;
@ -216,19 +218,23 @@ type
function ShowExtToolOptionDlg(TransferMacroList: TTransferMacroList;
ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF}):TModalResult;
ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF};
AllKeys: TKeyCommandRelationList):TModalResult;
implementation
{$R *.lfm}
function ShowExtToolOptionDlg(TransferMacroList: TTransferMacroList;
ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF}):TModalResult;
var ExternalToolOptionDlg: TExternalToolOptionDlg;
ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF};
AllKeys: TKeyCommandRelationList):TModalResult;
var
ExternalToolOptionDlg: TExternalToolOptionDlg;
begin
Result:=mrCancel;
ExternalToolOptionDlg:=TExternalToolOptionDlg.Create(nil);
try
ExternalToolOptionDlg.fAllKeys:=AllKeys;
ExternalToolOptionDlg.Options:=ExternalToolOptions;
ExternalToolOptionDlg.MacroList:=TransferMacroList;
Result:=ExternalToolOptionDlg.ShowModal;
@ -873,6 +879,60 @@ begin
MacrosListbox.Items.EndUpdate;
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(
AComboBox: TComboBox; const AValue: string);
var i: integer;
@ -915,6 +975,17 @@ end;
procedure TExternalToolOptionDlg.OKButtonClick(Sender: TObject);
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
SaveToOptions
else begin