From b04af8ad35e653038e2766d2585933c42651b15c Mon Sep 17 00:00:00 2001 From: ondrej Date: Tue, 3 May 2016 13:36:39 +0000 Subject: [PATCH] ide: implement "Open unit" dialog git-svn-id: trunk@52272 - --- .gitattributes | 1 + components/ideintf/idecommands.pas | 1 + ide/keymapping.pp | 5 ++ ide/lazarusidestrconsts.pas | 2 + ide/main.pp | 16 +++-- ide/mainbar.pas | 1 + ide/mainbase.pas | 2 + ide/useunitdlg.pas | 93 +++++++++++++++++++++-------- images/actions/laz_openunit.png | Bin 0 -> 686 bytes images/laz_images.res | Bin 362064 -> 362808 bytes images/laz_images_list.txt | 1 + 11 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 images/actions/laz_openunit.png diff --git a/.gitattributes b/.gitattributes index bf10755c27..d55d4f228f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6119,6 +6119,7 @@ images/actions/laz_edit.png -text svneol=unset#image/png images/actions/laz_export.png -text svneol=unset#image/png images/actions/laz_highlighter.png -text svneol=unset#image/png images/actions/laz_open.png -text svneol=unset#image/png +images/actions/laz_openunit.png -text images/actions/laz_refresh.png -text svneol=unset#image/png images/actions/laz_save.png -text svneol=unset#image/png images/actions/laz_set_color_default.png -text svneol=unset#image/png diff --git a/components/ideintf/idecommands.pas b/components/ideintf/idecommands.pas index e208cec0b9..67073e9824 100644 --- a/components/ideintf/idecommands.pas +++ b/components/ideintf/idecommands.pas @@ -168,6 +168,7 @@ const ecCleanDirectory = ecFirstLazarus + 212; ecRestart = ecFirstLazarus + 213; ecQuit = ecFirstLazarus + 214; + ecOpenUnit = ecFirstLazarus + 215; // IDE navigation ecToggleFormUnit = ecFirstLazarus + 301; diff --git a/ide/keymapping.pp b/ide/keymapping.pp index 56c1f183c1..609702b12a 100644 --- a/ide/keymapping.pp +++ b/ide/keymapping.pp @@ -492,6 +492,7 @@ begin ecNewUnit : Result:= lisMenuNewUnit; ecNewForm : Result:= lisMenuNewForm; ecOpen : Result:= lisMenuOpen; + ecOpenUnit : Result:= lisMenuOpenUnit; ecRevert : Result:= lisMenuRevert; ecSave : Result:= lisSave; ecSaveAs : Result:= lisMenuSaveAs; @@ -1229,6 +1230,7 @@ begin ecNewUnit: SetSingle(VK_UNKNOWN,[]); ecNewForm: SetSingle(VK_UNKNOWN,[]); ecOpen: SetSingle(VK_O,[XCtrl]); + ecOpenUnit: SetSingle(VK_F12,[ssAlt]); ecRevert: SetSingle(VK_UNKNOWN,[]); ecSave: SetSingle(VK_S,[XCtrl]); ecSaveAs: SetSingle(VK_UNKNOWN,[]); @@ -1668,6 +1670,7 @@ begin ecNewUnit: SetSingle(VK_UNKNOWN,[]); ecNewForm: SetSingle(VK_UNKNOWN,[]); ecOpen: SetSingle(VK_F3,[]); + ecOpenUnit: SetSingle(VK_F12,[ssAlt]); ecRevert: SetSingle(VK_UNKNOWN,[]); ecSave: SetSingle(VK_F2,[]); ecSaveAs: SetSingle(VK_UNKNOWN,[]); @@ -2289,6 +2292,7 @@ begin ecNewUnit: SetSingle(VK_UNKNOWN,[]); ecNewForm: SetSingle(VK_UNKNOWN,[]); ecOpen: SetSingle(VK_O,[ssMeta]); + ecOpenUnit: SetSingle(VK_F12,[ssAlt]); ecRevert: SetSingle(VK_UNKNOWN,[]); ecSave: SetSingle(VK_S,[ssMeta]); ecSaveAs: SetSingle(VK_S,[ssMeta,ssShift]); @@ -2972,6 +2976,7 @@ begin AddDefault(C, 'NewUnit', lisKMNewUnit, ecNewUnit); AddDefault(C, 'NewForm', lisMenuNewForm, ecNewForm); AddDefault(C, 'Open', lisOpen, ecOpen); + AddDefault(C, 'OpenUnit', lisOpenUnit, ecOpenUnit); AddDefault(C, 'Revert', lisMenuRevert, ecRevert); AddDefault(C, 'Save', lisSave, ecSave); AddDefault(C, 'SaveAs', lisKMSaveAs, ecSaveAs); diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index 4baed51954..20df16b783 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -67,6 +67,7 @@ resourcestring lisDlgEdit = 'Edit ...'; lisClear = 'Clear'; lisOpen = 'Open'; + lisOpenUnit = 'Open Unit'; lisSave = 'Save'; lisDlgSave = 'Save ...'; lisSaveAs = 'Save As'; @@ -294,6 +295,7 @@ resourcestring lisMenuNewForm = 'New Form'; lisMenuNewOther = 'New ...'; lisMenuOpen = '&Open ...'; + lisMenuOpenUnit = 'Open Unit...'; lisMenuRevert = 'Revert'; lisPESavePackageAs = 'Save Package As ...'; lisPkgEditPublishPackage = 'Publish Package'; diff --git a/ide/main.pp b/ide/main.pp index f8e831b9f0..ca7de03fa6 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -195,6 +195,7 @@ type procedure mnuNewFormClicked(Sender: TObject); procedure mnuNewOtherClicked(Sender: TObject); procedure mnuOpenClicked(Sender: TObject); + procedure mnuOpenUnitClicked(Sender: TObject); procedure mnuOpenRecentClicked(Sender: TObject); override; procedure mnuRevertClicked(Sender: TObject); procedure mnuSaveClicked(Sender: TObject); @@ -898,7 +899,7 @@ type function DoShowAbstractMethods: TModalResult; function DoRemoveEmptyMethods: TModalResult; function DoRemoveUnusedUnits: TModalResult; - function DoUseUnit: TModalResult; + function DoUseUnitDlg(DlgType: TUseUnitDialogType): TModalResult; function DoFindOverloads: TModalResult; function DoInitIdentCompletion(JumpToError: boolean): boolean; function DoShowCodeContext(JumpToError: boolean): boolean; @@ -2570,6 +2571,7 @@ begin itmFileNewForm.OnClick := @mnuNewFormClicked; itmFileNewOther.OnClick := @mnuNewOtherClicked; itmFileOpen.OnClick := @mnuOpenClicked; + itmFileOpenUnit.OnClick := @mnuOpenUnitClicked; itmFileRevert.OnClick := @mnuRevertClicked; SetRecentFilesMenu; itmFileSave.OnClick := @mnuSaveClicked; @@ -2993,6 +2995,11 @@ begin end; end; +procedure TMainIDE.mnuOpenUnitClicked(Sender: TObject); +begin + DoSourceEditorCommand(ecOpenUnit); +end; + procedure TMainIDE.mnuRevertClicked(Sender: TObject); begin if (SourceEditorManager.ActiveSourceWindowIndex < 0) @@ -3231,6 +3238,7 @@ begin mnuSaveClicked(Self); end; ecOpen: mnuOpenClicked(Self); + ecOpenUnit: DoUseUnitDlg(udOpenUnit); ecSaveAll: DoSaveAll([sfCheckAmbiguousFiles]); ecQuit: mnuQuitClicked(Self); ecCompile: @@ -3277,7 +3285,7 @@ begin ecShowAbstractMethods: DoShowAbstractMethods; ecRemoveEmptyMethods: DoRemoveEmptyMethods; ecRemoveUnusedUnits: DoRemoveUnusedUnits; - ecUseUnit: DoUseUnit; + ecUseUnit: DoUseUnitDlg(udUseUnit); ecFindOverloads: DoFindOverloads; ecFindBlockOtherEnd: DoGoToPascalBlockOtherEnd; ecFindBlockStart: DoGoToPascalBlockStart; @@ -10067,7 +10075,7 @@ begin Result:=ShowUnusedUnitsDialog; end; -function TMainIDE.DoUseUnit: TModalResult; +function TMainIDE.DoUseUnitDlg(DlgType: TUseUnitDialogType): TModalResult; var TempEditor: TSourceEditorInterface; DefText: String; @@ -10084,7 +10092,7 @@ begin end; end; - Result:=ShowUseUnitDialog(DefText); + Result:=ShowUseUnitDialog(DefText, DlgType); end; function TMainIDE.DoFindOverloads: TModalResult; diff --git a/ide/mainbar.pas b/ide/mainbar.pas index 6821b97db1..5cd9ea7ee4 100644 --- a/ide/mainbar.pas +++ b/ide/mainbar.pas @@ -83,6 +83,7 @@ type //itmFileOpenSave: TIDEMenuSection; itmFileOpen: TIDEMenuCommand; itmFileRevert: TIDEMenuCommand; + itmFileOpenUnit: TIDEMenuCommand; //itmFileRecentOpen: TIDEMenuSection; itmFileSave: TIDEMenuCommand; itmFileSaveAs: TIDEMenuCommand; diff --git a/ide/mainbase.pas b/ide/mainbase.pas index eb6299952c..15854393f7 100644 --- a/ide/mainbase.pas +++ b/ide/mainbase.pas @@ -987,6 +987,7 @@ begin ParentMI:=itmFileOpenSave; CreateMenuItem(ParentMI, itmFileOpen, 'itmFileOpen', lisMenuOpen, 'laz_open'); CreateMenuItem(ParentMI,itmFileRevert,'itmFileRevert',lisMenuRevert, 'menu_file_revert'); + CreateMenuItem(ParentMI, itmFileOpenUnit, 'itmFileOpenUnit', lisMenuOpenUnit, 'laz_openunit'); CreateMenuSubSection(ParentMI,itmFileRecentOpen,'itmFileRecentOpen',lisMenuOpenRecent); CreateMenuItem(ParentMI,itmFileSave,'itmFileSave',lisMenuSave,'laz_save'); CreateMenuItem(ParentMI,itmFileSaveAs,'itmFileSaveAs',lisMenuSaveAs,'menu_saveas'); @@ -1499,6 +1500,7 @@ begin itmFileNewForm.Command:=GetCommand(ecNewForm, TNewFormToolButton); itmFileNewOther.Command:=GetCommand(ecNew); itmFileOpen.Command:=GetCommand(ecOpen, TOpenFileToolButton); + itmFileOpenUnit.Command:=GetCommand(ecOpenUnit); itmFileRevert.Command:=GetCommand(ecRevert); itmFileSave.Command:=GetCommand(ecSave); itmFileSaveAs.Command:=GetCommand(ecSaveAs); diff --git a/ide/useunitdlg.pas b/ide/useunitdlg.pas index 42cc61c79b..381ffb5b97 100644 --- a/ide/useunitdlg.pas +++ b/ide/useunitdlg.pas @@ -34,10 +34,12 @@ uses Dialogs, LCLProc, FileProcs, Graphics, LCLType, SourceEditor, LazIDEIntf, IDEImagesIntf, LazarusIDEStrConsts, ProjectIntf, IDEWindowIntf, Project, CodeCache, CodeToolManager, IdentCompletionTool, CodeTree, ListFilterEdit, - LinkScanner, EnvironmentOpts; + LinkScanner, EnvironmentOpts, MainIntf, LazFileUtils; type + TUseUnitDialogType = (udUseUnit, udOpenUnit); + { TUseUnitDialog } TUseUnitDialog = class(TForm) @@ -62,9 +64,11 @@ type FMainUsedUnits: TStringList; FImplUsedUnits: TStringList; FProjUnits, FOtherUnits: TStringList; + DlgType: TUseUnitDialogType; procedure AddImplUsedUnits; function GetProjUnits(SrcEdit: TSourceEditor): Boolean; procedure CreateOtherUnitsList; + function SelectedUnitFileName: string; function SelectedUnit: string; function InterfaceSelected: Boolean; procedure DetermineUsesSection(ACode: TCodeBuffer); @@ -73,13 +77,13 @@ type end; -function ShowUseUnitDialog(const DefText: string): TModalResult; +function ShowUseUnitDialog(const DefText: string; const aDlgType: TUseUnitDialogType): TModalResult; implementation {$R *.lfm} -function ShowUseUnitDialog(const DefText: string): TModalResult; +function ShowUseUnitDialog(const DefText: string; const aDlgType: TUseUnitDialogType): TModalResult; var UseUnitDlg: TUseUnitDialog; SrcEdit: TSourceEditor; @@ -100,6 +104,12 @@ begin end; UseUnitDlg:=TUseUnitDialog.Create(nil); try + UseUnitDlg.DlgType := aDlgType; + case aDlgType of + udUseUnit: UseUnitDlg.Caption := dlgUseUnitCaption; + udOpenUnit: UseUnitDlg.Caption := lisOpenUnit; + end; + if not UseUnitDlg.GetProjUnits(SrcEdit) then begin debugln(['ShowUseUnitDialog UseUnitDlg.GetProjUnits(SrcEdit) failed: ',SrcEdit.FileName]); Exit(mrCancel); @@ -116,7 +126,8 @@ begin // Read recent properties EnvOptions := EnvironmentOptions.UseUnitDlgOptions; UseUnitDlg.AllUnitsCheckBox.Checked := EnvOptions.AllUnits; - UseUnitDlg.SectionRadioGroup.ItemIndex:=Ord(EnvOptions.AddToImplementation); + UseUnitDlg.SectionRadioGroup.ItemIndex := Ord(EnvOptions.AddToImplementation); + UseUnitDlg.SectionRadioGroup.Visible := aDlgType=udUseUnit; if (UseUnitDlg.FilterEdit.Items.Count = 0) and UseUnitDlg.AllUnitsCheckBox.Checked then begin @@ -132,18 +143,32 @@ begin // Write recent properties EnvOptions.AllUnits := UseUnitDlg.AllUnitsCheckBox.Checked; - EnvOptions.AddToImplementation := Boolean(UseUnitDlg.SectionRadioGroup.ItemIndex); + if aDlgType=udUseUnit then + EnvOptions.AddToImplementation := Boolean(UseUnitDlg.SectionRadioGroup.ItemIndex); EnvironmentOptions.UseUnitDlgOptions := EnvOptions; - s:=UseUnitDlg.SelectedUnit; - if s <> '' then begin - if UseUnitDlg.InterfaceSelected then - CTRes := CodeToolBoss.AddUnitToMainUsesSection(SrcEdit.CodeBuffer, s, '') - else - CTRes:=CodeToolBoss.AddUnitToImplementationUsesSection(SrcEdit.CodeBuffer, s, ''); - if not CTRes then begin - LazarusIDE.DoJumpToCodeToolBossError; - exit(mrCancel); + case aDlgType of + udUseUnit: + begin + s:=UseUnitDlg.SelectedUnit; + if s <> '' then begin + if UseUnitDlg.InterfaceSelected then + CTRes := CodeToolBoss.AddUnitToMainUsesSection(SrcEdit.CodeBuffer, s, '') + else + CTRes:=CodeToolBoss.AddUnitToImplementationUsesSection(SrcEdit.CodeBuffer, s, ''); + if not CTRes then begin + LazarusIDE.DoJumpToCodeToolBossError; + exit(mrCancel); + end; + end; + end; + udOpenUnit: + begin + s:=UseUnitDlg.SelectedUnitFileName; + if FileExistsUTF8(s) then + Result := MainIDEInterface.DoOpenEditorFile(s,-1,-1,[ofAddToRecent]) + else + exit(mrCancel); end; end; end; @@ -153,14 +178,12 @@ begin end; end; - { TUseUnitDialog } procedure TUseUnitDialog.FormCreate(Sender: TObject); begin // Internationalization IDEDialogLayoutList.ApplyLayout(Self,500,460); - Caption := dlgUseUnitCaption; AllUnitsCheckBox.Caption := dlgShowAllUnits; SectionRadioGroup.Caption := dlgInsertSection; SectionRadioGroup.Items.Clear; @@ -309,16 +332,24 @@ var x: Integer; begin Result := False; - FMainUsedUnits := nil; - FImplUsedUnits := nil; + FreeAndNil(FMainUsedUnits); + FreeAndNil(FImplUsedUnits); if SrcEdit = nil then Exit; Assert(Assigned(SrcEdit.CodeBuffer)); - if not CodeToolBoss.FindUsedUnitNames(SrcEdit.CodeBuffer, TStrings(FMainUsedUnits), - TStrings(FImplUsedUnits)) - then begin - DebugLn(['ShowUseProjUnitDialog CodeToolBoss.FindUsedUnitNames failed']); - LazarusIDE.DoJumpToCodeToolBossError; - Exit; + if DlgType=udUseUnit then + begin + if not CodeToolBoss.FindUsedUnitNames(SrcEdit.CodeBuffer, TStrings(FMainUsedUnits), + TStrings(FImplUsedUnits)) + then begin + DebugLn(['ShowUseProjUnitDialog CodeToolBoss.FindUsedUnitNames failed']); + LazarusIDE.DoJumpToCodeToolBossError; + Exit; + end; + end else + begin + // don't filter units in current uses sections - use empty lists + FMainUsedUnits := TStringList.Create; + FImplUsedUnits := TStringList.Create; end; Result := True; if Assigned(FMainUsedUnits) then begin @@ -406,6 +437,20 @@ begin Result := ''; end; +function TUseUnitDialog.SelectedUnitFileName: string; +var + CodeBuf: TCodeBuffer; + AUnit: string; +begin + Result := ''; + AUnit := SelectedUnit; + if AUnit='' then + Exit; + CodeBuf := CodeToolBoss.FindUnitSource(SourceEditorManager.ActiveEditor.CodeBuffer, AUnit, ''); + if Assigned(CodeBuf) then + Result := CodeBuf.Filename; +end; + function TUseUnitDialog.InterfaceSelected: Boolean; begin Result:=SectionRadioGroup.ItemIndex=0; diff --git a/images/actions/laz_openunit.png b/images/actions/laz_openunit.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3e7985c183ffe1e5547ae02e56c2f160a9f3c0 GIT binary patch literal 686 zcmV;f0#W^mP)D5KR;Vfzpb!Z%f>egXcc4dbT1v5p6tGa?~4~cr@F?*lxpV^g36B#KYBzmnZT=P ztU#cJlp8~0$(9F7oRNX)Cvl||NCS*gXn$uoxwwWOL_|iRZDU%Zz_0slQ_$jLLxRmY zYQN^Gtv{u{{(_hrr|*biyHKPvp-87(y3%oSyAf`6gSqQdvkem?<%kV2VFIy&t*;YR z^XwItnC$Lnb@LeS)+TUb3F<+F@;111vPk~infZG&LxGEul+|^@8c0|rs+7r$%#!LE zr5D8z0$30Mgs&^xY<*ag!SRckT)wd25;?dXeRPlB*e?_;Hrzy)UL(dsw1?<2V)huH zyi4xws{Xj*>4;d`B@z+iV{2a;#ioMj5;iI##sghy=F5nwf&>hoN|`HnUZxu!1c+FT zjea*e84uB==DyhMT;3-T(Gavh~9-=EPu=N`}Ih&YW^IR@kVBB2dh1b*<~=i`|vgv%&02Yx*P)SD11&;F(U0?j>H Ur1R|wc>n+a07*qoM6N<$g6sr4fB*mh literal 0 HcmV?d00001 diff --git a/images/laz_images.res b/images/laz_images.res index 347fedf5b1eb1c41d97860fd9d9a57fd3fd6d02d..54bae514bf466b1af9ef04e22adbe06065cb4d2e 100644 GIT binary patch delta 644 zcmV-~0(_v7As99n577(C0pIrluzxzBU%RU*Rwgu{P^d(h$Yg`2Uh__gJZ z%+aiG(j;7emzeg5-rw%L_3%^eP=YP@>hi$w`Rv5m6T}lP1urDOSLt=MsX-j}1S1L^7Gct7xo1poNqh zLt@F62TGigf$1l4r4&d5j8bTSXE?dIh95*kMxkwgV_KrXulsFN(Bfl5g3UQ=l-n z?CxiE^BC{eCU9a2>Oq9^Hn?=MNdDZJ`Fk@%fs2xq)pf!eNLVGRl*x?DlIj_y7sU_) zSP%h!gs&^xY<*ag!SRckT)wd25;?dXeRPlB*e?_;Hrzy)UL(dsw1?<2V)huHyi4xw zs{Xj*>4;d`B@z+iV{2a;#ioMj5;iI##sghy=F5nwf&>hoN|`HnUZxu!1c+FTjea*e z84uB==DyhMT;3-T(GavhDK+LkeMwfL@Gyw2246^_L diff --git a/images/laz_images_list.txt b/images/laz_images_list.txt index 1b073aa827..144378dd8a 100644 --- a/images/laz_images_list.txt +++ b/images/laz_images_list.txt @@ -12,6 +12,7 @@ actions/laz_delete.png actions/laz_edit.png actions/laz_highlighter.png actions/laz_open.png +actions/laz_openunit.png actions/laz_refresh.png actions/laz_save.png actions/laz_set_color_default.png