mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-02 01:59:29 +01:00
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:
parent
0ca49a5f21
commit
d66a3c37e6
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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 ...';
|
||||
|
||||
98
ide/main.pp
98
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<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;
|
||||
|
||||
144
ide/mainbar.pas
144
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 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);
|
||||
|
||||
353
ide/mainbase.pas
353
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 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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user