Hi Dmitry,

I believe you are the Author/Maintainer of the Manual docker package?

Due to the introduction of multiply open SourceEditorWindows, and the resulting changes in SrcEditorIntf the ManualDocker package needs some updates.

I have attached a patch that should fix all issues.

Best Regards
Martin
Index: mandocking.pas
===================================================================
--- mandocking.pas      (revision 1186)
+++ mandocking.pas      (working copy)
@@ -35,6 +35,8 @@
   { TManualDocker }
 
   TManualDocker = class(TObject)
+  private
+    FCurrentSrcWin: TWinControl;
   protected
     procedure ChangeDocking(DockingEnabled: Boolean);
     procedure LoadState(cfg: TXMLConfig; var Astate: TDockState; const 
StateName: string);
@@ -43,8 +45,12 @@
     procedure SaveStates;
 
     procedure AllocControls(AParent: TWinControl);
+    procedure DeallocControls;
     procedure RealignControls;
     procedure UpdateDockState(var astate: TDockState; wnd: TWinControl);
+
+    procedure SourceWindowCreated(Sender: TObject);
+    procedure SourceWindowDestroyed(Sender: TObject);
   public
     ConfigPath  : AnsiString;
     split       : TSplitter;
@@ -87,8 +93,10 @@
   i  : Integer;
 begin
   if DockingEnabled then begin
-    if not Assigned(SourceEditorWindow) or not Assigned(IDEMessagesWindow) 
then Exit;
-    if not Assigned(panel) then AllocControls(SourceEditorWindow);
+    if not (Assigned(SourceEditorManagerIntf) and 
Assigned(SourceEditorManagerIntf.ActiveSourceWindow))
+       or not Assigned(IDEMessagesWindow)
+    then Exit;
+    if not Assigned(panel) then 
AllocControls(SourceEditorManagerIntf.ActiveSourceWindow);
     split.visible:=true;
     panel.visible:=true;
     with IDEMessagesWindow do
@@ -117,6 +125,7 @@
       IDEMessagesWindow.BorderStyle := FloatBrd;
     end;
     IDEMessagesWindow.TabStop := true;
+    IDEMessagesWindow.Show;
   end;
   MsgWnd.docked := DockingEnabled;
   cmd.Checked := DockingEnabled;
@@ -127,6 +136,11 @@
   pths  : array [0..1] of String;
   i     : Integer;
 begin
+  if SourceEditorManagerIntf <> nil then begin
+    SourceEditorManagerIntf.RegisterChangeEvent(semWindowCreate, 
@SourceWindowCreated);
+    SourceEditorManagerIntf.RegisterChangeEvent(semWindowDestroy, 
@SourceWindowDestroyed);
+  end;
+
   pths[0]:= LazarusIDE.GetPrimaryConfigPath;
   pths[1]:= LazarusIDE.GetSecondaryConfigPath;
   for i := 0 to length(pths)-1 do begin
@@ -169,6 +183,7 @@
 
 procedure TManualDocker.AllocControls(AParent: TWinControl);
 begin
+  FCurrentSrcWin := AParent;
   panel := TPanel.Create(nil);
   panel.Parent := AParent;
   panel.BorderStyle := bsNone;
@@ -179,6 +194,12 @@
   RealignControls;
 end;
 
+procedure TManualDocker.DeallocControls;
+begin
+  FreeAndNil(split);
+  FreeAndNil(panel);
+end;
+
 procedure TManualDocker.RealignControls;
 begin
   panel.Align := alClient;
@@ -193,6 +214,34 @@
   astate.DockSize.cy := wnd.ClientHeight;
 end;
 
+procedure TManualDocker.SourceWindowCreated(Sender: TObject);
+begin
+  if Assigned(FCurrentSrcWin) or (SourceEditorManagerIntf.SourceWindowCount > 
1) then
+    exit;
+  if MsgWnd.Docked then
+    ChangeDocking(true);
+end;
+
+procedure TManualDocker.SourceWindowDestroyed(Sender: TObject);
+var
+  IsDocked: Boolean;
+begin
+  IsDocked := MsgWnd.docked;
+  if FCurrentSrcWin <> Sender then exit;
+  if IsDocked then
+    ChangeDocking(False);
+  FCurrentSrcWin := nil;
+  DeallocControls;
+  if IsDocked then begin
+    if (SourceEditorManagerIntf.SourceWindowCount >= 1) then
+      ChangeDocking(True)
+    else
+    if Assigned(IDEMessagesWindow) then
+      IDEMessagesWindow.Hide;
+    MsgWnd.Docked := IsDocked;
+  end;
+end;
+
 procedure TManualDocker.LoadState(cfg: TXMLConfig; var Astate: TDockState;
   const StateName: string);
 begin
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to