include/gui/widgets/workspace/window_manager.hpp

Go to the documentation of this file.
00001 #ifndef GUI_WIDGETS_WORKSPACE___WINDOW_MANAGER_HPP
00002 #define GUI_WIDGETS_WORKSPACE___WINDOW_MANAGER_HPP
00003 
00004 /*  $Id: window_manager.hpp 14515 2007-05-04 17:18:18Z kazimird $
00005  * ===========================================================================
00006  *
00007  *                            PUBLIC DOMAIN NOTICE
00008  *               National Center for Biotechnology Information
00009  *
00010  *  This software/database is a "United States Government Work" under the
00011  *  terms of the United States Copyright Act.  It was written as part of
00012  *  the author's official duties as a United States Government employee and
00013  *  thus cannot be copyrighted.  This software/database is freely available
00014  *  to the public for use. The National Library of Medicine and the U.S.
00015  *  Government have not placed any restriction on its use or reproduction.
00016  *
00017  *  Although all reasonable efforts have been taken to ensure the accuracy
00018  *  and reliability of the software and data, the NLM and the U.S.
00019  *  Government do not and cannot warrant the performance or results that
00020  *  may be obtained by using this software or data. The NLM and the U.S.
00021  *  Government disclaim all warranties, express or implied, including
00022  *  warranties of performance, merchantability or fitness for any particular
00023  *  purpose.
00024  *
00025  *  Please cite the author in any work or product based on this material.
00026  *
00027  * ===========================================================================
00028  *
00029  * Authors:  Andrey Yazhuk
00030  *
00031  * File Description:
00032  *
00033  */
00034 
00035 #include <corelib/ncbistl.hpp>
00036 #include <corelib/ncbistd.hpp>
00037 
00038 #include <gui/widgets/workspace/wm_container.hpp>
00039 #include <gui/widgets/workspace/wm_tab_control.hpp>
00040 #include <gui/widgets/workspace/wm_splitter.hpp>
00041 #include <gui/widgets/workspace/wm_caption_panel.hpp>
00042 #include <gui/widgets/workspace/wm_dock_container.hpp>
00043 
00044 #include <objects/general/User_field.hpp>
00045 #include <gui/widgets/fl/frame_window.hpp>
00046 
00047 
00048 BEGIN_NCBI_SCOPE
00049 
00050 
00051 class CWMRootContainer;
00052 class CWindowManagerEvent;
00053 
00054 ///////////////////////////////////////////////////////////////////////////////
00055 ///  CWindowManager - component controlling windowing of client windows.
00056 ///
00057 /// CWindowManager provides centralized control other multiple clients (views)
00058 /// associated with an application. Window Manager provides two major ways to
00059 /// place clients - in independent top-level frame windows (floating) or in
00060 /// containers emdedded into manager's main window (docked). CWindowManager
00061 /// allows for dynamic creation of hierarchical layouts consisting of containers
00062 /// such as CSplitter and CTabControl and clients.
00063 /// IWMClient interface represents an abstract client window that can  be
00064 /// managed by CWindowManager. IWMContainer interface represents an abstract
00065 /// container that can be embedded into CWindowManager. IWMCPosition represents
00066 /// abstract notion of position in IWMContainer.
00067 
00068 class  CWindowManager
00069     : public Fl_Group,
00070       public CCommandTarget,
00071       public IWindowManager,
00072       public IFrameWindowClient
00073 {
00074 public:
00075     enum    EClientState    {
00076         eInvalidClientState = -1,
00077         eFloating,
00078         eEmbedded,
00079         eHidden
00080     };
00081 
00082     enum    EFrameCmd   {
00083         eActivate,
00084         eMaximize,
00085         eMinimize,
00086         eRestore
00087     };
00088 
00089     typedef CWMDockContainer::EDockPos  TDockPos;
00090 
00091     typedef vector<IWMClient*>  TClients;
00092     typedef CWindowManagerEvent TEvent;
00093 
00094 public:
00095     CWindowManager(CResourceManager& res_mgr);
00096     virtual ~CWindowManager();
00097 
00098     Fl_Group*    GetRootWMContainer();
00099 
00100     bool    AddClientInFrame(IWMClient& client);
00101     bool    AddClientInTab(IWMClient& client);
00102     bool    AddClientToDock(IWMClient& client, const string& dock_pos);
00103     bool    AddClient(IWMClient& client, IWMContainer& cont,
00104                       const IWMPosition& pos);
00105 
00106     bool    MoveClientToFrame(IWMClient& client);
00107     bool    MoveClientToTab(IWMClient& client);
00108 
00109     bool    CloseClient(IWMClient& client);
00110     void    CloseAllClients();
00111 
00112     /// checks if the client in registered in the Manager
00113     bool    Contains(IWMClient& client) const;
00114 
00115     void    GetAllClients(vector<IWMClient*>& clients);
00116     IWMClient*  GetActiveClient();
00117 
00118     void    ActivateClient(IWMClient& client);
00119     void    ActivateClients(TClients& clients);
00120 
00121     EClientState    GetClientState(IWMClient& client);
00122     bool    FrameCommand(IWMClient& client, EFrameCmd cmd);
00123 
00124     void    OnMoveToFrame(IWMContainer& container, const IWMPosition& pos);
00125 
00126     virtual string    GetDockPosLabel(IWMClient& client);
00127     virtual TDockPos  GetDockPos(IWMClient& client);
00128 
00129     /// @name Event handlers
00130     /// @{
00131     void    OnCloseContainer(CEvent* evt);
00132     void    OnCloseClient(CEvent* evt);
00133     void    OnMoveToTopLevel(CEvent* evt);
00134     void    OnDockClient(CEvent* evt);
00135     void    OnMaximize(CEvent* evt);
00136     void    OnRestoreMaximizedEvt(CEvent* evt);
00137     /// @}
00138 
00139     void    OnFocusChanged(Fl_Widget* new_focus); /// focus listener
00140 
00141     virtual objects::CUser_object*   LayoutToUserObject(const IWMContainer& cont) const;
00142 
00143     /// @name IWindowManager implementation
00144     /// @{
00145     virtual void    GetPopupItems(IWMContainer& container, const IWMPosition& pos,
00146                                   vector<CMenuItem*>& items);
00147     virtual bool    OnContainerCommand(IWMContainer& container,
00148                                        const IWMPosition& pos, TCmdID cmd);
00149     virtual bool    OnContainerUpdateCommand(IWMContainer& container,
00150                                        const IWMPosition& pos, TCmdID cmd, ICmdUI* pCmdUI);
00151     virtual CMenuItem*    GetCaptionPanelMenu(CWMCaptionPanel& panel);
00152     virtual bool    OnCaptionPanelCommand(CWMCaptionPanel& panel, TCmdID cmd);
00153     virtual bool    OnCaptionPanelUpdateCommand(CWMCaptionPanel& panel, TCmdID cmd, ICmdUI* pCmdUI);
00154     virtual CResourceManager*   GetResourceManager();
00155     /// @}
00156 
00157     /// @name IFrameWindowClient implementation
00158     /// @{
00159     virtual void    SetFrameWindow(CFrameWindow* frame);
00160     virtual CMenuItem*    GetMenu();
00161     virtual void    UpdateMenu(CMenuItem& root);
00162     /// @}
00163 
00164     /// @name Settings support
00165     /// @{
00166     void    SetRegistryPath(const string& path);
00167     void    LoadSettings();
00168     void    SaveSettings() const;
00169     /// @}
00170 
00171     /// @name Command handling
00172     /// @{
00173     void    OnInsertSplitter(TCmdID cmd);
00174     void    OnActivateWindow(TCmdID cmd);
00175 
00176     bool    OnResizeClient(TCmdID resize_cmd, CWMCaptionPanel& panel);
00177 
00178     bool    OnMinimizeClient(CWMCaptionPanel& panel);
00179     bool    OnRestoreClient(CWMCaptionPanel& panel);
00180     bool    OnRestoreMaximized();
00181     bool    OnRestoreMinimizedClient(CWMCaptionPanel& panel);
00182 
00183     bool    IsMaximized() const;
00184 
00185     bool    PostDockEvent(TCmdID cmd, CWMCaptionPanel& panel);
00186 
00187     bool    OnSetClientColor(CWMCaptionPanel& panel);
00188     /// @}
00189 
00190     virtual bool    Dispatch(CEvent* evt, EDispatch disp_how, int pool);
00191 
00192 protected:
00193     DECLARE_EVENT_MAP();
00194 
00195 protected:
00196     struct  SClientRec
00197     {
00198         IWMClient*          m_Client;
00199         IWMContainer*       m_Container; // container hosting the client
00200         CWMCaptionPanel*    m_Panel;     // panel associated with the client
00201         bool        m_bFrame;
00202         TDockPos    m_DockPos; // docking position, eInvalidDockPos if not docked
00203 
00204         SClientRec();
00205     };
00206 
00207     virtual void    x_CreateRootContainers();
00208     virtual void    x_RegisterIcons();
00209 
00210     bool    x_RegisterClient(IWMClient& client);
00211     bool    x_UnRegisterClient(IWMClient& client);
00212 
00213     SClientRec* x_GetClientRec(IWMClient* client);
00214     const SClientRec* x_GetClientRec(IWMClient* client) const;
00215 
00216     int         x_GeneratePseudoCommand(IWMClient& client, int cmd);
00217     CMenuItem*  x_GetMoveFromFrameMenu(IWMContainer& container,
00218                                        const IWMPosition& pos);
00219     CMenuItem*  x_GetMoveHereMenu(IWMContainer& container, const IWMPosition& pos);
00220     //CMenuItem*  x_CreateDockMenu() const;
00221     void    x_GetDockItems(vector<CMenuItem*>& items) const;
00222 
00223     bool    x_OnPseudoCommand(IWMContainer& container, const IWMPosition& pos,
00224                               TCmdID cmd);
00225     bool    x_UpdateDockCommand(CWMCaptionPanel& panel, TCmdID cmd,
00226                                 ICmdUI* cmd_ui);
00227     bool    x_UpdateMinMaxCommand(CWMCaptionPanel& panel, TCmdID cmd,
00228                                   ICmdUI* cmd_ui);
00229     bool    x_OnContainerUpdateCommand(IWMContainer& container,
00230                         const IWMPosition& pos, TCmdID cmd, ICmdUI* cmd_ui);
00231 
00232     enum    EAddOption  {
00233         eAddToRootTab,
00234         eAddToFrame,
00235         eAddToContainer
00236     };
00237 
00238     bool    x_AddClient(IWMClient& client, EAddOption option,
00239                         IWMContainer* cont = NULL, const IWMPosition* pos = NULL);
00240 
00241     bool    x_IsFloatingEnabled()   const   {   return m_bEnableFloating;   }
00242 
00243     void    x_PutClientInFrame(IWMClient& client);
00244     void    x_PutClientInTab(IWMClient& client);
00245     void    x_GetFramedClients(TClients& clients);
00246     CWMCaptionPanel* x_InsertClient(IWMClient& client, IWMContainer& container,
00247                                     const IWMPosition& pos,
00248                                     bool minimized = false);
00249     void    x_MoveInContainer(IWMClient& client, IWMContainer& container,
00250                            const IWMPosition& pos);
00251     void    x_MoveClientToTopLevel(IWMClient& client);
00252     void    x_MoveToDockPos(IWMClient& client, TDockPos pos);
00253     void    x_Close(IWMContainer& container, const IWMPosition& pos);
00254     bool    x_CloseClient(IWMClient& client);
00255     void    x_RemoveContainer(IWMContainer& container);
00256     void    x_RemoveClient(IWMClient& client);
00257     void    x_RemoveClient(SClientRec& rec);
00258     void    x_CascadeClose(IWMContainer& container, Fl_Widget* child);
00259 
00260     void    x_InsertSplitter(IWMContainer& container, const IWMPosition& pos,
00261                              CSplitter::EMode mode);
00262     CWMTabControl* x_WrapClientInTabControl(IWMContainer& cont, IWMPosition& pos);
00263 
00264     void    x_Maximize(IWMClient& client);
00265     void    x_RestoreMaximized();
00266 
00267     void    x_UpdateListener(IWMClient& client);
00268 
00269     void    x_ResetMenu();
00270 
00271     virtual void    x_UpdateActiveClient(void);
00272     virtual void    x_SetActiveClient(void);
00273 
00274     virtual void    x_OnSaveLayout(IWMContainer& cont, const IWMPosition* pos);
00275 
00276     /// overrdining CCommandTarget behavior
00277     virtual bool    OnCommand(const TCmdID cmd);
00278     //virtual bool    OnUpdateCommand(const TCmdID cmd, ICmdUI* pCmdUI);
00279 
00280     IWMClient*          x_GetClientByWidget(Fl_Widget* widget) const;
00281     const   IWMClient*  x_GetClientByWidget(const Fl_Widget* widget) const;
00282     CWMCaptionPanel*    x_GetCaptionPanelByClient(Fl_Widget* widget);
00283     CWMCaptionPanel*    x_GetCaptionPanelByWidget(Fl_Widget* widget);
00284     CWMCaptionPanel*    x_GetCaptionPanelByClient(IWMClient& client);
00285     IWMContainer*       x_GetContainerByWidget(IWMClient& client);
00286 
00287     virtual void    x_UpdateWindowsMenu(CMenuItem& root);
00288 
00289     virtual Fl_Widget*  x_CreateWindowFromUserObject(IWMContainer* cont,
00290                                                      const IWMPosition* pos,
00291                                    const objects::CUser_object& descr);
00292     virtual objects::CUser_object*
00293                 x_ChildToUserObject(const IWMContainer::TChild* child) const;
00294 
00295     string  x_GetClientLabelForMenu(IWMClient& client);
00296 
00297 protected:
00298     typedef map<IWMClient*, SClientRec*>    TClientToRecMap;
00299     typedef map<Fl_Widget*, IWMClient*>     TWidgetToClientMap;
00300     typedef map<int, pair<IWMClient*, int> >    TPseudoCmdMap;
00301                     /// maps generated commands to pair IWMClient, Command
00302 
00303     typedef map<int, IWMClient*>    TCmdToWindowMap;
00304 
00305     CResourceManager&   m_ResourceManager;
00306 
00307     bool    m_bEnableFloating;  /// enable support for floating frames
00308 
00309     CWMTabControl*      m_RootCont; /// root IWMContainer
00310     TClientToRecMap     m_ClientToRec;
00311     TWidgetToClientMap  m_WidgetToClient;
00312 
00313     TPseudoCmdMap   m_PseudoCmdMap;
00314     int             m_PseudoCmdCount; /// number of generated commands (for current popup)
00315 
00316     int m_DefFrameW;
00317     int m_DefFrameH;
00318     int m_PosIncr;
00319     int m_FrameX, m_FrameY;
00320 
00321     CFrameWindow*   m_FrameWindow;
00322     Fl_Widget*      m_PrevFocus;  /// widget that was previously focused
00323 
00324     IWMClient*      m_ActiveClient;
00325     CCommandTarget* m_ActiveClientTarget; /// pointer to CCommandTarget interface
00326     /// belonging to focused IWMClient
00327 
00328     TCmdToWindowMap m_CmdToWindow;
00329 
00330     CWMDockContainer*   m_DockContainer;
00331 
00332     // if a client is maximized m_RestorePos holds it "restored" position in
00333     // m_RestoreCont
00334     CWMCaptionPanel*    m_MaximizedPanel;
00335     auto_ptr<IWMPosition>   m_RestorePos;
00336     IWMContainer*   m_RestoreCont;
00337 
00338     string m_RegPath; // path to the setting in CGuiRegistry
00339 };
00340 
00341 
00342 
00343 ///////////////////////////////////////////////////////////////////////////////
00344 /// CWindowManagerEvent
00345 class  CWindowManagerEvent : public CEvent
00346 {
00347 public:
00348     enum EEventType {
00349         eClientChanged = CEvent::eEvent_MinClientID,
00350         eBeforeClientClosed,
00351         eClientClosed,
00352         eCloseContainer,
00353         eCloseClient,
00354         eMoveToTopLevel,
00355         eDockClient,
00356         eMaximize,
00357         eRestoreMaximized
00358     };
00359 
00360     CWindowManagerEvent(EEventType type, IWMClient* client);
00361     CWindowManagerEvent(CWindowManager::TDockPos pos, IWMClient* client);
00362     CWindowManagerEvent(EEventType type, IWMContainer* container);
00363 
00364     IWMClient*      GetClient();
00365     IWMContainer*   GetContainer();
00366     CWindowManager::TDockPos    GetDockPos() const;
00367 
00368 protected:
00369     IWMClient*      m_Client;
00370     IWMContainer*   m_Container;
00371     CWindowManager::TDockPos    m_DockPos;
00372 };
00373 
00374 
00375 
00376 END_NCBI_SCOPE
00377 
00378 #endif  // GUI_WIDGETS_WORKSPACE___WINDOW_MANAGER_HPP
00379 
00380 

Generated on Sun Nov 8 22:08:07 2009 for NCBI C++ ToolKit by  doxygen 1.4.6
Modified on Mon Nov 09 15:45:08 2009 by modify_doxy.py rev. 173732