diff --git a/ide/exttooldialog.pas b/ide/exttooldialog.pas index 6fe74d4b38..79c9753931 100644 --- a/ide/exttooldialog.pas +++ b/ide/exttooldialog.pas @@ -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; diff --git a/ide/exttooleditdlg.pas b/ide/exttooleditdlg.pas index 945c29615d..3cf19d68a6 100644 --- a/ide/exttooleditdlg.pas +++ b/ide/exttooleditdlg.pas @@ -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