mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-10 19:56:21 +02:00
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:
parent
fdb9a6258b
commit
07d52d2075
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user