IDE: Let user create Debug and Release build modes with one button click. Issues #22743 and #19641

git-svn-id: trunk@42217 -
This commit is contained in:
juha 2013-07-28 09:14:25 +00:00
parent 84ef01e07a
commit 9b06e79ee7
3 changed files with 134 additions and 55 deletions

View File

@ -24,15 +24,16 @@ object BuildModesForm: TBuildModesForm
ClientWidth = 596 ClientWidth = 596
TabOrder = 0 TabOrder = 0
object BuildModesStringGrid: TStringGrid object BuildModesStringGrid: TStringGrid
AnchorSideTop.Control = BuildModeAddSpeedButton AnchorSideTop.Control = AddSpeedButton
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
Left = 0 Left = 0
Height = 264 Height = 263
Top = 22 Top = 23
Width = 596 Width = 596
Align = alBottom Align = alBottom
Anchors = [akTop, akLeft, akRight, akBottom] Anchors = [akTop, akLeft, akRight, akBottom]
AutoFillColumns = True AutoFillColumns = True
BorderSpacing.Top = 1
ColCount = 3 ColCount = 3
Columns = < Columns = <
item item
@ -66,55 +67,55 @@ object BuildModesForm: TBuildModesForm
198 198
) )
end end
object BuildModeAddSpeedButton: TSpeedButton object AddSpeedButton: TSpeedButton
AnchorSideLeft.Control = BuildModesGroupBox AnchorSideLeft.Control = BuildModesGroupBox
AnchorSideTop.Control = BuildModesGroupBox AnchorSideTop.Control = BuildModesGroupBox
Left = 0 Left = 0
Height = 22 Height = 22
Top = 0 Top = 0
Width = 23 Width = 23
OnClick = BuildModeAddSpeedButtonClick OnClick = AddSpeedButtonClick
ShowHint = True ShowHint = True
ParentShowHint = False ParentShowHint = False
end end
object BuildModeDeleteSpeedButton: TSpeedButton object DeleteSpeedButton: TSpeedButton
AnchorSideLeft.Control = BuildModeAddSpeedButton AnchorSideLeft.Control = AddSpeedButton
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = BuildModesGroupBox AnchorSideTop.Control = BuildModesGroupBox
Left = 23 Left = 23
Height = 22 Height = 22
Top = 0 Top = 0
Width = 23 Width = 23
OnClick = BuildModeDeleteSpeedButtonClick OnClick = DeleteSpeedButtonClick
ShowHint = True ShowHint = True
ParentShowHint = False ParentShowHint = False
end end
object BuildModeMoveUpSpeedButton: TSpeedButton object MoveUpSpeedButton: TSpeedButton
AnchorSideLeft.Control = BuildModeDeleteSpeedButton AnchorSideLeft.Control = DeleteSpeedButton
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = BuildModesGroupBox AnchorSideTop.Control = BuildModesGroupBox
Left = 46 Left = 46
Height = 22 Height = 22
Top = 0 Top = 0
Width = 23 Width = 23
OnClick = BuildModeMoveUpSpeedButtonClick OnClick = MoveUpSpeedButtonClick
ShowHint = True ShowHint = True
ParentShowHint = False ParentShowHint = False
end end
object BuildModeMoveDownSpeedButton: TSpeedButton object MoveDownSpeedButton: TSpeedButton
AnchorSideLeft.Control = BuildModeMoveUpSpeedButton AnchorSideLeft.Control = MoveUpSpeedButton
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = BuildModesGroupBox AnchorSideTop.Control = BuildModesGroupBox
Left = 69 Left = 69
Height = 22 Height = 22
Top = 0 Top = 0
Width = 23 Width = 23
OnClick = BuildModeMoveDownSpeedButtonClick OnClick = MoveDownSpeedButtonClick
ShowHint = True ShowHint = True
ParentShowHint = False ParentShowHint = False
end end
object BuildModeDiffSpeedButton: TSpeedButton object DiffSpeedButton: TSpeedButton
AnchorSideLeft.Control = BuildModeMoveDownSpeedButton AnchorSideLeft.Control = MoveDownSpeedButton
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = BuildModesGroupBox AnchorSideTop.Control = BuildModesGroupBox
Left = 102 Left = 102
@ -122,18 +123,33 @@ object BuildModesForm: TBuildModesForm
Top = 0 Top = 0
Width = 23 Width = 23
BorderSpacing.Left = 10 BorderSpacing.Left = 10
OnClick = BuildModeDiffSpeedButtonClick OnClick = DiffSpeedButtonClick
ShowHint = True ShowHint = True
ParentShowHint = False ParentShowHint = False
end end
object NoteLabel: TLabel object NoteLabel: TLabel
AnchorSideTop.Control = DiffSpeedButton
AnchorSideTop.Side = asrCenter
Left = 160 Left = 160
Height = 15 Height = 15
Top = 3 Top = 4
Width = 63 Width = 63
Caption = 'NoteLabel' Caption = 'NoteLabel'
ParentColor = False ParentColor = False
end end
object btnCreateDefaultModes: TButton
AnchorSideTop.Control = NoteLabel
AnchorSideTop.Side = asrCenter
Left = 362
Height = 25
Top = -1
Width = 228
Anchors = [akTop, akRight]
AutoSize = True
Caption = 'Create Debug and Release modes'
OnClick = btnCreateDefaultModesClick
TabOrder = 1
end
end end
object ButtonPanel1: TButtonPanel object ButtonPanel1: TButtonPanel
Left = 6 Left = 6

