home *** CD-ROM | disk | FTP | other *** search
/ PC World Plus! (NZ) 2001 June / HDC50.iso / Runimage / Delphi50 / Demos / Docking / conjoinhost.pas < prev    next >
Pascal/Delphi Source File  |  1999-08-11  |  3KB  |  104 lines

  1. unit ConjoinHost;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DockForm;
  7.  
  8. type
  9.   TConjoinDockHost = class(TForm)
  10.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  11.     procedure FormDockDrop(Sender: TObject; Source: TDragDockObject; X,
  12.       Y: Integer);
  13.     procedure FormUnDock(Sender: TObject; Client: TControl;
  14.       NewTarget: TWinControl; var Allow: Boolean);
  15.     procedure FormDockOver(Sender: TObject; Source: TDragDockObject; X,
  16.       Y: Integer; State: TDragState; var Accept: Boolean);
  17.     procedure FormGetSiteInfo(Sender: TObject; DockClient: TControl;
  18.       var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
  19.   private
  20.     procedure DoFloat(AControl: TControl);
  21.   public
  22.     procedure UpdateCaption(Exclude: TControl);
  23.   end;
  24.  
  25. var
  26.   ConjoinDockHost: TConjoinDockHost;
  27.  
  28. implementation
  29.  
  30. {$R *.DFM}
  31.  
  32. procedure TConjoinDockHost.DoFloat(AControl: TControl);
  33. var
  34.   ARect: TRect;
  35. begin
  36.   //float the control with its original size.
  37.   ARect.TopLeft := AControl.ClientToScreen(Point(0, 0));
  38.   ARect.BottomRight := AControl.ClientToScreen(Point(AControl.UndockWidth,
  39.                        AControl.UndockHeight));
  40.   AControl.ManualFloat(ARect);
  41. end;
  42.  
  43. procedure TConjoinDockHost.FormClose(Sender: TObject;
  44.   var Action: TCloseAction);
  45. begin
  46.   if DockClientCount = 1 then
  47.   begin
  48.     DoFloat(DockClients[0]);
  49.     Action := caFree;
  50.   end else
  51.     Action := caHide;
  52. end;
  53.  
  54. procedure TConjoinDockHost.UpdateCaption(Exclude: TControl);
  55. var
  56.   I: Integer;
  57. begin
  58.   //if a dockable form is undocking, it will pass itself in as Exclude
  59.   //because even it hasn't actually been taken out of the DockClient array
  60.   //at this point.
  61.   Caption := '';
  62.   for I := 0 to DockClientCount-1 do
  63.     if DockClients[I].Visible and (DockClients[I] <> Exclude) then
  64.       Caption := Caption + TDockableForm(DockClients[I]).Caption + ' ';
  65. end;
  66.  
  67. procedure TConjoinDockHost.FormDockDrop(Sender: TObject;
  68.   Source: TDragDockObject; X, Y: Integer);
  69. begin
  70.   UpdateCaption(nil);
  71.   DockManager.ResetBounds(True);
  72.   //Force DockManager to redraw it's clients.
  73. end;
  74.  
  75. procedure TConjoinDockHost.FormUnDock(Sender: TObject; Client: TControl;
  76.   NewTarget: TWinControl; var Allow: Boolean);
  77. begin
  78.   //only 2 dock clients means the host must be destroyed and
  79.   //the remaining window undocked to its old position and size.
  80.   //(Recall that OnUnDock gets called before the undocking actually occurs)
  81.   if Client is TDockableForm then
  82.     TDockableForm(Client).DockSite := True;
  83.   if (DockClientCount = 2) and (NewTarget <> Self) then
  84.     PostMessage(Self.Handle, WM_CLOSE, 0, 0);
  85.   UpdateCaption(Client);
  86. end;
  87.  
  88. procedure TConjoinDockHost.FormDockOver(Sender: TObject;
  89.   Source: TDragDockObject; X, Y: Integer; State: TDragState;
  90.   var Accept: Boolean);
  91. begin
  92.   Accept := Source.Control is TDockableForm;
  93. end;
  94.  
  95. procedure TConjoinDockHost.FormGetSiteInfo(Sender: TObject;
  96.   DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint;
  97.   var CanDock: Boolean);
  98. begin
  99.   CanDock := DockClient is TDockableForm;
  100. end;
  101.  
  102. end.
  103.  
  104.