diff --git a/.gitattributes b/.gitattributes index 07a4f65686..515643b582 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4588,6 +4588,8 @@ ide/buildlazdialog.pas svneol=native#text/pascal ide/buildmanager.pas svneol=native#text/plain ide/buildmodediffdlg.lfm svneol=native#text/plain ide/buildmodediffdlg.pas svneol=native#text/plain +ide/buildmodesmanager.lfm svneol=native#text/plain +ide/buildmodesmanager.pas svneol=native#text/plain ide/buildprofilemanager.lfm svneol=native#text/plain ide/buildprofilemanager.pas svneol=native#text/plain ide/buildprojectdlg.lfm svneol=native#text/plain diff --git a/ide/buildmodesmanager.lfm b/ide/buildmodesmanager.lfm new file mode 100644 index 0000000000..05a29d9e1d --- /dev/null +++ b/ide/buildmodesmanager.lfm @@ -0,0 +1,148 @@ +object BuildModesForm: TBuildModesForm + Left = 473 + Height = 366 + Top = 550 + Width = 612 + Caption = 'BuildModesForm' + ClientHeight = 366 + ClientWidth = 612 + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + LCLVersion = '1.1' + object BuildModesGroupBox: TGroupBox + Left = 6 + Height = 305 + Top = 6 + Width = 600 + Align = alTop + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Around = 6 + Caption = 'BuildModesGroupBox' + ClientHeight = 288 + ClientWidth = 596 + TabOrder = 0 + object BuildModesStringGrid: TStringGrid + AnchorSideTop.Control = BuildModeAddSpeedButton + AnchorSideTop.Side = asrBottom + Left = 0 + Height = 266 + Top = 22 + Width = 596 + Align = alBottom + Anchors = [akTop, akLeft, akRight, akBottom] + AutoFillColumns = True + ColCount = 3 + Columns = < + item + ButtonStyle = cbsCheckboxColumn + MaxSize = 50 + Title.Caption = 'Active' + Width = 197 + end + item + ButtonStyle = cbsCheckboxColumn + MaxSize = 50 + Title.Caption = 'InSession' + Width = 197 + end + item + MaxSize = 500 + SizePriority = 100 + Title.Caption = 'Title' + Width = 198 + end> + FixedCols = 0 + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing, goSmoothScroll] + TabOrder = 0 + OnCheckboxToggled = BuildModesCheckboxToggled + OnSelection = BuildModesStringGridSelection + OnValidateEntry = BuildModesStringGridValidateEntry + ColWidths = ( + 197 + 197 + 198 + ) + end + object BuildModeAddSpeedButton: TSpeedButton + AnchorSideLeft.Control = BuildModesGroupBox + AnchorSideTop.Control = BuildModesGroupBox + Left = 0 + Height = 22 + Top = 0 + Width = 23 + OnClick = BuildModeAddSpeedButtonClick + ShowHint = True + ParentShowHint = False + end + object BuildModeDeleteSpeedButton: TSpeedButton + AnchorSideLeft.Control = BuildModeAddSpeedButton + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = BuildModesGroupBox + Left = 23 + Height = 22 + Top = 0 + Width = 23 + OnClick = BuildModeDeleteSpeedButtonClick + ShowHint = True + ParentShowHint = False + end + object BuildModeMoveUpSpeedButton: TSpeedButton + AnchorSideLeft.Control = BuildModeDeleteSpeedButton + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = BuildModesGroupBox + Left = 46 + Height = 22 + Top = 0 + Width = 23 + OnClick = BuildModeMoveUpSpeedButtonClick + ShowHint = True + ParentShowHint = False + end + object BuildModeMoveDownSpeedButton: TSpeedButton + AnchorSideLeft.Control = BuildModeMoveUpSpeedButton + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = BuildModesGroupBox + Left = 69 + Height = 22 + Top = 0 + Width = 23 + OnClick = BuildModeMoveDownSpeedButtonClick + ShowHint = True + ParentShowHint = False + end + object BuildModeDiffSpeedButton: TSpeedButton + AnchorSideLeft.Control = BuildModeMoveDownSpeedButton + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = BuildModesGroupBox + Left = 102 + Height = 22 + Top = 0 + Width = 23 + BorderSpacing.Left = 10 + OnClick = BuildModeDiffSpeedButtonClick + ShowHint = True + ParentShowHint = False + end + end + object ButtonPanel1: TButtonPanel + Left = 6 + Height = 38 + Top = 322 + Width = 600 + OKButton.Name = 'OKButton' + OKButton.DefaultCaption = True + HelpButton.Name = 'HelpButton' + HelpButton.DefaultCaption = True + CloseButton.Name = 'CloseButton' + CloseButton.DefaultCaption = True + CancelButton.Name = 'CancelButton' + CancelButton.DefaultCaption = True + TabOrder = 1 + ShowButtons = [pbOK, pbCancel, pbHelp] + end + object BuildModesPopupMenu: TPopupMenu + left = 208 + top = 88 + end +end diff --git a/ide/buildmodesmanager.pas b/ide/buildmodesmanager.pas new file mode 100644 index 0000000000..e4a7bb73c1 --- /dev/null +++ b/ide/buildmodesmanager.pas @@ -0,0 +1,467 @@ +unit BuildModesManager; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, + Grids, Buttons, Menus, ButtonPanel, LCLProc, + ProjectIntf, IDEImagesIntf, IDEOptionsIntf, CompOptsIntf, + PackageDefs, TransferMacros, //compiler_inherited_options, + PathEditorDlg, Project, LazarusIDEStrConsts, CompilerOptions, // PackageSystem, + IDEProcs, BuildModeDiffDlg; + +type + + { TBuildModesForm } + + TBuildModesForm = class(TForm) + BuildModeAddSpeedButton: TSpeedButton; + BuildModeDeleteSpeedButton: TSpeedButton; + BuildModeDiffSpeedButton: TSpeedButton; + BuildModeMoveDownSpeedButton: TSpeedButton; + BuildModeMoveUpSpeedButton: TSpeedButton; + BuildModesGroupBox: TGroupBox; + BuildModesPopupMenu: TPopupMenu; + BuildModesStringGrid: TStringGrid; + ButtonPanel1: TButtonPanel; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure BuildModeDiffSpeedButtonClick(Sender: TObject); + procedure BuildModeAddSpeedButtonClick(Sender: TObject); + procedure BuildModeDeleteSpeedButtonClick(Sender: TObject); + procedure BuildModeMoveDownSpeedButtonClick(Sender: TObject); + procedure BuildModeMoveUpSpeedButtonClick(Sender: TObject); + procedure BuildModesCheckboxToggled(Sender: TObject; + aCol, aRow: Integer; aState: TCheckboxState); + procedure BuildModesStringGridSelection(Sender: TObject; + aCol, aRow: Integer); + procedure BuildModesStringGridValidateEntry(Sender: TObject; + aCol, aRow: Integer; const OldValue: string; var NewValue: String); + procedure FormShow(Sender: TObject); + private + FOnLoadOptionsHook: TOnLoadIDEOptions; + FOnSaveOptionsHook: TOnSaveIDEOptions; + FLoadShowSessionFromProject: boolean; + FProject: TProject; + FShowSession: boolean; + FSwitchingMode: boolean; + fModeActiveCol: integer; + fModeInSessionCol: integer; + fModeNameCol: integer; + procedure FillBuildModesGrid; + procedure UpdateBuildModeButtons; + procedure ActivateMode(aMode: TProjectBuildMode); + procedure UpdateShowSession; + procedure SetShowSession(const AValue: boolean); + procedure DoShowSession; + procedure UpdateDialogCaption; + public + property SwitchingMode: boolean read FSwitchingMode; // the active mode is currently switched + property ShowSession: boolean read FShowSession write SetShowSession; + property LoadShowSessionFromProject: boolean read FLoadShowSessionFromProject + write FLoadShowSessionFromProject; + function GetSelectedBuildMode: TProjectBuildMode; + public + property OnLoadIDEOptionsHook: TOnLoadIDEOptions read FOnLoadOptionsHook write FOnLoadOptionsHook; + property OnSaveIDEOptionsHook: TOnSaveIDEOptions read FOnSaveOptionsHook write FOnSaveOptionsHook; + end; + +var + BuildModesForm: TBuildModesForm; + +implementation + +{$R *.lfm} + +{ TBuildModesForm } + +procedure TBuildModesForm.FormCreate(Sender: TObject); +begin + ; +end; + +procedure TBuildModesForm.FormDestroy(Sender: TObject); +begin + ; +end; + +procedure TBuildModesForm.FormShow(Sender: TObject); +begin + FProject:=Project1; // Now hardcoded. + // modes + UpdateShowSession; + FillBuildModesGrid; + UpdateBuildModeButtons; + // options dialog + UpdateDialogCaption; + + BuildModesGroupBox.Caption:=lisBuildModes; + DoShowSession; + + BuildModeAddSpeedButton.LoadGlyphFromLazarusResource('laz_add'); + BuildModeDeleteSpeedButton.LoadGlyphFromLazarusResource('laz_delete'); + BuildModeMoveUpSpeedButton.LoadGlyphFromLazarusResource('arrow_up'); + BuildModeMoveDownSpeedButton.LoadGlyphFromLazarusResource('arrow_down'); + BuildModeDiffSpeedButton.LoadGlyphFromLazarusResource('menu_tool_diff'); +end; + +procedure TBuildModesForm.BuildModeDiffSpeedButtonClick(Sender: TObject); +begin + FSwitchingMode:=true; + try + // save changes + OnSaveIDEOptionsHook(Self,FProject.CompilerOptions); + // show diff dialog + ShowBuildModeDiffDialog(GetSelectedBuildMode); + IncreaseBuildMacroChangeStamp; + // load options + OnLoadIDEOptionsHook(Self,FProject.CompilerOptions); + finally + FSwitchingMode:=false; + end; +end; + +procedure TBuildModesForm.BuildModeAddSpeedButtonClick(Sender: TObject); +var + i: Integer; + NewName: String; + Identifier: String; + CurMode: TProjectBuildMode; + NewMode: TProjectBuildMode; +begin + // use current mode as template + i:=BuildModesStringGrid.Row-1; + if (i>=0) then + begin + Identifier:=BuildModesStringGrid.Cells[fModeNameCol,i+1]; + CurMode:=FProject.BuildModes[i]; + end + else begin + Identifier:='Mode'; + CurMode:=nil; + end; + // find unique name + i:=0; + repeat + inc(i); + NewName:=Identifier+IntToStr(i); + until FProject.BuildModes.Find(NewName)=nil; + // create new mode + NewMode:=FProject.BuildModes.Add(NewName); + // clone + if CurMode<>nil then + NewMode.Assign(CurMode); + // show + FillBuildModesGrid; + // activate + ActivateMode(NewMode); + // select identifier + BuildModesStringGrid.Col:=fModeNameCol; + BuildModesStringGrid.Row:=BuildModesStringGrid.RowCount-1; + BuildModesStringGrid.EditorMode:=true; +end; + +procedure TBuildModesForm.BuildModeDeleteSpeedButtonClick(Sender: TObject); +var + i: Integer; + CurMode: TProjectBuildMode; + Grid: TStringGrid; +begin + Grid:=BuildModesStringGrid; + i:=Grid.Row-1; + if i<0 then exit; + if FProject.BuildModes.Count=1 then + begin + MessageDlg(lisCCOErrorCaption, lisThereMustBeAtLeastOneBuildMode, + mtError,[mbCancel],0); + exit; + end; + CurMode:=FProject.BuildModes[i]; + // when delete the activated: activate another + if FProject.ActiveBuildMode=CurMode then + begin + if i=Grid.RowCount then + Grid.Row:=Grid.RowCount-1 + else + Grid.Row:=i; +end; + +procedure TBuildModesForm.BuildModeMoveDownSpeedButtonClick(Sender: TObject); +var + i: Integer; +begin + i:=BuildModesStringGrid.Row-1; + if i+1>=FProject.BuildModes.Count then exit; + FProject.BuildModes.Move(i,i+1); + FProject.BuildModes[0].InSession:=false; + inc(i); + FillBuildModesGrid; + BuildModesStringGrid.Row:=i+1; +end; + +procedure TBuildModesForm.BuildModeMoveUpSpeedButtonClick(Sender: TObject); +var + i: Integer; +begin + i:=BuildModesStringGrid.Row-1; + if i<=0 then exit; + FProject.BuildModes.Move(i,i-1); + dec(i); + FProject.BuildModes[0].InSession:=false; + FillBuildModesGrid; + BuildModesStringGrid.Row:=i+1; +end; + +procedure TBuildModesForm.BuildModesCheckboxToggled(Sender: TObject; + aCol, aRow: Integer; aState: TCheckboxState); +var + CurMode: TProjectBuildMode; + b: Boolean; + i: Integer; + Grid: TStringGrid; +begin + debugln(['TBuildModesForm.BuildModesCheckboxToggled Row=',aRow,' Col=',aCol,' ',ord(aState)]); + i:=aRow-1; + if (i<0) or (i>=FProject.BuildModes.Count) then exit; + CurMode:=FProject.BuildModes[i]; + Grid:=BuildModesStringGrid; + if aCol=fModeActiveCol then + begin + // activate + if CurMode=FProject.ActiveBuildMode then begin + debugln(['TBuildModesForm.BuildModesCheckboxToggled, is ActiveBuildMode',i]); + // there must always be an active mode + Grid.Cells[aCol,aRow]:=Grid.Columns[aCol].ValueChecked; + end + else begin + debugln(['TBuildModesForm.BuildModesCheckboxToggled, another Mode',i]); + ActivateMode(CurMode); + end; + end else if aCol=fModeInSessionCol then + begin + // in session + b:=aState=cbChecked; + if b and (i=0) then + begin + Grid.Cells[aCol,aRow]:=Grid.Columns[aCol].ValueUnchecked; + MessageDlg(lisCCOErrorCaption, + lisTheFirstBuildModeIsTheDefaultModeAndMustBeStoredIn, + mtError,[mbCancel],0); + exit; + end; + CurMode.InSession:=b; + end; +end; + +procedure TBuildModesForm.BuildModesStringGridSelection(Sender: TObject; + aCol, aRow: Integer); +begin + UpdateBuildModeButtons; +end; + +procedure TBuildModesForm.BuildModesStringGridValidateEntry(Sender: TObject; + aCol, aRow: Integer; const OldValue: string; var NewValue: String); +var + CurMode: TProjectBuildMode; + s: string; + j: Integer; + b: Boolean; + i: Integer; +begin + debugln(['TBuildModesForm.BuildModesStringGridValidateEntry Row=',aRow,' Col=',aCol]); + i:=aRow-1; + if (i<0) or (i>=FProject.BuildModes.Count) then exit; + CurMode:=FProject.BuildModes[i]; + if aCol=fModeInSessionCol then + begin + // in session + b:=NewValue=BuildModesStringGrid.Columns[aCol].ValueChecked; + if b and (i=0) then + begin + NewValue:=OldValue; + MessageDlg(lisCCOErrorCaption,lisTheFirstBuildModeIsTheDefaultModeAndMustBeStoredIn, + mtError,[mbCancel],0); + exit; + end; + CurMode.InSession:=b; + end + else if aCol=fModeNameCol then + begin + // identifier + s:=NewValue; + for j:=1 to length(s) do + if s[j]<' ' then + s[j]:=' '; + CurMode.Identifier:=s; + NewValue:=s; + end; + UpdateDialogCaption; +end; + +procedure TBuildModesForm.FillBuildModesGrid; +var + i: Integer; + CurMode: TProjectBuildMode; + Grid: TStringGrid; +begin + if FProject=nil then exit; + + Grid:=BuildModesStringGrid; + Grid.BeginUpdate; + Grid.RowCount:=FProject.BuildModes.Count+1; + + for i:=0 to FProject.BuildModes.Count-1 do begin + CurMode:=FProject.BuildModes[i]; + // active + if CurMode=FProject.ActiveBuildMode then + Grid.Cells[fModeActiveCol,i+1]:=Grid.Columns[fModeActiveCol].ValueChecked + else + Grid.Cells[fModeActiveCol,i+1]:=Grid.Columns[fModeActiveCol].ValueUnchecked; + // in session + if fModeInSessionCol>=0 then + if CurMode.InSession then + Grid.Cells[fModeInSessionCol,i+1]:=Grid.Columns[fModeInSessionCol].ValueChecked + else + Grid.Cells[fModeInSessionCol,i+1]:=Grid.Columns[fModeInSessionCol].ValueUnchecked; + // identifier + Grid.Cells[fModeNameCol,i+1]:=CurMode.Identifier; + end; + Grid.EndUpdate(true); +end; + +procedure TBuildModesForm.UpdateBuildModeButtons; +var + i: Integer; + CurMode: TProjectBuildMode; + Identifier: string; +begin + i:=BuildModesStringGrid.Row-1; + if (FProject<>nil) and (FProject.BuildModes<>nil) + and (i>=0) and (inil) and (FProject.BuildModes.Count>1); + BuildModeDeleteSpeedButton.Hint:=Format(lisDeleteMode, [Identifier]); + BuildModeMoveUpSpeedButton.Enabled:=(CurMode<>nil) and (i>0); + BuildModeMoveUpSpeedButton.Hint:=Format(lisMoveOnePositionUp, [Identifier]); + BuildModeMoveDownSpeedButton.Enabled:=inil) Does not work, why? + // and (FProject.SessionStorage in [pssInProjectDir,pssInIDEConfig]); +end; + +procedure TBuildModesForm.SetShowSession(const AValue: boolean); +begin + if AValue=FShowSession then exit; + FShowSession:=AValue; + DoShowSession; + FillBuildModesGrid; +end; + +procedure TBuildModesForm.DoShowSession; +var + Grid: TStringGrid; +begin + Grid:=BuildModesStringGrid; + Grid.BeginUpdate; + fModeActiveCol:=0; + if FShowSession then + begin + fModeInSessionCol:=1; + fModeNameCol:=2; + if Grid.Columns.Count<3 then + Grid.Columns.Insert(fModeInSessionCol); + end else begin + fModeInSessionCol:=-1; + fModeNameCol:=1; + if Grid.Columns.Count>2 then + Grid.Columns.Delete(1); + end; + BuildModesStringGrid.Columns[fModeActiveCol].Title.Caption:=lisActive; + BuildModesStringGrid.Columns[fModeActiveCol].SizePriority:=1; + BuildModesStringGrid.Columns[fModeActiveCol].ButtonStyle:=cbsCheckboxColumn; + if fModeInSessionCol>=0 then + begin + BuildModesStringGrid.Columns[fModeInSessionCol].Title.Caption:=lisInSession; + BuildModesStringGrid.Columns[fModeInSessionCol].SizePriority:=1; + BuildModesStringGrid.Columns[fModeInSessionCol].ButtonStyle:=cbsCheckboxColumn; + end; + BuildModesStringGrid.Columns[fModeNameCol].Title.Caption:=lisName; + BuildModesStringGrid.Columns[fModeNameCol].SizePriority:=10; + BuildModesStringGrid.Columns[fModeNameCol].ButtonStyle:=cbsAuto; + Grid.EndUpdate(true); +end; + +procedure TBuildModesForm.UpdateDialogCaption; +var + s: String; +begin + if FProject<>nil then + begin + s := FProject.GetTitleOrName; + s:=Format(dlgProjectOptionsFor, [s]); + if FProject.BuildModes.Count>1 then + s:=s+', '+copy(FProject.ActiveBuildMode.GetCaption,1,12); + end else + s:='TBuildModesEditorFrame.GetDialogCaption: no project'; + Caption:=s; +end; + +function TBuildModesForm.GetSelectedBuildMode: TProjectBuildMode; +var + i: LongInt; +begin + Result:=nil; + if FProject=nil then exit; + i:=BuildModesStringGrid.Row-1; + if (i<0) or (i>=FProject.BuildModes.Count) then exit; + Result:=FProject.BuildModes[i]; +end; + +end. +