window_manager.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: window_manager.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:53:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_WORKSPACE___WINDOW_MANAGER_HPP
  10. #define GUI_WIDGETS_WORKSPACE___WINDOW_MANAGER_HPP
  11. /*  $Id: window_manager.hpp,v 1000.1 2004/06/01 19:53:43 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistl.hpp>
  42. #include <corelib/ncbistd.hpp>
  43. #include <gui/widgets/workspace/wm_container.hpp>
  44. #include <gui/widgets/workspace/wm_tab_control.hpp>
  45. #include <gui/widgets/workspace/wm_splitter.hpp>
  46. #include <gui/widgets/workspace/frame_window.hpp>
  47. BEGIN_NCBI_SCOPE
  48. /// CWindowManger commands
  49. enum    EWindowManagerCmds  {
  50.     eCmdInsHorzSplitter = 5100,
  51.     eCmdInsVertSplitter,
  52.     eCmdIns2x2Splitter,
  53.     eCmdInsTabControl,
  54.     eCmdDelTabPane,
  55.     eCmdDelContainer,
  56.     eCmdMoveToFrame,
  57.     eCmdMoveFromFrame,
  58.     eCmdMoveToPos,
  59.     eCmdMoveToContainer,
  60.     eCmdClientXXXX = 5200, /// initial value for programmatically generated pseudo-commands
  61.     eCmdClientLast = 5399, 
  62.         /// last available value for programmatically generated pseudo-commands
  63. };
  64. ///////////////////////////////////////////////////////////////////////////////
  65. /// IWindowManagerObserver
  66. class IWindowManagerObserver
  67. {
  68. public:
  69.     virtual void    OnClientChanged(IWMClient* client) = 0;
  70.     virtual ~IWindowManagerObserver() {};
  71. };
  72. class CWMRootContainer;
  73. ///////////////////////////////////////////////////////////////////////////////
  74. ///  CWindowManager - component controlling windowing of client windows.
  75. ///
  76. /// CWindowManager provides centralized control other multiple clients (views)
  77. /// associated with an application. Window Manager provides two major ways to 
  78. /// place clients - in independent top-level frame windows (floating) or in 
  79. /// containers emdedded into manager's main window (docked). CWindowManager
  80. /// allows for dynamic creation of hierarchical layouts consisting of containers
  81. /// such as CSplitter and CTabControl and clients.
  82. /// IWMClient interface represents an abstract client window that can  be 
  83. /// managed by CWindowManager. IWMContainer interface represents an abstract 
  84. /// container that can be embedded into CWindowManager. IWMCPosition represents
  85. /// abstract notion of position in IWMContainer. 
  86. class NCBI_GUIWIDGETS_WORKSPACE_EXPORT CWindowManager :  public Fl_Group,
  87.                         public CCommandTarget,
  88.                         public IWindowManager,
  89.                         public IFrameWindowClient
  90. {
  91. public:
  92.     enum    EClientState    {
  93.         eInvalid = -1,
  94.         eFloating,
  95.         eDocked,
  96.         eHidden
  97.     };
  98.     enum    EFrameCmd   {
  99.         eActivate,
  100.         eMaximize,
  101.         eMinimize,
  102.         eRestore
  103.     };
  104.     CWindowManager();
  105.     virtual ~CWindowManager();
  106.     void    SetObserver(IWindowManagerObserver* observer);
  107.     
  108.     Fl_Group*    GetRootWMContainer();
  109.     bool    AddClientInFrame(IWMClient* client);
  110.     bool    AddClientInTab(IWMClient* client);
  111.     
  112.     bool    MoveClientToFrame(IWMClient* client);
  113.     bool    MoveClientToTab(IWMClient* client);
  114.     
  115.     bool    RemoveClient(IWMClient* client);
  116.     void    RemoveAllClients();
  117.     IWMClient*  GetActiveClient();
  118.     
  119.     EClientState    GetClientState(IWMClient* client);
  120.     bool    FrameCommand(IWMClient* client, EFrameCmd cmd);
  121.     
  122.     void    OnMoveToFrame(IWMContainer* container, const IWMPosition& pos);
  123.     /// @name IWindowManager implementation
  124.     /// @{
  125.     virtual void    GetPopupItems(IWMContainer* container, const IWMPosition& pos, 
  126.                                   vector<CMenuItem*>& items);
  127.     virtual bool    OnContainerCommand(IWMContainer* container, 
  128.                                        const IWMPosition& pos, TCmdID cmd);
  129.     /// @}
  130.     /// @name IFrameWindowClient implementation
  131.     /// @{
  132.     virtual void    SetFrameWindow(CFrameWindow* frame);
  133.     virtual const CMenuItem*    GetMenu() const;
  134.     /// @}
  135.     /// @name Command handling
  136.     /// @{
  137.     DECLARE_CMD_MAP();
  138.     void    OnInsertSplitter(TCmdID cmd);
  139.     /// @}
  140. protected:
  141.     typedef vector<IWMClient*>  TClients;
  142.     struct  SClientRec  
  143.     {
  144.         IWMClient*      m_pClient;
  145.         IWMContainer*   m_pContainer;
  146.         bool    m_bFrame;
  147.         SClientRec();
  148.     };
  149.     
  150.     bool    x_RegisterClient(IWMClient* client);
  151.     bool    x_UnRegisterClient(IWMClient* client);
  152.     
  153.     SClientRec* x_GetClientRec(IWMClient* client);
  154.     int         x_GeneratePseudoCommand(IWMClient* client, int cmd);
  155.     CMenuItem*  x_GetMoveFromFrameMenu(IWMContainer* container, 
  156.                                      const IWMPosition& pos);
  157.     CMenuItem*  x_GetMoveHereMenu(IWMContainer* container, const IWMPosition& pos);
  158.     bool    x_OnPseudoCommand(IWMContainer* container, const IWMPosition& pos,
  159.                               TCmdID cmd);
  160.     
  161.     void    x_PutClientInFrame(IWMClient* client);
  162.     void    x_PutClientInTab(IWMClient* client);
  163.     void    x_GetFramedClients(TClients& clients);
  164.     void    x_InsertClient(IWMClient* client, IWMContainer* container,
  165.                            const IWMPosition& pos);
  166.     
  167.     bool    x_AddClient(IWMClient* client, bool b_frame);
  168.     void    x_Remove(IWMContainer* container, const IWMPosition& pos);
  169.     void    x_RemoveContainer(IWMContainer* container);
  170.     void    x_RemoveClient(IWMClient* client);
  171.     void    x_RemoveClient(SClientRec* rec);
  172.     void    x_CascadeRemove(IWMContainer* container, Fl_Widget* child);
  173.     void    x_ResetMenu();
  174.     void    x_InsertSplitter(IWMContainer* container, const IWMPosition& pos,
  175.                              CSplitter::EMode mode);
  176.     void    x_UpdateObserver(IWMClient* client);
  177.     
  178.     /// overrdining CCommandTarget behavior
  179.     virtual bool    x_ChildrenHandleCommand(const TCmdID cmd);
  180.     virtual bool    x_ChildrenUpdateCommand(const TCmdID cmd, ICmdUI* pCmdUI);
  181. protected:
  182.     typedef map<IWMClient*, SClientRec*>    TClientToRecMap;        
  183.     typedef map<int, pair<IWMClient*, int> >    TPseudoCmdMap; 
  184.                     /// maps generated commands to pair IWMClient, Command
  185.     CMenuItem*  m_MenuRoot; // root CMenuItem representing merged menus for clients
  186.     CWMTabControl*      m_pRootCont; // root IWMContainer
  187.     TClientToRecMap     m_ClientToRec;
  188.     IWindowManagerObserver* m_pObserver;
  189.     
  190.     TPseudoCmdMap     m_PseudoCmdMap;
  191.     int         m_PseudoCmdCount; /// number generated commands (for current popup)
  192.     int m_DefFrameW;
  193.     int m_DefFrameH;
  194.     int m_PosIncr;
  195.     int m_FrameX, m_FrameY;
  196.     CFrameWindow*   m_FrameWindow; // the frame manger belongs to
  197.     Fl_Widget*  m_PrevFocus; /// widget that previously focused
  198.     IWMClient*  m_ActiveClient;
  199.     
  200. };
  201. END_NCBI_SCOPE
  202. /*
  203.  * ===========================================================================
  204.  * $Log: window_manager.hpp,v $
  205.  * Revision 1000.1  2004/06/01 19:53:43  gouriano
  206.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  207.  *
  208.  * Revision 1.3  2004/05/20 12:24:55  dicuccio
  209.  * Added export specifiers
  210.  *
  211.  * Revision 1.2  2004/05/07 14:26:49  yazhuk
  212.  * Inherited CWindowManager from Fl_Group, CCommandTarget; implemented IFrameWindowClient
  213.  *
  214.  * Revision 1.1  2004/02/04 19:40:20  yazhuk
  215.  * Initial revision
  216.  *
  217.  * ===========================================================================
  218.  */
  219. #endif  // GUI_WIDGETS_WORKSPACE___WINDOW_MANAGER_HPP