IDE: compiler options: show session column only if session separate

git-svn-id: trunk@27752 -
This commit is contained in:
mattias 2010-10-18 16:43:49 +00:00
parent 4ae44f8cb3
commit 3c1071b4f1
5 changed files with 199 additions and 97 deletions

View File

@ -71,18 +71,25 @@ type
procedure BuildModesStringGridValidateEntry(sender: TObject; aCol,
aRow: Integer; const OldValue: string; var NewValue: String);
private
FLoadShowSessionFromProject: boolean;
FMacroValues: TProjectBuildMacros;
FProject: TProject;
FShowSession: boolean;
FSwitchingMode: boolean;
fActiveCol: integer;
fInSessionCol: integer;
fNameCol: integer;
procedure UpdateMacrosControls;
function GetAllBuildMacros: TStrings;
procedure CleanMacrosGrid;
procedure SaveMacros(UpdateControls: boolean);
procedure UpdateInheritedOptions;
function FindOptionFrame(AClass: TComponentClass): TComponent;
procedure FillBuildModesGrid;
procedure UpdateBuildModeButtons;
procedure ActivateMode(aMode: TProjectBuildMode);
procedure UpdateShowSession;
procedure SetShowSession(const AValue: boolean);
procedure DoShowSession;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
@ -94,6 +101,9 @@ type
property AProject: TProject read FProject;
property MacroValues: TProjectBuildMacros read FMacroValues;
property SwitchingMode: boolean read FSwitchingMode; // the active mode is currently switched
property ShowSession: boolean read FShowSession write SetShowSession;
property LoadShowSessionFromProjects: boolean read FLoadShowSessionFromProject
write FLoadShowSessionFromProject;
end;
implementation
@ -210,7 +220,7 @@ begin
// activate
ActivateMode(NewMode);
// select identifier
BuildModesStringGrid.Col:=2;
BuildModesStringGrid.Col:=fNameCol;
BuildModesStringGrid.Row:=BuildModesStringGrid.RowCount-1;
BuildModesStringGrid.EditorMode:=true;
end;
@ -227,7 +237,7 @@ begin
if i<0 then exit;
if AProject.BuildModes.Count=1 then
begin
MessageDlg('Error','There must be at least one build mode.',
MessageDlg(lisCCOErrorCaption, lisThereMustBeAtLeastOneBuildMode,
mtError,[mbCancel],0);
exit;
end;
@ -292,30 +302,29 @@ begin
//debugln(['TBuildModesEditorFrame.BuildModesStringGridCheckboxToggled ',i]);
CurMode:=AProject.BuildModes[i];
Grid:=BuildModesStringGrid;
case aCol of
0:
if aCol=fActiveCol then
begin
// activate
if CurMode=AProject.ActiveBuildMode then
// there must always be an active mode
Grid.Cells[aCol,aRow]:=Grid.Columns[aCol].ValueChecked
else
ActivateMode(CurMode);
1:
end else if aCol=fInSessionCol then
begin
// in session
b:=aState=cbChecked;
if b and (i=0) then
begin
Grid.Cells[aCol,aRow]:=Grid.Columns[aCol].ValueUnchecked;
MessageDlg('Error',
'The first build mode is the default mode and must be stored in the project, not in the session.',
MessageDlg(lisCCOErrorCaption,
lisTheFirstBuildModeIsTheDefaultModeAndMustBeStoredIn,
mtError,[mbCancel],0);
exit;
end;
CurMode.InSession:=b;
end;
end;
end;
procedure TBuildModesEditorFrame.BuildModesStringGridSelectCell(
Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean);
@ -344,25 +353,21 @@ begin
if (i<0) or (i>=AProject.BuildModes.Count) then exit;
//debugln(['TBuildModesEditorFrame.SaveModes ',i]);
CurMode:=AProject.BuildModes[i];
case aCol of
0:
// activate is done in BuildModesStringGridCheckboxToggled
;
1:
if aCol=fInSessionCol then
begin
// in session
b:=NewValue=BuildModesStringGrid.Columns[1].ValueChecked;
b:=NewValue=BuildModesStringGrid.Columns[aCol].ValueChecked;
if b and (i=0) then
begin
NewValue:=OldValue;
MessageDlg('Error',
'The first build mode is the default mode and must be stored in the project, not in the session.',
MessageDlg(lisCCOErrorCaption,
lisTheFirstBuildModeIsTheDefaultModeAndMustBeStoredIn2,
mtError,[mbCancel],0);
exit;
end;
CurMode.InSession:=b;
end;
2:
end
else if aCol=fNameCol then
begin
// identifier
s:=NewValue;
@ -372,7 +377,6 @@ begin
NewValue:=s;
end;
end;
end;
procedure TBuildModesEditorFrame.UpdateMacrosControls;
var
@ -391,6 +395,48 @@ begin
Grid.Cells[1,i]:='';
end;
procedure TBuildModesEditorFrame.SetShowSession(const AValue: boolean);
begin
if AValue=FShowSession then exit;
FShowSession:=AValue;
DoShowSession;
FillBuildModesGrid;
end;
procedure TBuildModesEditorFrame.DoShowSession;
var
Grid: TStringGrid;
begin
Grid:=BuildModesStringGrid;
Grid.BeginUpdate;
fActiveCol:=0;
if FShowSession then
begin
fInSessionCol:=1;
fNameCol:=2;
if Grid.Columns.Count<3 then
Grid.Columns.Insert(fInSessionCol);
end else begin
fInSessionCol:=-1;
fNameCol:=1;
if Grid.Columns.Count>2 then
Grid.Columns.Delete(1);
end;
BuildModesStringGrid.Columns[fActiveCol].Title.Caption:=lisActive;
BuildModesStringGrid.Columns[fActiveCol].SizePriority:=1;
BuildModesStringGrid.Columns[fActiveCol].ButtonStyle:=cbsCheckboxColumn;
if fInSessionCol>=0 then
begin
BuildModesStringGrid.Columns[fInSessionCol].Title.Caption:=lisInSession;
BuildModesStringGrid.Columns[fInSessionCol].SizePriority:=1;
BuildModesStringGrid.Columns[fInSessionCol].ButtonStyle:=cbsCheckboxColumn;
end;
BuildModesStringGrid.Columns[fNameCol].Title.Caption:=lisDebugOptionsFrmName;
BuildModesStringGrid.Columns[fNameCol].SizePriority:=10;
BuildModesStringGrid.Columns[fNameCol].ButtonStyle:=cbsAuto;
Grid.EndUpdate(true);
end;
function TBuildModesEditorFrame.GetAllBuildMacros: TStrings;
procedure Add(aBuildMacro: TLazBuildMacro);
@ -497,59 +543,41 @@ var
InhOptionCtrl: TCompilerInheritedOptionsFrame;
begin
InhOptionCtrl:=TCompilerInheritedOptionsFrame(
FindOptionFrame(TCompilerInheritedOptionsFrame));
FindOptionControl(TCompilerInheritedOptionsFrame));
//debugln(['TBuildModesEditorFrame.UpdateInheritedOptions ',DbgSName(InhOptionCtrl)]);
if InhOptionCtrl=nil then exit;
InhOptionCtrl.UpdateInheritedTree(AProject.CompilerOptions);
end;
function TBuildModesEditorFrame.FindOptionFrame(AClass: TComponentClass
): TComponent;
function Search(AControl: TControl): TComponent;
var
i: Integer;
AWinControl: TWinControl;
begin
if AControl is AClass then
exit(AControl);
if AControl is TWinControl then begin
AWinControl:=TWinControl(AControl);
for i:=0 to AWinControl.ControlCount-1 do begin
Result:=Search(AWinControl.Controls[i]);
if Result<>nil then exit;
end;
end;
Result:=nil;
end;
begin
Result:=Search(GetParentForm(Self));
end;
procedure TBuildModesEditorFrame.FillBuildModesGrid;
var
i: Integer;
CurMode: TProjectBuildMode;
Grid: TStringGrid;
begin
if AProject=nil then exit;
BuildModesStringGrid.RowCount:=AProject.BuildModes.Count+1;
Grid:=BuildModesStringGrid;
Grid.BeginUpdate;
Grid.RowCount:=AProject.BuildModes.Count+1;
for i:=0 to AProject.BuildModes.Count-1 do begin
CurMode:=AProject.BuildModes[i];
// active
if CurMode=AProject.ActiveBuildMode then
BuildModesStringGrid.Cells[0,i+1]:=BuildModesStringGrid.Columns[0].ValueChecked
Grid.Cells[fActiveCol,i+1]:=Grid.Columns[fActiveCol].ValueChecked
else
BuildModesStringGrid.Cells[0,i+1]:=BuildModesStringGrid.Columns[0].ValueUnchecked;
Grid.Cells[fActiveCol,i+1]:=Grid.Columns[fActiveCol].ValueUnchecked;
// in session
if fInSessionCol>=0 then
if CurMode.InSession then
BuildModesStringGrid.Cells[1,i+1]:=BuildModesStringGrid.Columns[0].ValueChecked
Grid.Cells[fInSessionCol,i+1]:=Grid.Columns[fInSessionCol].ValueChecked
else
BuildModesStringGrid.Cells[1,i+1]:=BuildModesStringGrid.Columns[0].ValueUnchecked;
Grid.Cells[fInSessionCol,i+1]:=Grid.Columns[fInSessionCol].ValueUnchecked;
// identifier
BuildModesStringGrid.Cells[2,i+1]:=CurMode.Identifier;
Grid.Cells[fNameCol,i+1]:=CurMode.Identifier;
end;
Grid.EndUpdate(true);
end;
procedure TBuildModesEditorFrame.UpdateBuildModeButtons;
@ -563,19 +591,21 @@ begin
and (i>=0) and (i<AProject.BuildModes.Count) then
begin
CurMode:=AProject.BuildModes[i];
Identifier:=BuildModesStringGrid.Cells[2,i+1];
Identifier:=BuildModesStringGrid.Cells[fNameCol,i+1];
end
else
CurMode:=nil;
BuildModeAddSpeedButton.Hint:='Add new build mode, copying settings from "'+Identifier+'"';
BuildModeAddSpeedButton.Hint:=Format(lisAddNewBuildModeCopyingSettingsFrom, [
Identifier]);
BuildModeDeleteSpeedButton.Enabled:=(CurMode<>nil) and (AProject.BuildModes.Count>1);
BuildModeDeleteSpeedButton.Hint:='Delete mode "'+Identifier+'"';
BuildModeDeleteSpeedButton.Hint:=Format(lisDeleteMode, [Identifier]);
BuildModeMoveUpSpeedButton.Enabled:=(CurMode<>nil) and (i>0);
BuildModeMoveUpSpeedButton.Hint:='Move "'+Identifier+'" one position up';
BuildModeMoveUpSpeedButton.Hint:=Format(lisMoveOnePositionUp, [Identifier]);
BuildModeMoveDownSpeedButton.Enabled:=
i<BuildModesStringGrid.RowCount-2;
BuildModeMoveDownSpeedButton.Hint:='Move "'+Identifier+'" one position down';
BuildModeMoveDownSpeedButton.Hint:=Format(lisMoveOnePositionDown, [Identifier]
);
end;
procedure TBuildModesEditorFrame.ActivateMode(aMode: TProjectBuildMode);
@ -595,9 +625,17 @@ begin
end;
end;
procedure TBuildModesEditorFrame.UpdateShowSession;
begin
if LoadShowSessionFromProjects then
ShowSession:=(AProject<>nil)
and (AProject.SessionStorage in [pssInProjectDir,pssInIDEConfig]);
end;
constructor TBuildModesEditorFrame.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
FLoadShowSessionFromProject:=true;
FMacroValues:=TProjectBuildMacros.Create;
end;
@ -609,7 +647,7 @@ end;
function TBuildModesEditorFrame.GetTitle: String;
begin
Result := 'Build modes';
Result := lisBuildModes;
end;
procedure TBuildModesEditorFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
@ -617,9 +655,7 @@ var
Grid: TStringGrid;
begin
BuildModesGroupBox.Caption:=lisBuildModes;
BuildModesStringGrid.Columns[0].Title.Caption:=lisActive;
BuildModesStringGrid.Columns[1].Title.Caption:=lisInSession;
BuildModesStringGrid.Columns[2].Title.Caption:=lisDebugOptionsFrmName;
DoShowSession;
BuildModeAddSpeedButton.LoadGlyphFromLazarusResource('laz_add');
BuildModeDeleteSpeedButton.LoadGlyphFromLazarusResource('laz_delete');
@ -644,10 +680,15 @@ begin
if AOptions is TProjectCompilerOptions then begin
PCOptions:=TProjectCompilerOptions(AOptions);
FProject:=PCOptions.LazProject;
MacroValues.Assign(FProject.MacroValues);
UpdateMacrosControls;
// modes
UpdateShowSession;
FillBuildModesGrid;
UpdateBuildModeButtons;
// macros
MacroValues.Assign(FProject.MacroValues);
UpdateMacrosControls;
end;
end;

View File

@ -6,9 +6,8 @@ inherited ProjectSaveOptionsFrame: TProjectSaveOptionsFrame
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 0
Height = 17
Height = 18
Top = 0
Width = 320
Align = alTop
@ -22,8 +21,8 @@ inherited ProjectSaveOptionsFrame: TProjectSaveOptionsFrame
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 0
Height = 17
Top = 23
Height = 18
Top = 24
Width = 320
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
@ -37,8 +36,8 @@ inherited ProjectSaveOptionsFrame: TProjectSaveOptionsFrame
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 0
Height = 4
Top = 46
Height = 21
Top = 48
Width = 320
Anchors = [akTop, akLeft, akRight]
AutoFill = True
@ -53,6 +52,7 @@ inherited ProjectSaveOptionsFrame: TProjectSaveOptionsFrame
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 1
OnClick = SaveSessionLocationRadioGroupClick
TabOrder = 2
end
end

View File

@ -7,7 +7,7 @@ interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls, ExtCtrls, Project, IDEOptionsIntf, ProjectIntf, LCLProc,
LazarusIDEStrConsts, IDEProcs;
LazarusIDEStrConsts, IDEProcs, BuildModesEditor;
type
@ -17,14 +17,17 @@ type
SaveClosedUnitInfoCheckBox: TCheckBox;
SaveOnlyProjectUnitInfoCheckBox: TCheckBox;
SaveSessionLocationRadioGroup: TRadioGroup;
procedure SaveSessionLocationRadioGroupClick(Sender: TObject);
private
{ private declarations }
fProject: TProject;
function GetSessionLocation: TProjectSessionStorage;
public
function GetTitle: string; override;
procedure Setup(ADialog: TAbstractOptionsEditorDialog); override;
procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
property aProject: TProject read fProject;
end;
implementation
@ -52,6 +55,26 @@ end;
{ TProjectSaveOptionsFrame }
procedure TProjectSaveOptionsFrame.SaveSessionLocationRadioGroupClick(
Sender: TObject);
var
BuildModesEditor: TBuildModesEditorFrame;
begin
BuildModesEditor:=TBuildModesEditorFrame(FindOptionControl(TBuildModesEditorFrame));
if BuildModesEditor<>nil then
begin
BuildModesEditor.LoadShowSessionFromProjects:=false;
BuildModesEditor.ShowSession:=GetSessionLocation in [pssInIDEConfig,pssInProjectDir];
end;
end;
function TProjectSaveOptionsFrame.GetSessionLocation: TProjectSessionStorage;
begin
Result := LocalizedNameToProjectSessionStorage(
SaveSessionLocationRadioGroup.Items[
SaveSessionLocationRadioGroup.ItemIndex]);
end;
function TProjectSaveOptionsFrame.GetTitle: string;
begin
Result := dlgPOSaveSession;
@ -70,6 +93,8 @@ end;
procedure TProjectSaveOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
begin
if not (AOptions is TProject) then exit;
fProject:=TProject(AOptions);
with AOptions as TProject do
begin
SaveClosedUnitInfoCheckBox.Checked := (pfSaveClosedUnits in Flags);
@ -82,6 +107,7 @@ procedure TProjectSaveOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
var
AFlags: TProjectFlags;
begin
if not (AOptions is TProject) then exit;
with AOptions as TProject do
begin
AFlags := Flags;
@ -94,9 +120,7 @@ begin
else
exclude(AFlags, pfSaveOnlyProjectUnits);
if SaveSessionLocationRadioGroup.ItemIndex >= 0 then
SessionStorage := LocalizedNameToProjectSessionStorage(
SaveSessionLocationRadioGroup.Items[
SaveSessionLocationRadioGroup.ItemIndex]);
SessionStorage := Self.GetSessionLocation;
Flags := AFlags;
end;
end;

View File

@ -4898,6 +4898,18 @@ resourcestring
lisActive = 'Active';
lisBuildModes = 'Build modes';
lisInSession = 'In session';
lisThereMustBeAtLeastOneBuildMode = 'There must be at least one build mode.';
lisTheFirstBuildModeIsTheDefaultModeAndMustBeStoredIn = 'The first build '
+'mode is the default mode and must be stored in the project, not in the '
+'session.';
lisTheFirstBuildModeIsTheDefaultModeAndMustBeStoredIn2 = 'The first build '
+'mode is the default mode and must be stored in the project, not in the '
+'session.';
lisAddNewBuildModeCopyingSettingsFrom = 'Add new build mode, copying '
+'settings from "%s"';
lisDeleteMode = 'Delete mode "%s"';
lisMoveOnePositionUp = 'Move "%s" one position up';
lisMoveOnePositionDown = 'Move "%s" one position down';
implementation

View File

@ -113,6 +113,7 @@ type
procedure RestoreSettings(AOptions: TAbstractIDEOptions); virtual;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; virtual; abstract;
class function DefaultCollapseChildNodes: Boolean; virtual;
function FindOptionControl(AClass: TControlClass): TControl;
property OnLoadIDEOptions: TOnLoadIDEOptions read FOnLoadIDEOptions write FOnLoadIDEOptions;
property OnSaveIDEOptions: TOnSaveIDEOptions read FOnSaveIDEOptions write FOnSaveIDEOptions;
@ -380,6 +381,30 @@ begin
Result := False;
end;
function TAbstractIDEOptionsEditor.FindOptionControl(AClass: TControlClass
): TControl;
function Search(AControl: TControl): TControl;
var
i: Integer;
AWinControl: TWinControl;
begin
if AControl is AClass then
exit(AControl);
if AControl is TWinControl then begin
AWinControl:=TWinControl(AControl);
for i:=0 to AWinControl.ControlCount-1 do begin
Result:=Search(AWinControl.Controls[i]);
if Result<>nil then exit;
end;
end;
Result:=nil;
end;
begin
Result:=Search(GetParentForm(Self));
end;
{ TIDEOptionsEditorList }
function TIDEOptionsEditorList.GetItem(AIndex: Integer): PIDEOptionsEditorRec;