IDE: Implement all IDE ToolButtons with a special behavior using the new API. By Ondrej Pokorny.

git-svn-id: trunk@49736 -
This commit is contained in:
juha 2015-09-02 05:28:06 +00:00
parent 0ca49a5f21
commit d66a3c37e6
7 changed files with 379 additions and 307 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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 ...';

View File

@ -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<MainIDEBar.OpenFilePopupMenu.Items.Count do begin
if MainIDEBar.OpenFilePopupMenu.Items[SeparatorIndex].Caption='-' then
break;
inc(SeparatorIndex);
end;
if Index=SeparatorIndex then exit;
if Index<SeparatorIndex then begin
// open recent project
AFilename:=EnvironmentOptions.RecentProjectFiles[Index];
DoOpenProjectFile(AFileName,[ofAddToRecent]);
end else begin
// open recent file
dec(Index, SeparatorIndex+1);
if DoOpenEditorFile(EnvironmentOptions.RecentOpenFiles[Index],-1,-1,
[ofAddToRecent])=mrOk then
begin
SetRecentFilesMenu;
SaveEnvironment;
end;
end;
end;
procedure TMainIDE.SetBuildModePopupMenuPopup(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(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;

View File

@ -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 Index<NewUFSetDefaultMenuItem.Count then
Item:=NewUFSetDefaultMenuItem[Index]
else begin
Item:=TMenuItem.Create(NewUFSetDefaultMenuItem);
Item.Name:='NewUFSetDefaultMenuItem'+IntToStr(Index);
Item.OnClick:=@NewUnitFormDefaultClick;
NewUFSetDefaultMenuItem.Add(Item);
end;
Item.Caption:=CurTemplate.LocalizedName;
Item.ShowAlwaysCheckable:=true;
Item.Checked:=SysUtils.CompareText(TemplateName,CurTemplate.Name)=0;
inc(Index);
end;
// remove unneeded items
while NewUFSetDefaultMenuItem.Count>Index 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);

View File

@ -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 TheIndex<SetDefaultMenuItem.Count then
Item:=SetDefaultMenuItem[TheIndex] as TNewFormUnitMenuItem
else begin
Item:=TNewFormUnitMenuItem.Create(SetDefaultMenuItem);
SetDefaultMenuItem.Add(Item);
end;
Item.OnClick:=@mnuSetFormUnitTemplate;
Item.Caption:=CurTemplate.LocalizedName;
Item.TemplateName:=CurTemplate.Name;
Item.ShowAlwaysCheckable:=true;
Item.Checked:=CompareText(TemplateName,CurTemplate.Name)=0;
inc(TheIndex);
end;
// remove unneeded items
while SetDefaultMenuItem.Count>TheIndex 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);