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

  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   Menus, StdCtrls, ComCtrls, ActnList, ToolWin, ExtCtrls, DockForm;
  8.  
  9. type
  10.   TMainForm = class(TForm)
  11.     CoolBar1: TCoolBar;
  12.     ToolBar1: TToolBar;
  13.     ToolBar2: TToolBar;
  14.     ToolButton1: TToolButton;
  15.     ToolButton2: TToolButton;
  16.     ToolButton3: TToolButton;
  17.     ToolButton5: TToolButton;
  18.     ToolButton6: TToolButton;
  19.     ToolButton7: TToolButton;
  20.     ToolButton13: TToolButton;
  21.     btnToolBar1: TToolButton;
  22.     btnToolBar2: TToolButton;
  23.     ActionList1: TActionList;
  24.     ViewToolBar1: TAction;
  25.     ViewToolBar2: TAction;
  26.     LeftDockPanel: TPanel;
  27.     BottomDockPanel: TPanel;
  28.     VSplitter: TSplitter;
  29.     HSplitter: TSplitter;
  30.     MainMenu1: TMainMenu;
  31.     File2: TMenuItem;
  32.     Exit2: TMenuItem;
  33.     View2: TMenuItem;
  34.     N2: TMenuItem;
  35.     ToolBar21: TMenuItem;
  36.     ToolBar11: TMenuItem;
  37.     ToolButton16: TToolButton;
  38.     ViewWhiteWindow: TAction;
  39.     ExitAction: TAction;
  40.     ViewBlueWindow: TAction;
  41.     ViewGreenWindow: TAction;
  42.     ViewRedWindow: TAction;
  43.     ViewTealWindow: TAction;
  44.     ViewPurpleWindow: TAction;
  45.     ViewLimeWindow: TAction;
  46.     ToolButton4: TToolButton;
  47.     White1: TMenuItem;
  48.     Blue1: TMenuItem;
  49.     Green1: TMenuItem;
  50.     Lime1: TMenuItem;
  51.     Purple1: TMenuItem;
  52.     Red1: TMenuItem;
  53.     Teal1: TMenuItem;
  54.     procedure FormCreate(Sender: TObject);
  55.     procedure CoolBar1DockOver(Sender: TObject; Source: TDragDockObject; X,
  56.       Y: Integer; State: TDragState; var Accept: Boolean);
  57.     procedure ViewToolBar1Execute(Sender: TObject);
  58.     procedure ViewToolBar2Execute(Sender: TObject);
  59.     procedure Exit1Click(Sender: TObject);
  60.     procedure LeftDockPanelDockDrop(Sender: TObject;
  61.       Source: TDragDockObject; X, Y: Integer);
  62.     procedure LeftDockPanelDockOver(Sender: TObject;
  63.       Source: TDragDockObject; X, Y: Integer; State: TDragState;
  64.       var Accept: Boolean);
  65.     procedure BottomDockPanelDockOver(Sender: TObject;
  66.       Source: TDragDockObject; X, Y: Integer; State: TDragState;
  67.       var Accept: Boolean);
  68.     procedure LeftDockPanelUnDock(Sender: TObject; Client: TControl;
  69.       NewTarget: TWinControl; var Allow: Boolean);
  70.     procedure ExitActionExecute(Sender: TObject);
  71.     procedure ViewWhiteWindowExecute(Sender: TObject);
  72.     procedure LeftDockPanelGetSiteInfo(Sender: TObject;
  73.       DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint;
  74.       var CanDock: Boolean);
  75.   private
  76.     procedure CreateDockableWindows;
  77.   public
  78.     procedure ShowDockPanel(APanel: TPanel; MakeVisible: Boolean; Client: TControl);
  79.   end;
  80.  
  81. var
  82.   MainForm: TMainForm;
  83.  
  84. implementation
  85.  
  86. uses TabHost, ConjoinHost;
  87.  
  88. {$R *.DFM}
  89.  
  90. const
  91.   Colors: array[0..6] of TColor = (clWhite, clBlue, clGreen, clRed, clTeal,
  92.                                    clPurple, clLime);
  93.   ColStr: array[0..6] of string = ('White', 'Blue', 'Green', 'Red', 'Teal',
  94.                                    'Purple', 'Lime');
  95.  
  96. var
  97.   DockWindows: array[0..6] of TDockableForm;
  98.  
  99. {TMainForm}
  100.  
  101. procedure TMainForm.FormCreate(Sender: TObject);
  102. begin
  103.   CreateDockableWindows;
  104. end;
  105.  
  106. procedure TMainForm.CreateDockableWindows;
  107. var
  108.   I: Integer;
  109. begin
  110.   for I := 0 to High(DockWindows) do
  111.   begin
  112.     DockWindows[I] := TDockableForm.Create(Application);
  113.     DockWindows[I].Caption := ColStr[I];
  114.     DockWindows[I].Memo1.Color := Colors[I];
  115.     DockWindows[I].Memo1.Font.Color := Colors[I] xor $00FFFFFF;
  116.     DockWindows[I].Memo1.Text := ColStr[I] + ' window ';
  117.   end;
  118. end;
  119.  
  120. procedure TMainForm.CoolBar1DockOver(Sender: TObject; Source: TDragDockObject;
  121.   X, Y: Integer; State: TDragState; var Accept: Boolean);
  122. var
  123.   ARect: TRect;
  124. begin
  125.   Accept := (Source.Control is TToolBar);
  126.   if Accept then
  127.   begin
  128.     //Modify the DockRect to preview dock area (Coolbar client area)
  129.     ARect.TopLeft := CoolBar1.ClientToScreen(CoolBar1.ClientRect.TopLeft);
  130.     ARect.BottomRight := CoolBar1.ClientToScreen(CoolBar1.ClientRect.BottomRight);
  131.     Source.DockRect := ARect;
  132.   end;
  133. end;
  134.  
  135. procedure TMainForm.ViewToolBar1Execute(Sender: TObject);
  136. begin
  137.   //Toggles the visible state of Toolbar1, regardless of it's docked state.
  138.   ToolBar11.Checked := not ToolBar11.Checked;
  139.   btnToolBar1.Down := ToolBar11.Checked;
  140.   if ToolBar1.Floating then
  141.     ToolBar1.HostDockSite.Visible := ToolBar11.Checked
  142.   else
  143.     ToolBar1.Visible := ToolBar11.Checked;
  144. end;
  145.  
  146. procedure TMainForm.ViewToolBar2Execute(Sender: TObject);
  147. begin
  148.   //Toggles the visible state of Toolbar2, regardless of it's docked state.
  149.   ToolBar21.Checked := not ToolBar21.Checked;
  150.   btnToolBar2.Down := ToolBar21.Checked;
  151.   if ToolBar2.Floating then
  152.     TToolDockForm(ToolBar2.HostDockSite).Visible := ToolBar21.Checked
  153.   else
  154.     ToolBar2.Visible := ToolBar21.Checked;
  155. end;
  156.  
  157. procedure TMainForm.Exit1Click(Sender: TObject);
  158. begin
  159.   Close;
  160. end;
  161.  
  162. procedure TMainForm.LeftDockPanelDockDrop(Sender: TObject;
  163.   Source: TDragDockObject; X, Y: Integer);
  164. begin
  165.   //OnDockDrop gets called AFTER the client has actually docked,
  166.   //so we check for DockClientCount = 1 before making the dock panel visible.
  167.   if (Sender as TPanel).DockClientCount = 1 then
  168.     ShowDockPanel(Sender as TPanel, True, nil);
  169.   (Sender as TPanel).DockManager.ResetBounds(True);
  170.   //Make DockManager repaints it's clients.    
  171. end;
  172.  
  173. procedure TMainForm.LeftDockPanelDockOver(Sender: TObject;
  174.   Source: TDragDockObject; X, Y: Integer; State: TDragState;
  175.   var Accept: Boolean);
  176. var
  177.   ARect: TRect;
  178. begin
  179.   Accept := Source.Control is TDockableForm;
  180.   if Accept then
  181.   begin
  182.     //Modify the DockRect to preview dock area.
  183.     ARect.TopLeft := LeftDockPanel.ClientToScreen(Point(0, 0));
  184.     ARect.BottomRight := LeftDockPanel.ClientToScreen(
  185.       Point(Self.ClientWidth div 3, LeftDockPanel.Height));
  186.     Source.DockRect := ARect;
  187.   end;
  188. end;
  189.  
  190. procedure TMainForm.BottomDockPanelDockOver(Sender: TObject;
  191.   Source: TDragDockObject; X, Y: Integer; State: TDragState;
  192.   var Accept: Boolean);
  193. var
  194.   ARect: TRect;
  195. begin
  196.   Accept := Source.Control is TDockableForm;
  197.   if Accept then
  198.   begin
  199.     //Modify the DockRect to preview dock area.
  200.     ARect.TopLeft := BottomDockPanel.ClientToScreen(
  201.       Point(0, -Self.ClientHeight div 3));
  202.     ARect.BottomRight := BottomDockPanel.ClientToScreen(
  203.       Point(BottomDockPanel.Width, BottomDockPanel.Height));
  204.     Source.DockRect := ARect;
  205.   end;
  206. end;
  207.  
  208. procedure TMainForm.LeftDockPanelUnDock(Sender: TObject; Client: TControl;
  209.   NewTarget: TWinControl; var Allow: Boolean);
  210. begin
  211.   //OnUnDock gets called BEFORE the client is undocked, in order to optionally
  212.   //disallow the undock. DockClientCount is never 0 when called from this event.
  213.   if (Sender as TPanel).DockClientCount = 1 then
  214.     ShowDockPanel(Sender as TPanel, False, nil);
  215. end;
  216.  
  217. procedure TMainForm.ShowDockPanel(APanel: TPanel; MakeVisible: Boolean; Client: TControl);
  218. begin
  219.   //Client - the docked client to show if we are re-showing the panel.
  220.   //Client is ignored if hiding the panel.
  221.  
  222.   //Since docking to a non-visible docksite isn't allowed, instead of setting
  223.   //Visible for the panels we set the width to zero. The default InfluenceRect
  224.   //for a control extends a few pixels beyond it's boundaries, so it is possible
  225.   //to dock to zero width controls.
  226.  
  227.   //Don't try to hide a panel which has visible dock clients.
  228.   if not MakeVisible and (APanel.VisibleDockClientCount > 1) then
  229.     Exit;
  230.  
  231.   if APanel = LeftDockPanel then
  232.     VSplitter.Visible := MakeVisible
  233.   else
  234.     HSplitter.Visible := MakeVisible;
  235.  
  236.     if MakeVisible then
  237.       if APanel = LeftDockPanel then
  238.       begin
  239.         APanel.Width := ClientWidth div 3;
  240.         VSplitter.Left := APanel.Width + VSplitter.Width;
  241.       end
  242.       else begin
  243.         APanel.Height := ClientHeight div 3;
  244.         HSplitter.Top := ClientHeight - APanel.Height - HSplitter.Width;
  245.       end
  246.     else
  247.       if APanel = LeftDockPanel then
  248.         APanel.Width := 0
  249.       else
  250.         APanel.Height := 0;
  251.   if MakeVisible and (Client <> nil) then Client.Show;
  252. end;
  253.  
  254. procedure TMainForm.ExitActionExecute(Sender: TObject);
  255. begin
  256.   Close;
  257. end;
  258.  
  259. procedure TMainForm.ViewWhiteWindowExecute(Sender: TObject);
  260. var
  261.   DockWindow: TDockableForm;
  262. begin
  263.   DockWindow := DockWindows[(Sender as TComponent).Tag];
  264.   with DockWindow do
  265.     //if the docked window is TabDocked, it is docked to the PageControl
  266.     //(owned by TTabDockHost) so show the host form.
  267.     if HostDockSite is TPageControl then
  268.       TTabDockHost(HostDockSite.Owner).Show
  269.     else
  270.       //If window is conjoin-docked, host and/or form may not be visible
  271.       //so show both.
  272.       if (HostDockSite is TConjoinDockHost) and not HostDockSite.Visible then
  273.       begin
  274.         HostDockSite.Show;
  275.         TConjoinDockHost(HostDockSite).UpdateCaption(nil);
  276.         DockWindow.Show;
  277.       end else
  278.         //If form is docked to one of the "hidden" docking panels, resize the
  279.         //panel and re-show the docked form.
  280.         if (HostDockSite is TPanel)
  281.         and ((HostDockSite.Height = 0) or (HostDockSite.Width = 0)) then
  282.           MainForm.ShowDockPanel(HostDockSite as TPanel, True, DockWindow)
  283.         else
  284.           //if the window isn't docked at all, simply show it.
  285.           DockWindow.Show;
  286. end;
  287.  
  288. procedure TMainForm.LeftDockPanelGetSiteInfo(Sender: TObject;
  289.   DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint;
  290.   var CanDock: Boolean);
  291. begin
  292.   //if CanDock is true, the panel will not automatically draw the preview rect.
  293.   CanDock := DockClient is TDockableForm;
  294. end;
  295.  
  296. end.
  297.