ide: add drop down build mode menu for options button in project inspector.

git-svn-id: trunk@53699 -
This commit is contained in:
ondrej 2016-12-16 12:32:02 +00:00
parent b5255eebaa
commit 0b5c0aac35
3 changed files with 85 additions and 72 deletions

View File

@ -3833,7 +3833,8 @@ procedure TMainIDE.UpdateProjectCommands(Sender: TObject);
var var
ASrcEdit: TSourceEditor; ASrcEdit: TSourceEditor;
AUnitInfo: TUnitInfo; AUnitInfo: TUnitInfo;
xCmd: TIDECommand; ACmd: TIDECommand;
ABuildHint: string;
begin begin
GetCurrentUnit(ASrcEdit,AUnitInfo); GetCurrentUnit(ASrcEdit,AUnitInfo);
if not UpdateProjectCommandsStamp.Changed(AUnitInfo) then if not UpdateProjectCommandsStamp.Changed(AUnitInfo) then
@ -3842,14 +3843,17 @@ begin
IDECommandList.FindIDECommand(ecAddCurUnitToProj).Enabled:=Assigned(AUnitInfo) and not AUnitInfo.IsPartOfProject; IDECommandList.FindIDECommand(ecAddCurUnitToProj).Enabled:=Assigned(AUnitInfo) and not AUnitInfo.IsPartOfProject;
IDECommandList.FindIDECommand(ecBuildManyModes).Enabled:=(Project1<>nil) and (Project1.BuildModes.Count>1); IDECommandList.FindIDECommand(ecBuildManyModes).Enabled:=(Project1<>nil) and (Project1.BuildModes.Count>1);
xCmd := IDECommandList.FindIDECommand(ecProjectChangeBuildMode); ACmd := IDECommandList.FindIDECommand(ecProjectChangeBuildMode);
if Assigned(Project1) then if Assigned(Project1) then
xCmd.Hint := ABuildHint :=
Trim(lisChangeBuildMode + ' ' + KeyValuesToCaptionStr(xCmd.ShortcutA, xCmd.ShortcutB, '(')) + sLineBreak + Trim(lisChangeBuildMode + ' ' + KeyValuesToCaptionStr(ACmd.ShortcutA, ACmd.ShortcutB, '(')) + sLineBreak +
Format('[%s]', [Project1.ActiveBuildMode.GetCaption]) Format('[%s]', [Project1.ActiveBuildMode.GetCaption])
else else
xCmd.Hint := ABuildHint :=
Trim(lisChangeBuildMode + ' ' + KeyValuesToCaptionStr(xCmd.ShortcutA, xCmd.ShortcutB, '(')); Trim(lisChangeBuildMode + ' ' + KeyValuesToCaptionStr(ACmd.ShortcutA, ACmd.ShortcutB, '('));
ACmd.Hint := ABuildHint;
ProjInspector.OptionsBitBtn.Hint := ABuildHint;
end; end;
procedure TMainIDE.UpdatePackageCommands(Sender: TObject); procedure TMainIDE.UpdatePackageCommands(Sender: TObject);

View File

