window_manager.cpp

来自「ncbi源码」· C++ 代码 · 共 766 行 · 第 1/2 页

CPP
766
字号
        x_RemoveClient(p_client);        x_PutClientInFrame(p_client);                x_UpdateObserver(p_client);    }}void    CWindowManager::x_InsertClient(IWMClient* client, IWMContainer* container,                                       const IWMPosition& pos){    SClientRec* p_rec = x_GetClientRec(client);    _ASSERT(p_rec->m_pContainer == NULL);    p_rec->m_pContainer = container;    Fl_Widget* widget = dynamic_cast<Fl_Widget*>(client);    _ASSERT(widget);    container->Insert(widget, pos);}                                        /// removes Client or container from specified positionvoid    CWindowManager::x_Remove(IWMContainer* container, const IWMPosition& pos){    Fl_Widget* child = container->GetChild(pos);    x_CascadeRemove(container, child);}/// removes widgets from it's container and recursiveli removes all its childrenvoid    CWindowManager::x_CascadeRemove(IWMContainer* container, Fl_Widget* child){    IWMClient* p_client = dynamic_cast<IWMClient*>(child);    if(p_client)    {        x_RemoveClient(p_client);    } else {        IWMContainer* p_cont = dynamic_cast<IWMContainer*>(child);        if(p_cont)  {            container->Remove(child);            // remove child's children             vector<Fl_Widget*> children;            p_cont->GetChildren(children);                        for( size_t i = 0; i < children.size(); i++ )    {                Fl_Widget* child = children[i];                x_CascadeRemove(p_cont, child);            }            delete p_cont;        } else _ASSERT(false); // unexpected    }}void    CWindowManager::x_RemoveContainer(IWMContainer* container){    if(container != m_pRootCont)   {        Fl_Widget* widget = dynamic_cast<Fl_Widget*>(container);        _ASSERT(widget);        IWMContainer* parent_cont = dynamic_cast<IWMContainer*>(widget->parent());                x_CascadeRemove(parent_cont, widget);    }}void    CWindowManager::x_RemoveClient(IWMClient* client){    SClientRec* p_rec = x_GetClientRec(client);    if(p_rec)        x_RemoveClient(p_rec);}// removes client from its current container, but does not unregister itvoid    CWindowManager::x_RemoveClient(SClientRec* rec){    _ASSERT(rec);    if(rec->m_pClient == m_ActiveClient)   { // reset active client        m_ActiveClient = NULL;        m_PrevFocus = NULL;    }        CCommandTarget* target = dynamic_cast<CCommandTarget*>(rec->m_pClient);    if(target)  { // disconnect from command routing        RemoveChildCmdTarget(target);    }    // remove from the container    Fl_Widget* widget = dynamic_cast<Fl_Widget*>(rec->m_pClient);    if(rec->m_pContainer)   {        rec->m_pContainer->Remove(widget);            CWMFrameWindow* p_frame = dynamic_cast<CWMFrameWindow*>(rec->m_pContainer);        if(p_frame) { // if container - frame, destroy it            delete p_frame;        }        rec->m_pContainer = NULL;        rec->m_bFrame = false;    }}bool    CWindowManager::RemoveClient(IWMClient* client){    TClientToRecMap::iterator it = m_ClientToRec.find(client);    if(it != m_ClientToRec.end())   {        SClientRec* p_rec = it->second;        x_RemoveClient(p_rec);        x_UnRegisterClient(client);        x_ResetMenu();        return true;    }    return false;}void    CWindowManager::RemoveAllClients(){    while(m_ClientToRec.size())  {        SClientRec* p_rec = m_ClientToRec.begin()->second;        x_RemoveClient(p_rec);        x_UnRegisterClient(p_rec->m_pClient);    }    x_ResetMenu();}IWMClient*  CWindowManager::GetActiveClient(){    return m_ActiveClient;}/// Regenerate Window Manager's menu and request Frame Window to reset it's menu.void    CWindowManager::x_ResetMenu(){    if(m_FrameWindow)   {        m_MenuRoot = CreateMenuItems(BaseMenu);        ITERATE(TClientToRecMap, it, m_ClientToRec) {            SClientRec* p_rec = it->second;            if(p_rec->m_pContainer)    { ///###                const CMenuItem* root = p_rec->m_pClient->GetMenu();                if(root)    { // merge Client's menu into Manager's menu                    m_MenuRoot->Merge(*root);                }            }        }                // Reseting Frame Window's will automatically request the new menu from Window Manager        // so that our changes to it will take effect        m_FrameWindow->ResetMenu();    }}// creates entry in m_ClientToRec table if it does not existbool    CWindowManager::x_RegisterClient(IWMClient* client){    if(client  &&  m_ClientToRec.find(client) == m_ClientToRec.end())   {        SClientRec* p_rec = new SClientRec;        p_rec->m_pClient = client;        p_rec->m_pContainer = NULL;        p_rec->m_bFrame = false;                m_ClientToRec[client] = p_rec;        return true;    }    return false;}// deletes m_ClientToRec entry corresponding to the clientbool    CWindowManager::x_UnRegisterClient(IWMClient* client){    TClientToRecMap::iterator it = m_ClientToRec.find(client);    if(it != m_ClientToRec.end())   {        delete it->second;        m_ClientToRec.erase(it);        return true;    }    return false;}CWindowManager::EClientState    CWindowManager::GetClientState(IWMClient* client){    SClientRec* p_rec = x_GetClientRec(client);    if(p_rec)   {        if(p_rec->m_pContainer) {            return p_rec->m_bFrame ? eFloating : eDocked;        } else  return eHidden;    }    return eInvalid;}CWindowManager::SClientRec* CWindowManager::x_GetClientRec(IWMClient* client){    TClientToRecMap::iterator it = m_ClientToRec.find(client);    return (it == m_ClientToRec.end()) ? NULL : it->second;}/// Creates new CWMFrameWindow and inserts client into it.void    CWindowManager::x_PutClientInFrame(IWMClient* client){        Fl_Widget* widget = dynamic_cast<Fl_Widget*>(client);    SClientRec* p_rec = m_ClientToRec[client];    _ASSERT(widget);        CWMFrameWindow* p_frame =         new CWMFrameWindow(m_FrameX, m_FrameY, m_DefFrameW, m_DefFrameH,                            widget->label());    m_FrameX += m_PosIncr;    if(m_FrameX + m_DefFrameW > Fl::x() + Fl::w())  {        m_FrameX = Fl::x();    }    m_FrameY += m_PosIncr;    if(m_FrameY + m_DefFrameH > Fl::y() + Fl::h())  {        m_FrameY = Fl::y();    }        CWMFrameWndPos* p_pos = new CWMFrameWndPos(true);    bool b_ok = p_frame->Insert(widget, *p_pos);    _ASSERT(b_ok);    // filling SClientRec    p_rec->m_pContainer = static_cast<IWMContainer*>(p_frame);    p_rec->m_bFrame = true;    p_frame->show();}void    CWindowManager::x_PutClientInTab(IWMClient* client){    CWMTabControl* p_tab = dynamic_cast<CWMTabControl*>(m_pRootCont);    _ASSERT(p_tab);    int index = p_tab->GetTabsCount();    CWMTabPos pos(index);        x_InsertClient(client, m_pRootCont, pos);}void    CWindowManager::x_GetFramedClients(TClients& clients){    clients.clear();    ITERATE(TClientToRecMap, it, m_ClientToRec) {        SClientRec* p_rec = it->second;        if(p_rec->m_bFrame) {            clients.push_back(it->first);        }    }}static int s_iColor = 0;const static int kColors = 4;static Fl_Color    GetRandomColor(){    s_iColor = (s_iColor + 1) % kColors;    switch(s_iColor)    {    case 0: return fl_rgb_color(192, 192, 255);    case 1: return fl_rgb_color(255, 192, 192);    case 2: return fl_rgb_color(192, 255, 192);    case 3: return fl_rgb_color(255, 192, 255);    }    return FL_MAGENTA;}void    CWindowManager::x_InsertSplitter(IWMContainer* container, const IWMPosition& pos,                                          CSplitter::EMode mode){    CWMSplitter* splitter = new CWMSplitter();    splitter->SetManager(this);    splitter->color(GetRandomColor());    container->Insert(splitter, pos);        switch(mode)    {    case CSplitter::eHorizontal: splitter->Create(2, 1); break;    case CSplitter::eVertical:   splitter->Create(1, 2); break;    case CSplitter::eGrid:   splitter->Create(2, 2); break;    }}void    CWindowManager::x_UpdateObserver(IWMClient* client){    if(m_pObserver)        m_pObserver->OnClientChanged(client);}const CMenuItem*    CWindowManager::GetMenu() const{    return m_MenuRoot;}void   CWindowManager::SetFrameWindow(CFrameWindow* frame){    m_FrameWindow = frame;}bool   CWindowManager::x_ChildrenHandleCommand(const TCmdID cmd){    // update pointer to active client    Fl_Widget* focused = Fl::focus();    if(focused != m_PrevFocus)  {        m_PrevFocus = focused;        m_ActiveClient = NULL;        //check is focused widget is our client or a child of our client        for( Fl_Widget* wid = focused; wid != NULL; wid = wid->parent())  {            IWMClient* client = dynamic_cast<IWMClient*>(wid);            if(client  &&  x_GetClientRec(client))  { // this our client                m_ActiveClient = client;                break;            }        }    }    bool b_handled = false;    ///### overhead    CCommandTarget* target = dynamic_cast<CCommandTarget*>(m_ActiveClient);    if(target) {        b_handled = target->OnCommand(cmd);    }    if(! b_handled) {        NON_CONST_ITERATE(TChildTargets, it, m_ChildTargets)    {                        if(*it != target  && (*it)->OnCommand(cmd))                return true;        }    }    return b_handled;}bool   CWindowManager::x_ChildrenUpdateCommand(const TCmdID cmd, ICmdUI* pCmdUI){    // update pointer to active client    Fl_Widget* focused = Fl::focus();    if(focused != m_PrevFocus)  {        m_PrevFocus = focused;        m_ActiveClient = NULL;        //check is focused widget is our client or a child of our client        for( Fl_Widget* wid = focused; wid != NULL; wid = wid->parent())  {            IWMClient* client = dynamic_cast<IWMClient*>(wid);            if(client  &&  x_GetClientRec(client))  { // this our client                m_ActiveClient = client;                break;            }        }    }    bool b_handled = false;    ///### overhead    CCommandTarget* target = dynamic_cast<CCommandTarget*>(m_ActiveClient);    if(target) {        b_handled = target->OnUpdateCommand(cmd, pCmdUI);    }    if(! b_handled) {        NON_CONST_ITERATE(TChildTargets, it, m_ChildTargets)    {                        if(*it != target  && (*it)->OnUpdateCommand(cmd, pCmdUI))                return true;        }    }    return b_handled;}void    CWindowManager::OnInsertSplitter(TCmdID cmd){    CWMTabPos pos(m_pRootCont->GetTabsCount());    OnContainerCommand(m_pRootCont, pos, cmd);  }END_NCBI_SCOPE/* * =========================================================================== * $Log: window_manager.cpp,v $ * Revision 1000.1  2004/06/01 21:14:47  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3 * * Revision 1.3  2004/05/21 22:27:56  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.2  2004/05/07 14:26:58  yazhuk * Inherited CWindowManager from Fl_Group, CCommandTarget; implemented IFrameWindowClient * * Revision 1.1  2004/02/04 19:41:55  yazhuk * Initial revision * * =========================================================================== */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?