00001 #ifndef GUI_WIDGETS_WORKSPACE___WINDOW_MANAGER_HPP
00002 #define GUI_WIDGETS_WORKSPACE___WINDOW_MANAGER_HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
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
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
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
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
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);
00140
00141 virtual objects::CUser_object* LayoutToUserObject(const IWMContainer& cont) const;
00142
00143
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
00158
00159 virtual void SetFrameWindow(CFrameWindow* frame);
00160 virtual CMenuItem* GetMenu();
00161 virtual void UpdateMenu(CMenuItem& root);
00162
00163
00164
00165
00166 void SetRegistryPath(const string& path);
00167 void LoadSettings();
00168 void SaveSettings() const;
00169
00170
00171
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;
00200 CWMCaptionPanel* m_Panel;
00201 bool m_bFrame;
00202 TDockPos m_DockPos;
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
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
00277 virtual bool OnCommand(const TCmdID cmd);
00278
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
00302
00303 typedef map<int, IWMClient*> TCmdToWindowMap;
00304
00305 CResourceManager& m_ResourceManager;
00306
00307 bool m_bEnableFloating;
00308
00309 CWMTabControl* m_RootCont;
00310 TClientToRecMap m_ClientToRec;
00311 TWidgetToClientMap m_WidgetToClient;
00312
00313 TPseudoCmdMap m_PseudoCmdMap;
00314 int m_PseudoCmdCount;
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;
00323
00324 IWMClient* m_ActiveClient;
00325 CCommandTarget* m_ActiveClientTarget;
00326
00327
00328 TCmdToWindowMap m_CmdToWindow;
00329
00330 CWMDockContainer* m_DockContainer;
00331
00332
00333
00334 CWMCaptionPanel* m_MaximizedPanel;
00335 auto_ptr<IWMPosition> m_RestorePos;
00336 IWMContainer* m_RestoreCont;
00337
00338 string m_RegPath;
00339 };
00340
00341
00342
00343
00344
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