On 09.09.2015 12:58, Juha Manninen wrote:
Martin Friebe noticed a problem with desktops and multiple source
editor windows.
In fact I also noticed that a second source editor is not restored
correctly when changing desktops.
Now I realized the 2nd, 3rd etc. editor windows are project specific,
while other layout settings are global. This is not very logical. How
to solve it?
I think all layout settings should be global for the sake of consistency.

Juha

The settings are saved correctly in the environment settings. Try to save a desktop with 2 editor windows, move something (including the editor windows) and then load the desktop. Both editor windows are positioned correctly.

Actually, from the principal point of view, the code is correct. Editor windows are normal nonmodal windows and so they are restored/closed on desktop change like any other window. If you stored a desktop without a secondary editor window, it is closed when you apply the desktop.

But I see that this is not wanted and expected from the user's point of view -> That means secondary editor windows need special treatment in *TEnvironmentOptions.UseDesktop/TIDEWindowCreatorList.RestoreSimpleLayout*. It should not change visibility of editor windows. It should only change their position.

I fixed this in the undocked environment. See the patch. Please test/comment. The special windows that should not be closed/shown on desktop change have to be registered in the *IDEWindowsDontChangeVisibility* list (names of the forms). Currently only editor windows are added into the list. Important: if you save a desktop with a secondary editor and use it, the position of the secondary editor is restored. If you save a desktop with no secondary editors and you apply the desktop when there is a secondary editor window visible, it won't change its position. This is correct behavior.

+ Please don't report bugs like "I created a desktop with no editor window. But when I apply it, the editor window isn't closed." This is the requested behavior now (there is no difference between secondary/primary editor window).

Ondrej
Index: components/ideintf/idewindowintf.pas
===================================================================
--- components/ideintf/idewindowintf.pas        (revision 49796)
+++ components/ideintf/idewindowintf.pas        (working copy)
@@ -233,6 +233,7 @@
     procedure LoadFromConfig(Config: TConfigStorage; const Path: string);
     procedure SaveToConfig(Config: TConfigStorage; const Path: string);
     function CustomCoordinatesAreValid: boolean;
+    function DefaultCoordinatesAreValid: boolean;
     procedure CloseForm;
     function ValidateAndSetCoordinates(const aForce: Boolean = False): Boolean;
     procedure SetDefaultPosition(const AForm: TCustomForm);
@@ -483,6 +484,7 @@
 procedure MakeIDEWindowDockable(AControl: TWinControl);
 procedure MakeIDEWindowDockSite(AForm: TCustomForm);
 procedure CloseAllForms;
+function IDEWindowsDontChangeVisibility: TStringList;
 
 procedure Register;
 
@@ -491,6 +493,9 @@
 uses
   LazIDEIntf;
 
+var
+  FIDEWindowsDontChangeVisibility: TStringList = nil;
+
 function StrToIDEWindowPlacement(const s: string): TIDEWindowPlacement;
 begin
   for Result:=Low(TIDEWindowPlacement) to High(TIDEWindowPlacement) do
@@ -551,6 +556,16 @@
   end;
 end;
 
+function IDEWindowsDontChangeVisibility: TStringList;
+begin
+  if not Assigned(FIDEWindowsDontChangeVisibility) then
+  begin
+    FIDEWindowsDontChangeVisibility := TStringList.Create;
+    FIDEWindowsDontChangeVisibility.Sorted := True;
+  end;
+  Result := FIDEWindowsDontChangeVisibility;
+end;
+
 procedure Register;
 begin
   RegisterComponents('Misc',[TIDEDialogLayoutStorage]);
@@ -1199,6 +1214,11 @@
   Result:=(Width>0) and (Height>0); // and (Left>10-Width) and (Top>10-Height);
 end;
 
+function TSimpleWindowLayout.DefaultCoordinatesAreValid: boolean;
+begin
+  Result:=(DefaultWidth>0) and (DefaultHeight>0);
+end;
+
 procedure TSimpleWindowLayout.CloseForm;
 begin
   GetCurrentPosition;
@@ -1214,8 +1234,11 @@
   Result := False;
   if aForce or CustomCoordinatesAreValid then begin
     if not CustomCoordinatesAreValid then//default position
+    begin
+      if not DefaultCoordinatesAreValid then//don't change the coordinates if 
default position is invalid
+        Exit;
       NewBounds := Bounds(DefaultLeft, DefaultTop, DefaultWidth, DefaultHeight)
-    else// explicit position
+    end else// explicit position
       NewBounds := Bounds(Left, Top, Width, Height);
 
     // set minimum size
@@ -2239,6 +2262,7 @@
   i: Integer;
   ALayout: TSimpleWindowLayout;
   AForm: TCustomForm;
+  AChangeVisibility: Boolean;
 begin
   if IDEDockMaster=nil then
   begin
@@ -2245,13 +2269,21 @@
     for i:=SimpleLayoutStorage.Count-1 downto 0 do//loop down in order to keep 
z-order of the forms
     begin
       ALayout:=SimpleLayoutStorage[i];
-      AForm:=GetForm(ALayout.FormID,ALayout.Visible);
+      AChangeVisibility := 
(IDEWindowsDontChangeVisibility.IndexOf(ALayout.FormID) = -1);
+      AForm:=GetForm(ALayout.FormID,AChangeVisibility and ALayout.Visible);
       if AForm=nil then Continue;
-      ALayout.Apply(True);
-      if ALayout.Visible or (AForm=Application.MainForm) then
-        ShowForm(AForm,true)
-      else if AForm.Visible then
-        AForm.Close;
+      ALayout.Apply(AChangeVisibility);
+      if AChangeVisibility then
+      begin
+        if ALayout.Visible or (AForm=Application.MainForm) then
+          ShowForm(AForm,true)
+        else if AForm.Visible then
+          AForm.Close;
+      end else
+      begin//do not change visibility
+        if AForm.Visible then//Only make sure their z-index is OK if they are 
already visible
+          ShowForm(AForm,true)
+      end;
     end;
   end;
   LayoutChanged;
@@ -2294,6 +2326,7 @@
 finalization
   FreeAndNil(IDEWindowCreators);
   FreeAndNil(IDEDialogLayoutList);
+  FreeAndNil(FIDEWindowsDontChangeVisibility);
 
 end.
 
Index: ide/sourceeditor.pp
===================================================================
--- ide/sourceeditor.pp (revision 49796)
+++ ide/sourceeditor.pp (working copy)
@@ -5740,6 +5740,7 @@
     Name := NonModalIDEWindowNames[nmiwSourceNoteBookName] + 
IntToStr(AWindowID+1)
   else
     Name := NonModalIDEWindowNames[nmiwSourceNoteBookName];
+  IDEWindowsDontChangeVisibility.Add(Name);
 
   if AWindowID > 0 then
     FBaseCaption := locWndSrcEditor + ' (' + IntToStr(AWindowID+1) + ')'
--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to