IDE: Fix regression caused by r49802 #bf21367723 related to old window positions. Issues #28732,#28754.

git-svn-id: trunk@49938 -
This commit is contained in:
juha 2015-10-05 13:55:15 +00:00
parent 4c2b9176c0
commit d9ace5ff7b
2 changed files with 36 additions and 25 deletions

View File

@ -213,12 +213,15 @@ type
FDefaultWidth: integer;
FDefaultHeight: integer;
FWindowState: TIDEWindowState;
FForm: TCustomForm;
FFormID: string;
FDefaultWindowPlacement: TIDEWindowPlacement;
FDividers: TSimpleWindowLayoutDividerPosList;
function GetForm: TCustomForm;
procedure SetForm(const AForm: TCustomForm);
function GetFormCaption: string;
procedure OnFormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AFormID: string); reintroduce;
destructor Destroy; override;
@ -235,7 +238,6 @@ type
function CustomCoordinatesAreValid: boolean;
function DefaultCoordinatesAreValid: boolean;
procedure CloseForm;
procedure SetForm(const AForm: TCustomForm);
function ValidateAndSetCoordinates(const aForce: Boolean = False): Boolean;
procedure SetDefaultPosition(const AForm: TCustomForm);
public
@ -254,7 +256,7 @@ type
property DefaultWidth: integer read FDefaultWidth write FDefaultWidth;
property DefaultHeight: integer read FDefaultHeight write FDefaultHeight;
property WindowState: TIDEWindowState read FWindowState write FWindowState;
property Form: TCustomForm read GetForm;
property Form: TCustomForm read FForm write SetForm;
property Visible: boolean read FVisible write FVisible;
property Applied: boolean read FApplied write FApplied;
property Dividers: TSimpleWindowLayoutDividerPosList read FDividers;
@ -1182,6 +1184,7 @@ end;
destructor TSimpleWindowLayout.Destroy;
begin
Form:=nil;
inherited Destroy;
FDividers.Free;
end;
@ -1220,6 +1223,18 @@ begin
FDividers.LoadFromConfig(Config, P + 'Divider/');
end;
procedure TSimpleWindowLayout.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if Operation=opRemove then begin
if fForm=AComponent then begin
fForm:=nil;
Applied:=false;
end;
end;
end;
procedure TSimpleWindowLayout.SaveToConfig(Config: TConfigStorage;
const Path: string);
var
@ -1352,11 +1367,20 @@ end;
procedure TSimpleWindowLayout.SetForm(const AForm: TCustomForm);
begin
if Assigned(AForm) then
if fForm=AForm then exit;
if Assigned(Form) then
begin
fFormID := AForm.Name;
FFormCaption := AForm.Caption;
AForm.AddHandlerClose(@OnFormClose);
RemoveFreeNotification(Form);
Form.RemoveHandlerClose(@OnFormClose);
end;
fForm:=AForm;
if Assigned(Form) then
begin
Assert(Form.Name <> '');
fFormID := Form.Name;
FFormCaption := Form.Caption;
FreeNotification(Form);
Form.AddHandlerClose(@OnFormClose);
Applied:=false;
end;
end;
@ -1483,19 +1507,6 @@ begin
//debugln('TSimpleWindowLayout.GetCurrentPosition ',DbgSName(Self),' ',FormID,' Width=',dbgs(Width));
end;
function TSimpleWindowLayout.GetForm: TCustomForm;
var
I: Integer;
begin
for I := 0 to Screen.CustomFormCount-1 do
if Screen.CustomForms[I].Name = FFormID then
begin
Result := Screen.CustomForms[I];
Exit;
end;
Result := nil;
end;
function TSimpleWindowLayout.Apply(const aForce: Boolean): Boolean;
var
xForm: TCustomForm;
@ -1745,7 +1756,7 @@ begin
ALayout:=ItemByFormID(AForm.Name);
if ALayout<>nil then
begin
ALayout.SetForm(AForm);
ALayout.Form:=AForm;
if ALayout.Applied then exit;
if ALayout.Apply then exit;
end;
@ -1898,7 +1909,7 @@ begin
SelfI := IndexOf(SrcList[SrcI].FormID);
if SelfI < 0 then
SelfI := Self.Add(TSimpleWindowLayout.Create(SrcList[SrcI].FormID));//not found, create
Self.fItems.Move(SelfI, SrcI);//move it to right position
Self.fItems.Move(SelfI, Min(SrcI, Self.Count-1));//move it to right position
SelfI := SrcI;
Self.Items[SelfI].Assign(SrcList[SrcI])
end;
@ -1926,7 +1937,7 @@ function TSimpleWindowLayoutList.CreateWindowLayout(const TheForm: TCustomForm
): TSimpleWindowLayout;
begin
Result:=CreateWindowLayout(TheForm.Name);
Result.SetForm(TheForm);
Result.Form:=TheForm;
end;
{ TIDEWindowCreator }
@ -2275,7 +2286,7 @@ begin
SimpleLayoutStorage.CreateWindowLayout(AForm);
end
else
Layout.SetForm(AForm);
Layout.Form:=AForm;
if (IDEDockMaster<>nil) and (not (csDesigning in AForm.ComponentState))
and (FindWithName(AForm.Name)<>nil) then

View File

@ -6941,7 +6941,7 @@ begin
// => disconnect first
Layout:=IDEWindowCreators.SimpleLayoutStorage.ItemByForm(Self);
if Layout<>nil then
Layout.SetForm(nil);
Layout.Form:=nil;
Name := Name + '___' + IntToStr({%H-}PtrUInt(Pointer(Self)));
CloseAction := caFree;
end