patch from Mattias (something with autoSizing and run parameters dialog borders)

git-svn-id: trunk@12526 -
This commit is contained in:
paul 2007-10-20 02:31:41 +00:00
parent 23a9844cd1
commit 1221b576c7
4 changed files with 117 additions and 75 deletions

View File

@ -220,7 +220,6 @@ object RunParamsOptsDlg: TRunParamsOptsDlg
Width = 149
Anchors = [akTop, akRight, akBottom]
AutoSize = True
BorderSpacing.Left = 6
BorderSpacing.Top = 6
BorderSpacing.Right = 6
BorderSpacing.InnerBorder = 4

View File

@ -72,54 +72,53 @@ LazarusResources.Add('TRunParamsOptsDlg','FORMDATA',[
+'orkingDirectoryGroupBox'#20'AnchorSideRight.Side'#7#9'asrBottom'#24'AnchorS'
+'ideBottom.Control'#7#24'WorkingDirectoryComboBox'#21'AnchorSideBottom.Side'
+#7#9'asrBottom'#4'Left'#3'E'#1#6'Height'#2#27#3'Top'#2#6#5'Width'#3#149#0#7
+'Anchors'#11#5'akTop'#7'akRight'#8'akBottom'#0#8'AutoSize'#9#18'BorderSpacin'
+'g.Left'#2#6#17'BorderSpacing.Top'#2#6#19'BorderSpacing.Right'#2#6#25'Border'
+'Spacing.InnerBorder'#2#4#7'Caption'#6#19'WorkingDirectoryBtn'#7'OnClick'#7
+#24'WorkingDirectoryBtnClick'#8'TabOrder'#2#0#0#0#9'TComboBox'#24'WorkingDir'
+'ectoryComboBox'#22'AnchorSideLeft.Control'#7#24'WorkingDirectoryGroupBox'#21
+'AnchorSideTop.Control'#7#24'WorkingDirectoryGroupBox'#23'AnchorSideRight.Co'
+'ntrol'#7#19'WorkingDirectoryBtn'#4'Left'#2#6#6'Height'#2#27#3'Top'#2#6#5'Wi'
+'dth'#3'9'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#16'AutoCompleteTe'
+'xt'#11#22'cbactEndOfLineComplete'#20'cbactSearchAscending'#0#20'BorderSpaci'
+'ng.Around'#2#6#9'MaxLength'#2#0#8'TabOrder'#2#1#4'Text'#6#24'WorkingDirecto'
+'ryComboBox'#0#0#0#0#5'TPage'#11'EnvVarsPage'#7'Caption'#6#11'EnvVarsPage'#11
+'ClientWidth'#3#240#1#12'ClientHeight'#3#168#1#0#9'TCheckBox'#30'IncludeSyst'
+'emVariablesCheckBox'#4'Left'#2#6#6'Height'#2#22#3'Top'#3#140#1#5'Width'#3
+#228#1#5'Align'#7#8'alBottom'#20'BorderSpacing.Around'#2#6#7'Caption'#6#30'I'
+'ncludeSystemVariablesCheckBox'#7'Enabled'#8#8'TabOrder'#2#0#0#0#9'TGroupBox'
+#21'UserOverridesGroupBox'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#6
+#6'Height'#3#161#0#3'Top'#3#229#0#5'Width'#3#228#1#5'Align'#7#8'alBottom'#7
+'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#20'BorderSpacing.Around'#2#6#7
+'Caption'#6#21'UserOverridesGroupBox'#12'ClientHeight'#3#142#0#11'ClientWidt'
+'h'#3#224#1#8'TabOrder'#2#1#0#7'TButton'#22'UserOverridesAddButton'#4'Left'#2
+#6#6'Height'#2#31#3'Top'#2'f'#5'Width'#3#179#0#7'Anchors'#11#6'akLeft'#8'akB'
+'ottom'#0#8'AutoSize'#9#20'BorderSpacing.Around'#2#6#25'BorderSpacing.InnerB'
+'order'#2#4#7'Caption'#6#22'UserOverridesAddButton'#7'OnClick'#7#27'UserOver'
+'ridesAddButtonClick'#8'TabOrder'#2#0#0#0#7'TButton'#23'UserOverridesEditBut'
+'ton'#22'AnchorSideLeft.Control'#7#22'UserOverridesAddButton'#19'AnchorSideL'
+'eft.Side'#7#9'asrBottom'#4'Left'#3#191#0#6'Height'#2#31#3'Top'#2'f'#5'Width'
+#3#178#0#7'Anchors'#11#6'akLeft'#8'akBottom'#0#8'AutoSize'#9#20'BorderSpacin'
+'g.Around'#2#6#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#23'UserOverrid'
+'esEditButton'#7'OnClick'#7#28'UserOverridesEditButtonClick'#8'TabOrder'#2#1
+#0#0#7'TButton'#25'UserOverridesDeleteButton'#22'AnchorSideLeft.Control'#7#23
+'UserOverridesEditButton'#19'AnchorSideLeft.Side'#7#9'asrBottom'#4'Left'#3'w'
+#1#6'Height'#2#31#3'Top'#2'f'#5'Width'#3#196#0#7'Anchors'#11#6'akLeft'#8'akB'
+'ottom'#0#8'AutoSize'#9#20'BorderSpacing.Around'#2#6#25'BorderSpacing.InnerB'
+'order'#2#4#7'Caption'#6#25'UserOverridesDeleteButton'#7'OnClick'#7#30'UserO'
+'verridesDeleteButtonClick'#8'TabOrder'#2#2#0#0#9'TListView'#21'UserOverride'
+'sListView'#24'AnchorSideBottom.Control'#7#22'UserOverridesAddButton'#4'Left'
+#2#6#6'Height'#2'Z'#3'Top'#2#6#5'Width'#3#212#1#5'Align'#7#5'alTop'#7'Anchor'
+'s'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#20'BorderSpacing.Around'#2
+#6#7'Columns'#14#1#8'AutoSize'#9#7'Caption'#6#7'Caption'#5'Width'#2';'#0#1#8
+'AutoSize'#9#7'Caption'#6#7'Caption'#5'Width'#3#135#1#0#0#9'RowSelect'#9#8'S'
+'ortType'#7#6'stText'#8'TabOrder'#2#3#9'ViewStyle'#7#8'vsReport'#0#0#0#9'TGr'
+'oupBox'#23'SystemVariablesGroupBox'#4'Left'#2#6#6'Height'#3#217#0#3'Top'#2#6
+#5'Width'#3#228#1#5'Align'#7#8'alClient'#20'BorderSpacing.Around'#2#6#7'Capt'
+'ion'#6#23'SystemVariablesGroupBox'#12'ClientHeight'#3#198#0#11'ClientWidth'
+#3#224#1#8'TabOrder'#2#2#0#9'TListView'#23'SystemVariablesListView'#4'Left'#2
+#6#6'Height'#3#186#0#3'Top'#2#6#5'Width'#3#212#1#5'Align'#7#8'alClient'#20'B'
+'orderSpacing.Around'#2#6#7'Columns'#14#1#8'AutoSize'#9#7'Caption'#6#7'Capti'
+'on'#5'Width'#2';'#0#1#8'AutoSize'#9#7'Caption'#6#7'Caption'#5'Width'#3#135#1
+#0#0#9'RowSelect'#9#8'SortType'#7#6'stText'#8'TabOrder'#2#0#9'ViewStyle'#7#8
+'vsReport'#0#0#0#0#0#0
+'Anchors'#11#5'akTop'#7'akRight'#8'akBottom'#0#8'AutoSize'#9#17'BorderSpacin'
+'g.Top'#2#6#19'BorderSpacing.Right'#2#6#25'BorderSpacing.InnerBorder'#2#4#7
+'Caption'#6#19'WorkingDirectoryBtn'#7'OnClick'#7#24'WorkingDirectoryBtnClick'
+#8'TabOrder'#2#0#0#0#9'TComboBox'#24'WorkingDirectoryComboBox'#22'AnchorSide'
+'Left.Control'#7#24'WorkingDirectoryGroupBox'#21'AnchorSideTop.Control'#7#24
+'WorkingDirectoryGroupBox'#23'AnchorSideRight.Control'#7#19'WorkingDirectory'
+'Btn'#4'Left'#2#6#6'Height'#2#27#3'Top'#2#6#5'Width'#3'9'#1#7'Anchors'#11#5
+'akTop'#6'akLeft'#7'akRight'#0#16'AutoCompleteText'#11#22'cbactEndOfLineComp'
+'lete'#20'cbactSearchAscending'#0#20'BorderSpacing.Around'#2#6#9'MaxLength'#2
+#0#8'TabOrder'#2#1#4'Text'#6#24'WorkingDirectoryComboBox'#0#0#0#0#5'TPage'#11
+'EnvVarsPage'#7'Caption'#6#11'EnvVarsPage'#11'ClientWidth'#3#240#1#12'Client'
+'Height'#3#168#1#0#9'TCheckBox'#30'IncludeSystemVariablesCheckBox'#4'Left'#2
+#6#6'Height'#2#22#3'Top'#3#140#1#5'Width'#3#228#1#5'Align'#7#8'alBottom'#20
+'BorderSpacing.Around'#2#6#7'Caption'#6#30'IncludeSystemVariablesCheckBox'#7
+'Enabled'#8#8'TabOrder'#2#0#0#0#9'TGroupBox'#21'UserOverridesGroupBox'#18'An'
+'chorSideTop.Side'#7#9'asrBottom'#4'Left'#2#6#6'Height'#3#161#0#3'Top'#3#229
+#0#5'Width'#3#228#1#5'Align'#7#8'alBottom'#7'Anchors'#11#5'akTop'#6'akLeft'#7
+'akRight'#0#20'BorderSpacing.Around'#2#6#7'Caption'#6#21'UserOverridesGroupB'
+'ox'#12'ClientHeight'#3#142#0#11'ClientWidth'#3#224#1#8'TabOrder'#2#1#0#7'TB'
+'utton'#22'UserOverridesAddButton'#4'Left'#2#6#6'Height'#2#31#3'Top'#2'f'#5
+'Width'#3#179#0#7'Anchors'#11#6'akLeft'#8'akBottom'#0#8'AutoSize'#9#20'Borde'
+'rSpacing.Around'#2#6#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#22'User'
+'OverridesAddButton'#7'OnClick'#7#27'UserOverridesAddButtonClick'#8'TabOrder'
+#2#0#0#0#7'TButton'#23'UserOverridesEditButton'#22'AnchorSideLeft.Control'#7
+#22'UserOverridesAddButton'#19'AnchorSideLeft.Side'#7#9'asrBottom'#4'Left'#3
+#191#0#6'Height'#2#31#3'Top'#2'f'#5'Width'#3#178#0#7'Anchors'#11#6'akLeft'#8
+'akBottom'#0#8'AutoSize'#9#20'BorderSpacing.Around'#2#6#25'BorderSpacing.Inn'
+'erBorder'#2#4#7'Caption'#6#23'UserOverridesEditButton'#7'OnClick'#7#28'User'
+'OverridesEditButtonClick'#8'TabOrder'#2#1#0#0#7'TButton'#25'UserOverridesDe'
+'leteButton'#22'AnchorSideLeft.Control'#7#23'UserOverridesEditButton'#19'Anc'
+'horSideLeft.Side'#7#9'asrBottom'#4'Left'#3'w'#1#6'Height'#2#31#3'Top'#2'f'#5
+'Width'#3#196#0#7'Anchors'#11#6'akLeft'#8'akBottom'#0#8'AutoSize'#9#20'Borde'
+'rSpacing.Around'#2#6#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#25'User'
+'OverridesDeleteButton'#7'OnClick'#7#30'UserOverridesDeleteButtonClick'#8'Ta'
+'bOrder'#2#2#0#0#9'TListView'#21'UserOverridesListView'#24'AnchorSideBottom.'
+'Control'#7#22'UserOverridesAddButton'#4'Left'#2#6#6'Height'#2'Z'#3'Top'#2#6
+#5'Width'#3#212#1#5'Align'#7#5'alTop'#7'Anchors'#11#5'akTop'#6'akLeft'#7'akR'
+'ight'#8'akBottom'#0#20'BorderSpacing.Around'#2#6#7'Columns'#14#1#8'AutoSize'
+#9#7'Caption'#6#7'Caption'#5'Width'#2';'#0#1#8'AutoSize'#9#7'Caption'#6#7'Ca'
+'ption'#5'Width'#3#135#1#0#0#9'RowSelect'#9#8'SortType'#7#6'stText'#8'TabOrd'
+'er'#2#3#9'ViewStyle'#7#8'vsReport'#0#0#0#9'TGroupBox'#23'SystemVariablesGro'
+'upBox'#4'Left'#2#6#6'Height'#3#217#0#3'Top'#2#6#5'Width'#3#228#1#5'Align'#7
+#8'alClient'#20'BorderSpacing.Around'#2#6#7'Caption'#6#23'SystemVariablesGro'
+'upBox'#12'ClientHeight'#3#198#0#11'ClientWidth'#3#224#1#8'TabOrder'#2#2#0#9
+'TListView'#23'SystemVariablesListView'#4'Left'#2#6#6'Height'#3#186#0#3'Top'
+#2#6#5'Width'#3#212#1#5'Align'#7#8'alClient'#20'BorderSpacing.Around'#2#6#7
+'Columns'#14#1#8'AutoSize'#9#7'Caption'#6#7'Caption'#5'Width'#2';'#0#1#8'Aut'
+'oSize'#9#7'Caption'#6#7'Caption'#5'Width'#3#135#1#0#0#9'RowSelect'#9#8'Sort'
+'Type'#7#6'stText'#8'TabOrder'#2#0#9'ViewStyle'#7#8'vsReport'#0#0#0#0#0#0
]);