@ -207,9 +207,17 @@ type
{ TSetBuildModeToolButton } { TSetBuildModeToolButton }
TSetBuildModeToolButton = class(TIDEToolButton) TSetBuildModeToolButton = class(TIDEToolButton)
private public type
procedure RefreshMenu(Sender: TObject); TBuildModeMenuItem = class(TMenuItem)
procedure mnuSetBuildModeClick(Sender: TObject); public
BuildModeIndex: Integer;
procedure Click; override;
end;
TBuildModeMenu = class(TPopupMenu)
protected
procedure DoPopup(Sender: TObject); override;
end;
public public
procedure DoOnAdded; override; procedure DoOnAdded; override;
end; end;
@ -296,6 +304,66 @@ begin
Result := TMainIDEBase(MainIDEInterface) Result := TMainIDEBase(MainIDEInterface)
end; end;
{ TSetBuildModeToolButton.TBuildModeMenu }
procedure TSetBuildModeToolButton.TBuildModeMenu.DoPopup(Sender: TObject);
var
CurIndex: Integer;
i: Integer;
procedure AddMode(BuildModeIndex: Integer; CurMode: TProjectBuildMode);
var
AMenuItem: TBuildModeMenuItem;
begin
if Items.Count > CurIndex then
AMenuItem := Items[CurIndex] as TBuildModeMenuItem
else
begin
AMenuItem := TBuildModeMenuItem.Create(DropdownMenu);
AMenuItem.Name := Name + 'Mode' + IntToStr(CurIndex);
Items.Add(AMenuItem);
end;
AMenuItem.BuildModeIndex := BuildModeIndex;
AMenuItem.Caption := CurMode.GetCaption;
AMenuItem.Checked := (Project1<>nil) and (Project1.ActiveBuildMode=CurMode);
AMenuItem.ShowAlwaysCheckable:=true;
inc(CurIndex);
end;
begin
// fill the PopupMenu
CurIndex := 0;
if Project1<>nil then
for i:=0 to Project1.BuildModes.Count-1 do
AddMode(i, Project1.BuildModes[i]);
// remove unused menuitems
while Items.Count > CurIndex do
Items[Items.Count - 1].Free;
inherited DoPopup(Sender);
end;
{ TSetBuildModeToolButton.TBuildModeMenuItem }
procedure TSetBuildModeToolButton.TBuildModeMenuItem.Click;
var
NewMode: TProjectBuildMode;
begin
inherited Click;
NewMode := Project1.BuildModes[BuildModeIndex];
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;
{ TNewFormUnitToolButton } { TNewFormUnitToolButton }
procedure TNewFormUnitToolButton.DoOnAdded; procedure TNewFormUnitToolButton.DoOnAdded;
@ -502,71 +570,10 @@ procedure TSetBuildModeToolButton.DoOnAdded;
begin begin
inherited DoOnAdded; inherited DoOnAdded;
DropdownMenu := TPopupMenu.Create(Self); DropdownMenu := TBuildModeMenu.Create(Self);
DropdownMenu.OnPopup := @RefreshMenu;
Style := tbsDropDown; Style := tbsDropDown;
end; 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;
{ TJumpToSectionToolButton } { TJumpToSectionToolButton }
procedure TJumpToSectionToolButton.DoOnAdded; procedure TJumpToSectionToolButton.DoOnAdded;

View File

@ -64,7 +64,7 @@ uses
// IDE // IDE
LazarusIDEStrConsts, IDEProcs, DialogProcs, IDEOptionDefs, EnvironmentOpts, LazarusIDEStrConsts, IDEProcs, DialogProcs, IDEOptionDefs, EnvironmentOpts,
PackageDefs, Project, PackageEditor, AddToProjectDlg, AddPkgDependencyDlg, PackageDefs, Project, PackageEditor, AddToProjectDlg, AddPkgDependencyDlg,
InputHistory, ProjPackChecks; InputHistory, MainBase, ProjPackChecks;
type type
TOnAddUnitToProject = TOnAddUnitToProject =
@ -1027,6 +1027,8 @@ begin
RemoveBitBtn := CreateToolButton('RemoveBitBtn', lisRemove, lisPckEditRemoveSelectedItem, 'laz_delete', @RemoveBitBtnClick); RemoveBitBtn := CreateToolButton('RemoveBitBtn', lisRemove, lisPckEditRemoveSelectedItem, 'laz_delete', @RemoveBitBtnClick);
CreateDivider; CreateDivider;
OptionsBitBtn := CreateToolButton('OptionsBitBtn', lisOptions, lisPckEditEditGeneralOptions, 'menu_environment_options', @OptionsBitBtnClick); OptionsBitBtn := CreateToolButton('OptionsBitBtn', lisOptions, lisPckEditEditGeneralOptions, 'menu_environment_options', @OptionsBitBtnClick);
OptionsBitBtn.DropdownMenu := TSetBuildModeToolButton.TBuildModeMenu.Create(Self);
OptionsBitBtn.Style := tbsDropDown;
HelpBitBtn := CreateToolButton('HelpBitBtn', GetButtonCaption(idButtonHelp), lisMenuOnlineHelp, 'menu_help', @HelpBitBtnClick); HelpBitBtn := CreateToolButton('HelpBitBtn', GetButtonCaption(idButtonHelp), lisMenuOnlineHelp, 'menu_help', @HelpBitBtnClick);
AddBitBtn.DropdownMenu:=AddPopupMenu; AddBitBtn.DropdownMenu:=AddPopupMenu;