diff --git a/components/ideintf/menuintf.pas b/components/ideintf/menuintf.pas index cc18850cf0..cbc1047010 100644 --- a/components/ideintf/menuintf.pas +++ b/components/ideintf/menuintf.pas @@ -1798,7 +1798,6 @@ end; constructor TIDEMenuCommand.Create(const TheName: string); begin inherited Create(TheName); - FToolButtonClass := TIDEToolButton; FToolButtons := TIDEMenuCommandButtons.Create(nil); end; @@ -1806,7 +1805,6 @@ end; destructor TIDEMenuCommand.Destroy; begin FToolButtons.Free; - inherited Destroy; end; diff --git a/ide/editortoolbarstatic.pas b/ide/editortoolbarstatic.pas index ef272ace94..b3ef88d0ef 100644 --- a/ide/editortoolbarstatic.pas +++ b/ide/editortoolbarstatic.pas @@ -73,7 +73,7 @@ type procedure SetTbPos; procedure UpdateBar(Sender: TObject); protected - procedure AddButton(AMenuItem: TIDEMenuItem); + procedure AddButton(ACommand: TIDEMenuCommand); procedure PositionAtEnd(AToolbar: TToolbar; AButton: TToolButton); public constructor Create(AOwner: TComponent; ACollection: TAllEditorToolbars); overload; @@ -363,33 +363,30 @@ begin CfgButton := nil; end; -procedure TEditorToolbar.AddButton(AMenuItem: TIDEMenuItem); +procedure TEditorToolbar.AddButton(ACommand: TIDEMenuCommand); var B: TIDEToolButton; ACaption: string; iPos: Integer; begin - Assert(AMenuItem is TIDEMenuCommand, 'TEditorToolbar.AddButton: AMenuItem is not TIDEMenuCommand.'); - B := (AMenuItem as TIDEMenuCommand).ToolButtonClass.Create(TB); - ACaption := AMenuItem.Caption; + B := ACommand.ToolButtonClass.Create(TB); + ACaption := ACommand.Caption; DeleteAmpersands(ACaption); B.Caption := ACaption; // Get Shortcut, if any, and append to Hint - ACaption := ACaption + GetShortcut(AMenuItem); - B.Hint := ACaption; + ACaption := ACaption + GetShortcut(ACommand); + B.Hint := ACaption; // If we have a image, us it. Otherwise supply a default. - if AMenuItem.ImageIndex <> -1 then - B.ImageIndex := AMenuItem.ImageIndex + if ACommand.ImageIndex <> -1 then + B.ImageIndex := ACommand.ImageIndex else B.ImageIndex := IDEImages.LoadImage(16, 'execute'); - - B.Style := tbsButton; - B.IdeMenuItem := AMenuItem; - iPos := FButtonList.Add(AMenuItem); + B.Style := tbsButton; + B.IdeMenuItem := ACommand; + iPos := FButtonList.Add(ACommand); B.Tag:= iPos+1; PositionAtEnd(TB, B); - - TIDEMenuCommand(AMenuItem).ToolButtonAdded(B); + ACommand.ToolButtonAdded(B); end; // position the button next to the last button @@ -490,7 +487,7 @@ begin begin mi := IDEMenuRoots.FindByPath(ButtonName,false); if Assigned(mi) then - AddButton(mi); + AddButton(mi as TIDEMenuCommand); end; end; SetTbPos; diff --git a/ide/idecoolbardata.pas b/ide/idecoolbardata.pas index 2c77fb220d..70f7ae17e4 100644 --- a/ide/idecoolbardata.pas +++ b/ide/idecoolbardata.pas @@ -121,7 +121,7 @@ type procedure AddDivider; function GetCount: Integer; protected - procedure AddButton(AMenuItem: TIDEMenuItem); + procedure AddButton(ACommand: TIDEMenuCommand); procedure PositionAtEnd(AToolbar: TToolbar; AButton: TToolButton); public constructor Create; @@ -172,8 +172,6 @@ var implementation -uses MainBar; - const BasePath = 'IDECoolBarOptions/'; @@ -473,50 +471,31 @@ begin inherited Destroy; end; -procedure TIDEToolBar.AddButton(AMenuItem: TIDEMenuItem); +procedure TIDEToolBar.AddButton(ACommand: TIDEMenuCommand); var B: TIDEToolButton; ACaption: string; iPos: Integer; begin - Assert(AMenuItem is TIDEMenuCommand, 'TIDEToolBar.AddButton: AMenuItem is not TIDEMenuCommand.'); - B := (AMenuItem as TIDEMenuCommand).ToolButtonClass.Create(Toolbar); - ACaption := AMenuItem.Caption; + B := ACommand.ToolButtonClass.Create(Toolbar); + ACaption := ACommand.Caption; DeleteAmpersands(ACaption); - B.Caption := ACaption; + B.Caption := ACaption; // Get Shortcut, if any, and append to Hint - ACaption := ACaption + GetShortcut(AMenuItem); - B.Hint := ACaption; + ACaption := ACaption + GetShortcut(ACommand); + B.Hint := ACaption; // If we have a image, us it. Otherwise supply a default. - if AMenuItem.ImageIndex <> -1 then - B.ImageIndex := AMenuItem.ImageIndex + if ACommand.ImageIndex <> -1 then + B.ImageIndex := ACommand.ImageIndex else B.ImageIndex := IDEImages.LoadImage(16, 'execute'); - - B.Style := tbsButton; - if (AMenuItem.Name = 'itmFileNewForm') or (AMenuItem.Name = 'itmFileNewUnit') then - begin - B.PopupMenu := MainIDEBar.NewUnitFormPopupMenu; - B.Name := AMenuItem.Name; - end - else if AMenuItem.Name = 'itmProjectBuildMode' then - begin - B.Style := tbsDropDown; - B.DropdownMenu := MainIDEBar.SetBuildModePopupMenu; - end - else if AMenuItem.Name = 'itmFileOpen' then - begin - B.Style := tbsDropDown; - B.DropdownMenu := MainIDEBar.OpenFilePopUpMenu; - end; - - B.IdeMenuItem := AMenuItem; - iPos := FButtonList.Add(AMenuItem); + B.Style := tbsButton; + B.IdeMenuItem := ACommand; + iPos := FButtonList.Add(ACommand); B.Tag := iPos + 1; - //B.OnClick := AMenuItem.OnClick; + //B.OnClick := ACommand.OnClick; PositionAtEnd(ToolBar, B); - - TIDEMenuCommand(AMenuItem).ToolButtonAdded(B); + ACommand.ToolButtonAdded(B); end; // position the button next to the last button @@ -537,21 +516,21 @@ procedure TIDEToolBar.AddCustomItems(Index: Integer); const cDivider = '---------------'; var - MI: TIDEMenuItem; + mi: TIDEMenuItem; AName: string; begin ToolBar.BeginUpdate; try AName := FButtonNames[Index]; - if (AName <> '') then + if AName <> '' then begin if AName = cDivider then AddDivider else begin - MI := IDEMenuRoots.FindByPath(AName, False); - if Assigned(MI) then - AddButton(MI); + mi := IDEMenuRoots.FindByPath(AName, False); + if Assigned(mi) then + AddButton(mi as TIDEMenuCommand); end; end; UpdateBar(nil); diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index 9941c5228b..6887304463 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -271,6 +271,7 @@ resourcestring +'changing all build modes at once. Not implemented yet.'; lisMenuNewUnit = 'New Unit'; + lisMenuNewCustom = 'New %s'; lisMenuNewForm = 'New Form'; lisMenuNewOther = 'New ...'; lisMenuOpen = '&Open ...'; diff --git a/ide/main.pp b/ide/main.pp index b4dc083e27..dd6c00cc49 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -388,10 +388,7 @@ type procedure mnuPackageClicked(Sender: TObject); // package menu // see pkgmanager.pas - procedure mnuOpenFilePopupClick(Sender: TObject); - procedure SetBuildModePopupMenuPopup(Sender: TObject); procedure mnuChgBuildModeClicked(Sender: TObject); - procedure mnuSetBuildModeClick(Sender: TObject); // event for drop down items procedure ToolBarOptionsClick(Sender: TObject); private fBuilder: TLazarusBuilder; @@ -1477,9 +1474,7 @@ begin SetupStandardIDEMenuItems; SetupMainMenu; MainIDEBar.Setup(OwningComponent); - MainIDEBar.OpenFilePopupHandler := @mnuOpenFilePopupClick; MainIDEBar.OptionsMenuItem.OnClick := @ToolBarOptionsClick; - MainIDEBar.SetBuildModePopupMenu.OnPopup := @SetBuildModePopupMenuPopup; ConnectMainBarEvents; finally MainIDEBar.EnableAutoSizing{$IFDEF DebugDisableAutoSizing}('TMainIDE.Create'){$ENDIF}; @@ -3339,103 +3334,11 @@ end; {------------------------------------------------------------------------------} -procedure TMainIDE.mnuOpenFilePopupClick(Sender: TObject); -var - TheMenuItem: TMenuItem; - Index, SeparatorIndex: integer; - AFilename: string; -begin - TheMenuItem:=(Sender as TMenuItem); - if TheMenuItem.Caption='-' then exit; - Index:=TheMenuItem.MenuIndex; - SeparatorIndex:=0; - while SeparatorIndex CurIndex then - AMenuItem := aMenu.Items[CurIndex] - else - begin - AMenuItem := TMenuItem.Create(OwningComponent); - AMenuItem.Name := aMenu.Name + 'Mode' + IntToStr(CurIndex); - AMenuItem.OnClick := @mnuSetBuildModeClick; - aMenu.Items.Add(AMenuItem); - end; - AMenuItem.Caption := CurMode.GetCaption; - AMenuItem.Checked := (Project1<>nil) and (Project1.ActiveBuildMode=CurMode); - AMenuItem.ShowAlwaysCheckable:=true; - inc(CurIndex); - end; - -begin - // fill the PopupMenu: - CurIndex := 0; - aMenu := MainIDEBar.SetBuildModePopupMenu; - if Project1<>nil then - for i:=0 to Project1.BuildModes.Count-1 do - AddMode(Project1.BuildModes[i]); - // remove unused menuitems - while aMenu.Items.Count > CurIndex do - aMenu.Items[aMenu.Items.Count - 1].Free; -end; - procedure TMainIDE.mnuChgBuildModeClicked(Sender: TObject); begin DoOpenIDEOptions(TCompilerPathOptionsFrame, '', [TProjectCompilerOptions], []); end; -procedure TMainIDE.mnuSetBuildModeClick(Sender: TObject); -var - TheMenuItem: TMenuItem; - Index: LongInt; - NewMode: TProjectBuildMode; -begin - TheMenuItem:=(Sender as TMenuItem); - if TheMenuItem.Caption='-' then exit; - Index:=TheMenuItem.MenuIndex; - if (Index<0) or (Index>=Project1.BuildModes.Count) then exit; - NewMode:=Project1.BuildModes[Index]; - if NewMode=Project1.ActiveBuildMode then exit; - if not (ToolStatus in [itNone,itDebugger]) then begin - IDEMessageDialog('Error','You can not change the build mode while compiling.', - mtError,[mbOk]); - exit; - end; - - Project1.ActiveBuildMode:=NewMode; - MainBuildBoss.SetBuildTargetProject1(false); - UpdateCaption; -end; - function TMainIDE.CreateDesignerForComponent(AnUnitInfo: TUnitInfo; AComponent: TComponent): TCustomForm; var @@ -7805,6 +7708,7 @@ begin end; MainIDEBar.Caption := NewCaption; Application.Title := NewTitle; + TSetBuildModeToolButton.UpdateHints; end; procedure TMainIDE.HideIDE; diff --git a/ide/mainbar.pas b/ide/mainbar.pas index d52f7fe203..2af341b8cd 100644 --- a/ide/mainbar.pas +++ b/ide/mainbar.pas @@ -41,7 +41,7 @@ uses Classes, SysUtils, Math, Forms, Controls, Buttons, Menus, ComCtrls, ExtCtrls, LMessages, LCLIntf, LCLType, LCLProc, // IDEIntf - ProjectIntf, NewItemIntf, MenuIntf, LazIDEIntf, IDEWindowIntf, IDEImagesIntf, + ProjectIntf, MenuIntf, LazIDEIntf, IDEWindowIntf, IDEImagesIntf, LazFileCache, EnvironmentOpts, LazarusIDEStrConsts, ComponentReg, IdeCoolbarData; type @@ -53,10 +53,7 @@ type FMainOwningComponent: TComponent; FOldWindowState: TWindowState; FOnActive: TNotifyEvent; - FOpenFilePopupHandler: TNotifyEvent; procedure CreatePopupMenus(TheOwner: TComponent); - procedure NewUnitFormDefaultClick(Sender: TObject); - procedure NewUnitFormPopupMenuPopup(Sender: TObject); function CalcMainIDEHeight: Integer; function CalcNonClientHeight: Integer; protected @@ -70,9 +67,6 @@ type //Coolbar and PopUpMenus CoolBar: TCoolBar; OptionsMenuItem: TMenuItem; - OpenFilePopUpMenu: TPopupMenu; - SetBuildModePopupMenu: TPopupMenu; - NewUnitFormPopupMenu: TPopupMenu; NewUFSetDefaultMenuItem: TMenuItem; ComponentPageControl: TPageControl; // component palette //GlobalMouseSpeedButton: TSpeedButton; <- what is this @@ -383,14 +377,12 @@ type procedure MainSplitterMoved(Sender: TObject); procedure SetMainIDEHeightEvent(Sender: TObject); procedure OnMainBarActive(Sender: TObject); - procedure OpenFilePopupMenuPopup(Sender: TObject); procedure Setup(TheOwner: TComponent); procedure SetupHints; procedure UpdateIDEComponentPalette(IfFormChanged: boolean); procedure HideIDE; procedure UnhideIDE; property OnActive: TNotifyEvent read FOnActive write FOnActive; - property OpenFilePopupHandler: TNotifyEvent read FOpenFilePopupHandler write FOpenFilePopupHandler; procedure UpdateDockCaption({%H-}Exclude: TControl); override; procedure RefreshCoolbar; procedure SetMainIDEHeight; @@ -417,72 +409,6 @@ begin LazarusIDE.DoDropFiles(Sender,FileNames); end; -procedure TMainIDEBar.NewUnitFormDefaultClick(Sender: TObject); -var - Category: TNewIDEItemCategory; - i: Integer; - Item: TMenuItem; - Template: TNewIDEItemTemplate; -begin - Item:=Sender as TMenuItem; - Category:=NewIDEItems.FindCategoryByPath(FileDescGroupName,true); - i:=Item.MenuIndex; - if (i<0) or (i>=Category.Count) then exit; - Template:=Category[i]; - if NewUnitFormPopupMenu.Tag=1 then - EnvironmentOptions.NewUnitTemplate:=Template.Name - else - EnvironmentOptions.NewFormTemplate:=Template.Name; - //DebugLn(['TMainIDEBar.NewUFDefaultClick ',Template.Name]); - - EnvironmentOptions.Save(False); -end; - -procedure TMainIDEBar.NewUnitFormPopupMenuPopup(Sender: TObject); -var - TemplateName: String; - Category: TNewIDEItemCategory; - i: Integer; - CurTemplate: TNewIDEItemTemplate; - Index: Integer; - Item: TMenuItem; -begin - Category:=NewIDEItems.FindCategoryByPath(FileDescGroupName,true); - // find default template name - if NewUnitFormPopupMenu.PopupComponent.Name = 'itmFileNewUnit' then begin - TemplateName:=EnvironmentOptions.NewUnitTemplate; - if (TemplateName='') or (Category.FindTemplateByName(TemplateName)=nil) then - TemplateName:=FileDescNamePascalUnit; - NewUnitFormPopupMenu.Tag:=1; - end else begin - TemplateName:=EnvironmentOptions.NewFormTemplate; - if (TemplateName='') or (Category.FindTemplateByName(TemplateName)=nil) then - TemplateName:=FileDescNameLCLForm; - NewUnitFormPopupMenu.Tag:=2; - end; - // create menu items - Index:=0; - for i:=0 to Category.Count-1 do begin - CurTemplate:=Category[i]; - if not CurTemplate.VisibleInNewDialog then continue; - if IndexIndex do - NewUFSetDefaultMenuItem.Items[NewUFSetDefaultMenuItem.Count-1].Free; -end; - procedure TMainIDEBar.DoActive; begin if Assigned(FOnActive) then @@ -613,57 +539,6 @@ begin end; end; -procedure TMainIDEBar.OpenFilePopupMenuPopup(Sender: TObject); -var - CurIndex: integer; - OpenMenuItem: TPopupMenu; - - procedure AddFile(const Filename: string); - var - AMenuItem: TMenuItem; - begin - if OpenFilePopupMenu.Items.Count > CurIndex then - AMenuItem := OpenFilePopupMenu.Items[CurIndex] - else - begin - Assert(Assigned(FMainOwningComponent)); - AMenuItem := TMenuItem.Create(FMainOwningComponent); - AMenuItem.Name := OpenFilePopupMenu.Name + 'Recent' + IntToStr(CurIndex); - Assert(Assigned(OpenFilePopupHandler)); - AMenuItem.OnClick := OpenFilePopupHandler; // mnuOpenFilePopupClick; - OpenFilePopupMenu.Items.Add(AMenuItem); - end; - AMenuItem.Caption := Filename; - inc(CurIndex); - end; - - procedure AddFiles(List: TStringList; MaxCount: integer); - var - i: integer; - begin - i := 0; - while (i < List.Count) and (i < MaxCount) do - begin - AddFile(List[i]); - inc(i); - end; - end; - -begin - // fill the PopupMenu: - CurIndex := 0; - // first add 8 recent projects - AddFiles(EnvironmentOptions.RecentProjectFiles, 8); - // add a separator - AddFile('-'); - // add 12 recent files - AddFiles(EnvironmentOptions.RecentOpenFiles, 12); - OpenMenuItem := OpenFilePopupMenu; - // remove unused menuitems - while OpenMenuItem.Items.Count > CurIndex do - OpenMenuItem.Items[OpenMenuItem.Items.Count - 1].Free; -end; - procedure TMainIDEBar.WndProc(var Message: TLMessage); begin inherited WndProc(Message); @@ -702,22 +577,6 @@ end; procedure TMainIDEBar.CreatePopupMenus(TheOwner: TComponent); begin - // create the popupmenu for the OpenFileArrowSpeedBtn - OpenFilePopUpMenu := TPopupMenu.Create(TheOwner); - OpenFilePopupMenu.Name:='OpenFilePopupMenu'; - - SetBuildModePopupMenu:=TPopupMenu.Create(TheOwner); - SetBuildModePopupMenu.Name:='SetBuildModePopupMenu'; - - NewUnitFormPopupMenu:=TPopupMenu.Create(TheOwner); - NewUnitFormPopupMenu.Name:='NewUnitFormPopupMenu'; - NewUnitFormPopupMenu.OnPopup:=@NewUnitFormPopupMenuPopup; - - NewUFSetDefaultMenuItem:=TMenuItem.Create(TheOwner); - NewUFSetDefaultMenuItem.Name:='NewUFSetDefaultMenuItem'; - NewUFSetDefaultMenuItem.Caption:=lisSetDefault; - NewUnitFormPopupMenu.Items.Add(NewUFSetDefaultMenuItem); - OptionsPopupMenu := TPopupMenu.Create(TheOwner); OptionsPopupMenu.Images := IDEImages.Images_16; OptionsMenuItem := TMenuItem.Create(TheOwner); @@ -757,7 +616,6 @@ begin CoolBar.OnChange := @CoolBarOnChange; CreatePopupMenus(TheOwner); CoolBar.PopupMenu := OptionsPopupMenu; - OpenFilePopupMenu.OnPopup := @OpenFilePopupMenuPopup; // Component palette ComponentPageControl := TPageControl.Create(TheOwner); diff --git a/ide/mainbase.pas b/ide/mainbase.pas index ed8fd71880..dc01babde6 100644 --- a/ide/mainbase.pas +++ b/ide/mainbase.pas @@ -59,11 +59,11 @@ uses SysUtils, types, Controls, Graphics, ExtCtrls, Dialogs, LazFileUtils, Forms, CodeToolManager, AVL_Tree, SynEditKeyCmds, PackageIntf, // IDEIntf - IDEImagesIntf, SrcEditorIntf, LazIDEIntf, MenuIntf, - IDECommands, IDEWindowIntf, + IDEImagesIntf, SrcEditorIntf, LazIDEIntf, MenuIntf, NewItemIntf, + IDECommands, IDEWindowIntf, ProjectIntf, // IDE - LazConf, LazarusIDEStrConsts, ProjectDefs, Project, - TransferMacros, ObjectInspector, PropEdits, + LazConf, LazarusIDEStrConsts, ProjectDefs, Project, IDEDialogs, + TransferMacros, ObjectInspector, PropEdits, BuildManager, ToolbarConfig, EnvironmentOpts, EditorOptions, CompilerOptions, KeyMapping, IDEProcs, Debugger, IDEOptionDefs, Splash, Designer, SourceEditor, FindInFilesDlg, @@ -206,6 +206,79 @@ type procedure RefreshMenu; end; + { TSetBuildModeToolButton } + + TSetBuildModeToolButton = class(TIDEToolButton) + private + procedure RefreshMenu(Sender: TObject); + procedure mnuSetBuildModeClick(Sender: TObject); + public + procedure DoOnAdded; override; + + class procedure UpdateHints; + end; + + { TOpenFileToolButton } + + TOpenFileToolButton = class(TIDEToolButton) + private + procedure RefreshMenu(Sender: TObject); + procedure mnuOpenFile(Sender: TObject); + procedure mnuProjectFile(Sender: TObject); + public + procedure DoOnAdded; override; + end; + + { TOpenFileMenuItem } + + TOpenFileMenuItem = class(TMenuItem) + public + FileName: string; + end; + + { TNewFormUnitToolButton } + + TNewFormUnitToolButton = class(TIDEToolButton) + private + SetDefaultMenuItem: TMenuItem; + + procedure RefreshMenu(Sender: TObject); + procedure mnuSetFormUnitTemplate(Sender: TObject); + protected + class function FindDefaultTemplateName(Category: TNewIDEItemCategory): string; virtual; abstract; + class procedure SetTemplateName(const TemplateName: string); virtual; abstract; + class procedure UpdateHint(const AHint: string); virtual; abstract; + public + procedure DoOnAdded; override; + + class procedure UpdateHints; + end; + + { TNewUnitToolButton } + + TNewUnitToolButton = class(TNewFormUnitToolButton) + protected + class function FindDefaultTemplateName(Category: TNewIDEItemCategory): string; override; + class procedure SetTemplateName(const TemplateName: string); override; + class procedure UpdateHint(const AHint: string); override; + end; + + { TNewFormToolButton } + + TNewFormToolButton = class(TNewFormUnitToolButton) + protected + class function FindDefaultTemplateName(Category: TNewIDEItemCategory): string; override; + class procedure SetTemplateName(const TemplateName: string); override; + class procedure UpdateHint(const AHint: string); override; + end; + + { TNewFormUnitMenuItem } + + TNewFormUnitMenuItem = class(TMenuItem) + public + TemplateName: string; + end; + function GetMainIde: TMainIDEBase; property MainIDE: TMainIDEBase read GetMainIde; @@ -222,6 +295,267 @@ begin Result := TMainIDEBase(MainIDEInterface) end; +{ TNewFormUnitToolButton } + +procedure TNewFormUnitToolButton.DoOnAdded; +begin + inherited DoOnAdded; + + PopupMenu := TPopupMenu.Create(Self); + PopupMenu.OnPopup := @RefreshMenu; + + SetDefaultMenuItem:=TMenuItem.Create(PopupMenu); + SetDefaultMenuItem.Caption:=lisSetDefault; + PopupMenu.Items.Add(SetDefaultMenuItem); + + UpdateHints; +end; + +procedure TNewFormUnitToolButton.mnuSetFormUnitTemplate(Sender: TObject); +begin + SetTemplateName((Sender as TNewFormUnitMenuItem).TemplateName); + EnvironmentOptions.Save(False); + + UpdateHints; +end; + +procedure TNewFormUnitToolButton.RefreshMenu(Sender: TObject); +var + TemplateName: String; + Category: TNewIDEItemCategory; + i: Integer; + CurTemplate: TNewIDEItemTemplate; + TheIndex: Integer; + Item: TNewFormUnitMenuItem; +begin + Category:=NewIDEItems.FindCategoryByPath(FileDescGroupName,true); + TemplateName:=FindDefaultTemplateName(Category); + + // create menu items + TheIndex:=0; + for i:=0 to Category.Count-1 do begin + CurTemplate:=Category[i]; + if not CurTemplate.VisibleInNewDialog then continue; + if TheIndexTheIndex do + SetDefaultMenuItem.Items[SetDefaultMenuItem.Count-1].Free; +end; + +class procedure TNewFormUnitToolButton.UpdateHints; +var + Category: TNewIDEItemCategory; + TemplateName: String; + Template: TNewIDEItemTemplate; +begin + if not Assigned(NewIDEItems) then + Exit; + Category:=NewIDEItems.FindCategoryByPath(FileDescGroupName,true); + TemplateName:=FindDefaultTemplateName(Category); + if TemplateName<>'' then //try to get the LocalizedName + begin + Template:=Category.FindTemplateByName(TemplateName); + if Assigned(Template) then + TemplateName := Template.LocalizedName; + end; + UpdateHint(Format(lisMenuNewCustom, [TemplateName])); +end; + +{ TNewFormToolButton } + +class function TNewFormToolButton.FindDefaultTemplateName( + Category: TNewIDEItemCategory): string; +begin + Result:=EnvironmentOptions.NewFormTemplate; + if (Result='') or (Category.FindTemplateByName(Result)=nil) then + Result:=FileDescNameLCLForm; +end; + +class procedure TNewFormToolButton.SetTemplateName(const TemplateName: string); +begin + EnvironmentOptions.NewFormTemplate:=TemplateName; +end; + +class procedure TNewFormToolButton.UpdateHint(const AHint: string); +begin + MainIDEBar.itmFileNewForm.Hint := AHint; +end; + +{ TNewUnitToolButton } + +class function TNewUnitToolButton.FindDefaultTemplateName( + Category: TNewIDEItemCategory): string; +begin + Result:=EnvironmentOptions.NewUnitTemplate; + if (Result='') or (Category.FindTemplateByName(Result)=nil) then + Result:=FileDescNamePascalUnit; +end; + +class procedure TNewUnitToolButton.SetTemplateName(const TemplateName: string); +begin + EnvironmentOptions.NewUnitTemplate:=TemplateName; +end; + +class procedure TNewUnitToolButton.UpdateHint(const AHint: string); +begin + MainIDEBar.itmFileNewUnit.Hint := AHint; +end; + +{ TOpenFileToolButton } + +procedure TOpenFileToolButton.DoOnAdded; +begin + inherited DoOnAdded; + + DropdownMenu := TPopupMenu.Create(Self); + DropdownMenu.OnPopup := @RefreshMenu; + Style := tbsDropDown; +end; + +procedure TOpenFileToolButton.mnuOpenFile(Sender: TObject); +begin + if MainIDE.DoOpenEditorFile((Sender as TOpenFileMenuItem).FileName,-1,-1, + [ofAddToRecent])=mrOk then + begin + MainIDE.SetRecentFilesMenu; + MainIDE.SaveEnvironment; + end; +end; + +procedure TOpenFileToolButton.mnuProjectFile(Sender: TObject); +begin + MainIDE.DoOpenProjectFile((Sender as TOpenFileMenuItem).FileName,[ofAddToRecent]); +end; + +procedure TOpenFileToolButton.RefreshMenu(Sender: TObject); + procedure AddFile(const AFileName: string; const AOnClick: TNotifyEvent); + var + AMenuItem: TOpenFileMenuItem; + begin + AMenuItem := TOpenFileMenuItem.Create(DropdownMenu); + AMenuItem.OnClick := AOnClick; + AMenuItem.FileName := AFileName; + DropdownMenu.Items.Add(AMenuItem); + AMenuItem.Caption := AFilename; + end; + + procedure AddFiles(List: TStringList; MaxCount: integer; const AOnClick: TNotifyEvent); + var + i: integer; + begin + i := 0; + while (i < List.Count) and (i < MaxCount) do + begin + AddFile(List[i], AOnClick); + inc(i); + end; + end; + +begin + DropdownMenu.Items.Clear; + + // first add 8 recent projects + AddFiles(EnvironmentOptions.RecentProjectFiles, 8, @mnuProjectFile); + // add a separator + DropdownMenu.Items.AddSeparator; + // add 12 recent files + AddFiles(EnvironmentOptions.RecentOpenFiles, 12, @mnuOpenFile); +end; + +{ TSetBuildModeToolButton } + +procedure TSetBuildModeToolButton.DoOnAdded; +begin + inherited DoOnAdded; + + DropdownMenu := TPopupMenu.Create(Self); + DropdownMenu.OnPopup := @RefreshMenu; + Style := tbsDropDown; + UpdateHints; +end; + +procedure TSetBuildModeToolButton.mnuSetBuildModeClick(Sender: TObject); +var + TheMenuItem: TMenuItem; + TheIndex: LongInt; + NewMode: TProjectBuildMode; +begin + TheMenuItem := (Sender as TMenuItem); + if TheMenuItem.Caption = '-' then exit; + TheIndex := TheMenuItem.MenuIndex; + if (TheIndex < 0) or (TheIndex >= Project1.BuildModes.Count) then exit; + NewMode := Project1.BuildModes[TheIndex]; + if NewMode = Project1.ActiveBuildMode then exit; + if not (MainIDE.ToolStatus in [itNone,itDebugger]) then begin + IDEMessageDialog('Error','You can not change the build mode while compiling.', + mtError,[mbOk]); + exit; + end; + + Project1.ActiveBuildMode := NewMode; + MainBuildBoss.SetBuildTargetProject1(false); + MainIDE.UpdateCaption; +end; + +procedure TSetBuildModeToolButton.RefreshMenu(Sender: TObject); +var + aMenu: TPopupMenu; + CurIndex: Integer; + i: Integer; + + procedure AddMode(CurMode: TProjectBuildMode); + var + AMenuItem: TMenuItem; + begin + if aMenu.Items.Count > CurIndex then + AMenuItem := aMenu.Items[CurIndex] + else + begin + AMenuItem := TMenuItem.Create(DropdownMenu); + AMenuItem.Name := aMenu.Name + 'Mode' + IntToStr(CurIndex); + AMenuItem.OnClick := @mnuSetBuildModeClick; + aMenu.Items.Add(AMenuItem); + end; + AMenuItem.Caption := CurMode.GetCaption; + AMenuItem.Checked := (Project1<>nil) and (Project1.ActiveBuildMode=CurMode); + AMenuItem.ShowAlwaysCheckable:=true; + inc(CurIndex); + end; + +begin + // fill the PopupMenu: + CurIndex := 0; + aMenu := DropdownMenu; + if Project1<>nil then + for i:=0 to Project1.BuildModes.Count-1 do + AddMode(Project1.BuildModes[i]); + // remove unused menuitems + while aMenu.Items.Count > CurIndex do + aMenu.Items[aMenu.Items.Count - 1].Free; +end; + +class procedure TSetBuildModeToolButton.UpdateHints; +const + cActiveBuildMode = '[%s]'; +begin + if Assigned(Project1) then + MainIDEBar.itmProjectBuildMode.Hint := + lisChangeBuildMode + GetShortcut(MainIDEBar.itmProjectBuildMode) + sLineBreak + + Format(cActiveBuildMode, [Project1.ActiveBuildMode.GetCaption]); +end; + { TJumpToSectionToolButton } procedure TJumpToSectionToolButton.DoOnAdded; @@ -242,15 +576,12 @@ begin end; procedure TJumpToSectionToolButton.RefreshMenu; -var - xPM: TPopupMenu; begin if DropdownMenu = nil then begin - xPM := TPopupMenu.Create(Self); + DropdownMenu := TPopupMenu.Create(Self); if Assigned(FToolBar) then - xPM.Images := FToolBar.Images; - DropdownMenu := xPM; + DropdownMenu.Images := FToolBar.Images; Style := tbsDropDown; end; DropdownMenu.Items.Clear; @@ -1143,9 +1474,12 @@ begin with MainIDEBar do begin // file menu itmFileNewUnit.Command:=GetCommand(ecNewUnit); + itmFileNewUnit.ToolButtonClass:=TNewUnitToolButton; itmFileNewForm.Command:=GetCommand(ecNewForm); + itmFileNewForm.ToolButtonClass:=TNewFormToolButton; itmFileNewOther.Command:=GetCommand(ecNew); itmFileOpen.Command:=GetCommand(ecOpen); + itmFileOpen.ToolButtonClass:=TOpenFileToolButton; itmFileRevert.Command:=GetCommand(ecRevert); itmFileSave.Command:=GetCommand(ecSave); itmFileSaveAs.Command:=GetCommand(ecSaveAs); @@ -1301,6 +1635,7 @@ begin itmProjectViewUnits.Command:=GetCommand(ecViewProjectUnits); itmProjectViewForms.Command:=GetCommand(ecViewProjectForms); itmProjectViewSource.Command:=GetCommand(ecViewProjectSource); + itmProjectBuildMode.ToolButtonClass:=TSetBuildModeToolButton; // run menu itmRunMenuCompile.Command:=GetCommand(ecCompile);