View File

@ -32,34 +32,36 @@ interface
uses uses
Classes, SysUtils, Forms, Controls, Dialogs, StdCtrls, Grids, Buttons, Menus, Classes, SysUtils, Forms, Controls, Dialogs, StdCtrls, Grids, Buttons, Menus,
ButtonPanel, LCLProc, Graphics, IDEOptionsIntf, IDEDialogs, TransferMacros, ButtonPanel, LCLProc, Graphics, IDEOptionsIntf, IDEDialogs, TransferMacros,
Project, LazarusIDEStrConsts, CompilerOptions, Compiler_ModeMatrix, Project, CompOptsIntf, CompilerOptions, Compiler_ModeMatrix,
BuildModeDiffDlg; BuildModeDiffDlg, LazarusIDEStrConsts;
type type
{ TBuildModesForm } { TBuildModesForm }
TBuildModesForm = class(TForm) TBuildModesForm = class(TForm)
BuildModeAddSpeedButton: TSpeedButton; AddSpeedButton: TSpeedButton;
BuildModeDeleteSpeedButton: TSpeedButton; DeleteSpeedButton: TSpeedButton;
BuildModeDiffSpeedButton: TSpeedButton; DiffSpeedButton: TSpeedButton;
BuildModeMoveDownSpeedButton: TSpeedButton; MoveDownSpeedButton: TSpeedButton;
BuildModeMoveUpSpeedButton: TSpeedButton; MoveUpSpeedButton: TSpeedButton;
BuildModesGroupBox: TGroupBox; BuildModesGroupBox: TGroupBox;
BuildModesPopupMenu: TPopupMenu; BuildModesPopupMenu: TPopupMenu;
BuildModesStringGrid: TStringGrid; BuildModesStringGrid: TStringGrid;
btnCreateDefaultModes: TButton;
ButtonPanel1: TButtonPanel; ButtonPanel1: TButtonPanel;
NoteLabel: TLabel; NoteLabel: TLabel;
procedure btnCreateDefaultModesClick(Sender: TObject);
procedure BuildModesStringGridDrawCell(Sender: TObject; aCol, procedure BuildModesStringGridDrawCell(Sender: TObject; aCol,
aRow: Integer; aRect: TRect; aState: TGridDrawState); aRow: Integer; aRect: TRect; aState: TGridDrawState);
procedure CancelButtonClick(Sender: TObject); procedure CancelButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
procedure BuildModeDiffSpeedButtonClick(Sender: TObject); procedure DiffSpeedButtonClick(Sender: TObject);
procedure BuildModeAddSpeedButtonClick(Sender: TObject); procedure AddSpeedButtonClick(Sender: TObject);
procedure BuildModeDeleteSpeedButtonClick(Sender: TObject); procedure DeleteSpeedButtonClick(Sender: TObject);
procedure BuildModeMoveDownSpeedButtonClick(Sender: TObject); procedure MoveDownSpeedButtonClick(Sender: TObject);
procedure BuildModeMoveUpSpeedButtonClick(Sender: TObject); procedure MoveUpSpeedButtonClick(Sender: TObject);
procedure BuildModesCheckboxToggled(Sender: TObject; procedure BuildModesCheckboxToggled(Sender: TObject;
aCol, aRow: Integer; aState: TCheckboxState); aCol, aRow: Integer; aState: TCheckboxState);
procedure BuildModesStringGridSelection(Sender: TObject; procedure BuildModesStringGridSelection(Sender: TObject;
@ -103,6 +105,10 @@ procedure UpdateBuildModeCombo(aCombo: TComboBox);
implementation implementation
const
DebugModeName = 'Debug';
ReleaseModeName = 'Release';
{$R *.lfm} {$R *.lfm}
function ShowBuildModesDlg(aShowSession: Boolean): TModalResult; function ShowBuildModesDlg(aShowSession: Boolean): TModalResult;
@ -137,12 +143,11 @@ begin
end; end;
end; end;
procedure SwitchBuildMode(aBuildModeID: string; procedure SwitchBuildMode(aBuildModeID: string; LoadSaveProjectOptions: boolean);
LoadSaveProjectOptions: boolean);
begin begin
if LoadSaveProjectOptions then if LoadSaveProjectOptions then
OnSaveIDEOptionsHook(Nil, Project1.CompilerOptions); // Save changes OnSaveIDEOptionsHook(Nil, Project1.CompilerOptions); // Save changes
Project1.ActiveBuildModeID := aBuildModeID; // Switch Project1.ActiveBuildModeID := aBuildModeID; // Switch
IncreaseBuildMacroChangeStamp; IncreaseBuildMacroChangeStamp;
if LoadSaveProjectOptions then if LoadSaveProjectOptions then
OnLoadIDEOptionsHook(Nil, Project1.CompilerOptions); // Load options OnLoadIDEOptionsHook(Nil, Project1.CompilerOptions); // Load options
@ -207,20 +212,74 @@ begin
FillBuildModesGrid; FillBuildModesGrid;
UpdateBuildModeButtons; UpdateBuildModeButtons;
BuildModeAddSpeedButton.LoadGlyphFromLazarusResource('laz_add'); AddSpeedButton.LoadGlyphFromLazarusResource('laz_add');
BuildModeDeleteSpeedButton.LoadGlyphFromLazarusResource('laz_delete'); DeleteSpeedButton.LoadGlyphFromLazarusResource('laz_delete');
BuildModeMoveUpSpeedButton.LoadGlyphFromLazarusResource('arrow_up'); MoveUpSpeedButton.LoadGlyphFromLazarusResource('arrow_up');
BuildModeMoveDownSpeedButton.LoadGlyphFromLazarusResource('arrow_down'); MoveDownSpeedButton.LoadGlyphFromLazarusResource('arrow_down');
BuildModeDiffSpeedButton.LoadGlyphFromLazarusResource('menu_tool_diff'); DiffSpeedButton.LoadGlyphFromLazarusResource('menu_tool_diff');
end; end;
procedure TBuildModesForm.BuildModeDiffSpeedButtonClick(Sender: TObject); procedure TBuildModesForm.DiffSpeedButtonClick(Sender: TObject);
begin begin
// show diff dialog // show diff dialog
ShowBuildModeDiffDialog(BuildModes,GetSelectedBuildMode); ShowBuildModeDiffDialog(BuildModes,GetSelectedBuildMode);
end; end;
procedure TBuildModesForm.BuildModeAddSpeedButtonClick(Sender: TObject); procedure TBuildModesForm.btnCreateDefaultModesClick(Sender: TObject);
var
CurMode: TProjectBuildMode;
procedure AssignAndSetBooleans(aMode: TProjectBuildMode; IsDebug: Boolean);
begin
if CurMode<>nil then
aMode.Assign(CurMode); // clone from currently selected mode
with aMode.CompilerOptions do
begin
// Smart linking
SmartLinkUnit:=not IsDebug;
LinkSmart:=not IsDebug;
// Checks
IOChecks:=IsDebug;
RangeChecks:=IsDebug;
OverflowChecks:=IsDebug;
StackChecks:=IsDebug;
IncludeAssertionCode:=IsDebug;
// Debug flags
GenerateDebugInfo:=IsDebug;
UseHeaptrc:=IsDebug;
// ToDo: TrashVariables:=IsDebug;
end;
end;
var
DMode, RMode: TProjectBuildMode;
i: Integer;
begin
i:=BuildModesStringGrid.Row-1;
if (i>=0) then
CurMode:=fBuildModes[i]
else
CurMode:=nil;
// Create Debug DMode
DMode:=fBuildModes.Add(DebugModeName);
AssignAndSetBooleans(DMode, True);
DMode.CompilerOptions.OptimizationLevel:=1; // Optimization
DMode.CompilerOptions.DebugInfoType:=dsDwarf2Set; // Debug
// Create Release DMode
RMode:=fBuildModes.Add(ReleaseModeName);
AssignAndSetBooleans(RMode, False);
RMode.CompilerOptions.OptimizationLevel:=3; // Optimization
RMode.CompilerOptions.DebugInfoType:=dsAuto; // Debug
fActiveBuildMode:=DMode; // activate Debug mode
FillBuildModesGrid; // show
// select identifier
BuildModesStringGrid.Col:=fModeNameCol;
BuildModesStringGrid.Row:=BuildModesStringGrid.RowCount-1;
end;
procedure TBuildModesForm.AddSpeedButtonClick(Sender: TObject);
var var
i: Integer; i: Integer;
NewName, Identifier: String; NewName, Identifier: String;
@ -245,7 +304,7 @@ begin
until fBuildModes.Find(NewName)=nil; until fBuildModes.Find(NewName)=nil;
// create new mode // create new mode
NewMode:=fBuildModes.Add(NewName); NewMode:=fBuildModes.Add(NewName);
// clone // clone from currently selected mode
if CurMode<>nil then if CurMode<>nil then
NewMode.Assign(CurMode); NewMode.Assign(CurMode);
fActiveBuildMode:=NewMode; // activate fActiveBuildMode:=NewMode; // activate
@ -256,7 +315,7 @@ begin
BuildModesStringGrid.EditorMode:=true; BuildModesStringGrid.EditorMode:=true;
end; end;
procedure TBuildModesForm.BuildModeDeleteSpeedButtonClick(Sender: TObject); procedure TBuildModesForm.DeleteSpeedButtonClick(Sender: TObject);
var var
i: Integer; i: Integer;
CurMode: TProjectBuildMode; CurMode: TProjectBuildMode;
@ -294,7 +353,7 @@ begin
Grid.Row:=i; Grid.Row:=i;
end; end;
procedure TBuildModesForm.BuildModeMoveDownSpeedButtonClick(Sender: TObject); procedure TBuildModesForm.MoveDownSpeedButtonClick(Sender: TObject);
var var
i: Integer; i: Integer;
begin begin
@ -307,7 +366,7 @@ begin
BuildModesStringGrid.Row:=i+1; BuildModesStringGrid.Row:=i+1;
end; end;
procedure TBuildModesForm.BuildModeMoveUpSpeedButtonClick(Sender: TObject); procedure TBuildModesForm.MoveUpSpeedButtonClick(Sender: TObject);
var var
i: Integer; i: Integer;
begin begin
@ -467,15 +526,19 @@ begin
else else
Caption:='No project'; Caption:='No project';
// Buttons // Buttons
BuildModeAddSpeedButton.Hint:=Format(lisAddNewBuildModeCopyingSettingsFrom, [Identifier]); AddSpeedButton.Hint:=Format(lisAddNewBuildModeCopyingSettingsFrom, [Identifier]);
BuildModeDeleteSpeedButton.Enabled:=(CurMode<>nil) and (fBuildModes.Count>1); DeleteSpeedButton.Enabled:=(CurMode<>nil) and (fBuildModes.Count>1);
BuildModeDeleteSpeedButton.Hint:=Format(lisDeleteMode, [Identifier]); DeleteSpeedButton.Hint:=Format(lisDeleteMode, [Identifier]);
BuildModeMoveUpSpeedButton.Enabled:=(CurMode<>nil) and (i>0); MoveUpSpeedButton.Enabled:=(CurMode<>nil) and (i>0);
BuildModeMoveUpSpeedButton.Hint:=Format(lisMoveOnePositionUp, [Identifier]); MoveUpSpeedButton.Hint:=Format(lisMoveOnePositionUp, [Identifier]);
BuildModeMoveDownSpeedButton.Enabled:=i<BuildModesStringGrid.RowCount-2; MoveDownSpeedButton.Enabled:=i<BuildModesStringGrid.RowCount-2;
BuildModeMoveDownSpeedButton.Hint:=Format(lisMoveOnePositionDown, [Identifier]); MoveDownSpeedButton.Hint:=Format(lisMoveOnePositionDown, [Identifier]);
BuildModeDiffSpeedButton.Hint:=lisShowDifferencesBetweenModes; DiffSpeedButton.Hint:=lisShowDifferencesBetweenModes;
NoteLabel.Caption:=''; NoteLabel.Caption:='';
btnCreateDefaultModes.Caption:='Create Debug and Release modes';
btnCreateDefaultModes.Hint:='';
btnCreateDefaultModes.Enabled := (fBuildModes.Find(DebugModeName)=Nil)
and (fBuildModes.Find(ReleaseModeName)=Nil);
end; end;
procedure TBuildModesForm.SetShowSession(const AValue: boolean); procedure TBuildModesForm.SetShowSession(const AValue: boolean);

View File

@ -105,12 +105,12 @@ begin
end; end;
grpLinking.Enabled := NeedsLinkerOpts; grpLinking.Enabled := NeedsLinkerOpts;
chkLinkSmart.Checked := LinkSmart; chkLinkSmart.Checked := LinkSmart;
//chkLinkSmart.Enabled := NeedsLinkerOpts; chkLinkSmart.Enabled := NeedsLinkerOpts;
chkWin32GraphicApp.Checked := Win32GraphicApp; chkWin32GraphicApp.Checked := Win32GraphicApp;
//chkWin32GraphicApp.Enabled := NeedsLinkerOpts; chkWin32GraphicApp.Enabled := NeedsLinkerOpts;
chkOptionsLinkOpt.Checked := PassLinkerOptions; chkOptionsLinkOpt.Checked := PassLinkerOptions;
chkOptionsLinkOpt.Enabled := NeedsLinkerOpts;
edtOptionsLinkOpt.Text := LinkerOptions; edtOptionsLinkOpt.Text := LinkerOptions;
//chkOptionsLinkOpt.Enabled := NeedsLinkerOpts;
end; end;
end; end;