View File

@ -1567,7 +1567,7 @@ end;
------------------------------------------------------------------------------}
procedure TControl.ParentFormHandleInitialized;
begin
// The form is real connection to the target screen. For example, the gtk
// The form is really connection to the target screen. For example, the gtk
// under X gathers some screen information not before form creation.
// But this information is needed to create DeviceContexts, which
// are needed to calculate Text Size and such stuff needed for AutoSizing.
@ -2068,7 +2068,8 @@ Begin
If AutoSize <> Value then begin
FAutoSize := Value;
//debugln('TControl.SetAutoSize ',DbgSName(Self));
AdjustSize;
if FAutoSize then
AdjustSize;
end;
end;

View File

@ -25,15 +25,20 @@
// {$DEFINE ASSERT_IS_ON}
{$ENDIF}
{ $DEFINE CHECK_POSITION}
{off $DEFINE VerboseAutoSizeCtrlData}
{off $DEFINE CHECK_POSITION}
{$IFDEF CHECK_POSITION}
const CheckPostionClassName = 'xxxTPage';
const CheckPostionName = 'xxxPathsPage';
const CheckPostionName = 'WorkingDirectoryGroupBox';
const CheckPostionParentName = 'WorkingDirectoryGroupBox';
function CheckPosition(AControl: TControl): boolean;
begin
Result:=(CompareText(AControl.ClassName,CheckPostionClassName)=0)
or (CompareText(AControl.Name,CheckPostionName)=0);
or (CompareText(AControl.Name,CheckPostionName)=0)
or ((AControl.Parent<>nil)
and (CompareText(AControl.Parent.Name,CheckPostionParentName)=0));
end;
{$ENDIF}
{ $DEFINE VerboseMouseBugfix}
@ -93,10 +98,10 @@ type
procedure SumTable;
procedure ResizeTable(ChildSizing: TControlChildSizing;
TargetWidth, TargetHeight: integer);
function SetTableControlBounds(ChildSizing: TControlChildSizing): boolean;
function SetTableControlBounds(ChildSizing: TControlChildSizing): boolean;// true if changed
function AlignControlsInTable(ListOfControls: TFPList;
ChildSizing: TControlChildSizing;
TargetWidth, TargetHeight: integer): boolean;
TargetWidth, TargetHeight: integer): boolean;// true if changed
// debugging
procedure WriteDebugReport;
@ -248,6 +253,7 @@ var
for i := 0 to AlignList.Count - 1 do begin
Child:=TControl(AlignList[i]);
ChildData:=Childs[Child];
//DebugLn('DoAlign ',DbgSName(Child),' ',dbgs(Child.Align));
for a:=Low(TAnchorKind) to High(TAnchorKind) do
if a in AnchorAlign[TheAlign] then begin
@ -256,6 +262,7 @@ var
ChildData.Sides[a].Side:=asrLeft
else
ChildData.Sides[a].Side:=asrRight;
//DebugLn('DoAlign ',DbgSName(Child),' ',dbgs(a),' ',dbgs(a,ChildData.Sides[a].Side));
end;
case TheAlign of
@ -317,22 +324,28 @@ begin
SiblingData:=ChildData.Sides[a].CtrlData;
// aligned or anchored to a sibling
if a in [akLeft,akTop] then begin
NewSpace:=Max(WinControl.ChildSizing.HorizontalSpacing,
ChildData.Borders[a]);
if ChildData.Sides[a].Side=asrLeft then
NewSpace:=Max(NewSpace,SiblingData.Borders[akLeft])
else if ChildData.Sides[a].Side=asrRight then
NewSpace:=Max(NewSpace,SiblingData.Borders[akRight])
NewSpace:=ChildData.Borders[a];
if ChildData.Sides[a].Side=asrRight then begin
NewSpace:=Max(NewSpace,WinControl.ChildSizing.HorizontalSpacing);
if a=akLeft then
NewSpace:=Max(NewSpace,SiblingData.Borders[akRight])
else
NewSpace:=Max(NewSpace,SiblingData.Borders[akBottom]);
end else if ChildData.Sides[a].Side=asrLeft then
else if ChildData.Sides[a].Side=asrCenter then
NewSpace:=0;
ChildData.Sides[a].Space:=NewSpace;
end else begin
NewSpace:=Max(WinControl.ChildSizing.VerticalSpacing,
ChildData.Borders[a]);
if ChildData.Sides[a].Side=asrTop then
NewSpace:=Max(NewSpace,SiblingData.Borders[akTop])
else if ChildData.Sides[a].Side=asrBottom then
NewSpace:=Max(NewSpace,SiblingData.Borders[akBottom])
NewSpace:=ChildData.Borders[a];
if ChildData.Sides[a].Side=asrTop then begin
NewSpace:=Max(NewSpace,WinControl.ChildSizing.VerticalSpacing);
if a=akRight then
NewSpace:=Max(NewSpace,SiblingData.Borders[akLeft])
else
NewSpace:=Max(NewSpace,SiblingData.Borders[akTop]);
end else if ChildData.Sides[a].Side=asrBottom then
else if ChildData.Sides[a].Side=asrCenter then
NewSpace:=0;
ChildData.Sides[a].Space:=NewSpace;
@ -895,12 +908,16 @@ begin
// setup space for dependencies
SetupSpace;
//WriteDebugReport('Space completed','');
{$IFDEF VerboseAutoSizeCtrlData}
WriteDebugReport('Space completed','');
{$ENDIF}
// calculate the needed positions for all childs
until ComputePositions;
//WriteDebugReport('Positions completed','');
{$IFDEF VerboseAutoSizeCtrlData}
WriteDebugReport('Positions completed','');
{$ENDIF}
// compute needed clientwidth/clientheight
for i:=0 to ChildCount-1 do begin
@ -923,7 +940,9 @@ begin
end;
end;
//DebugLn(['TAutoSizeCtrlData.ComputePreferredClientArea END ',DbgSName(Control),' PreferredClientWidth/height=',PreferredClientWidth,',',PreferredClientHeight]);
{$IFDEF VerboseAutoSizeCtrlData}
DebugLn(['TAutoSizeCtrlData.ComputePreferredClientArea END ',DbgSName(Control),' PreferredClientWidth/height=',PreferredClientWidth,',',PreferredClientHeight]);
{$ENDIF}
end;
procedure TAutoSizeCtrlData.FixControlProperties(Child: TControl);
@ -2024,6 +2043,8 @@ procedure TWinControl.AlignControls(AControl: TControl;
var
AlignList: TFPList;
BoundsMutated: boolean;
LastBoundsMutated: TControl;
LastBoundsMutatedOld: TRect;
RemainingBorderSpace: TRect; // borderspace around RemainingClientRect
// e.g. Right=3 means borderspace of 3
@ -2459,6 +2480,10 @@ var
//DebugLn(['DoPosition ',DbgSName(Control),' ',cfAutoSizeNeeded in Control.FControlFlags]);
NewBounds:=Control.BoundsRect;
BoundsMutated:=not CompareRect(@OldBounds,@NewBounds);
if BoundsMutated then begin
LastBoundsMutated:=Control;
LastBoundsMutatedOld:=OldBounds;
end;
// Sometimes SetBounds change the bounds. For example due to constraints.
// update the new bounds
with Control do
@ -2472,7 +2497,7 @@ var
//if csDesigning in Control.ComponentState then
if CheckPosition(Control) then
with Control do
DebugLn('[TWinControl.AlignControls.DoPosition] AFTER SETBOUND Control=',Name,':',ClassName,' Bounds=',DbgS(Left,Top,Width,Height));
DebugLn('[TWinControl.AlignControls.DoPosition] AFTER SETBOUND Control=',DbgSName(Control),' Bounds=',DbgS(Control.BoundsRect));
{$ENDIF}
end;
@ -2579,6 +2604,7 @@ var
//debugln('DoAlignNotAligned ',DbgSName(Self),' AlignList.Count=',dbgs(AlignList.Count));
if AlignList.Count=0 then exit;
LastBoundsMutated:=nil;
AlignNonAlignedControls(AlignList,BoundsMutated);
end;
@ -2587,11 +2613,21 @@ var
ChildControl: TControl;
OldRemainingClientRect: TRect;
OldRemainingBorderSpace: TRect;
MaxTries: LongInt;
begin
if wcfAligningControls in FWinControlFlags then exit;
Include(FWinControlFlags,wcfAligningControls);
//debugln('TWinControl.AlignControls ',DbgSName(Self));
// call delayed autosize
for i:=ControlCount-1 downto 0 do begin
ChildControl:=Controls[i];
if cfAutoSizeNeeded in ChildControl.FControlFlags then begin
//DebugLn(['TWinControl.AlignControls ',DbgSName(Self),' autosize needed for child ',DbgSName(ChildControl)]);
ChildControl.AdjustSize;
end;
end;
// unset all align needed flags
Exclude(FWinControlFlags,wcfReAlignNeeded);
for i:=ControlCount-1 downto 0 do begin
@ -2620,7 +2656,9 @@ begin
// and so forth. This is allowed, so do up to n loop step.
// Do not more, to avoid endless loops, if there are circle
// dependencies.
for i:=0 to ControlCount-1 do begin
MaxTries:=ControlCount;
{$IFDEF CHECK_POSITION}inc(MaxTries);{$ENDIF}
for i:=1 to MaxTries do begin
// align and anchor child controls
BoundsMutated:=false;
OldRemainingClientRect:=RemainingClientRect;
@ -2634,6 +2672,11 @@ begin
DoAlign(alNone);
DoAlignNotAligned;
if not BoundsMutated then break;
if (i=ControlCount+1) then begin
DebugLn(['TWinControl.AlignControls ENDLESS LOOP STOPPED ',DbgSName(Self),' i=',i]);
if LastBoundsMutated<>nil then
DebugLn(['TWinControl.AlignControls LAST CHANGED: ',DbgSName(LastBoundsMutated),' Old=',dbgs(LastBoundsMutatedOld),' Now=',dbgs(LastBoundsMutated.BoundsRect)]);
end;
// update again
RemainingClientRect:=OldRemainingClientRect;
RemainingBorderSpace:=OldRemainingBorderSpace;