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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: workspace.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:14:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: workspace.cpp,v 1000.1 2004/06/01 21:14:56 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Andrey Yazhuk
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/widgets/workspace/workspace.hpp>
  41. #include <gui/widgets/workspace/test_client.hpp>
  42. #include <FL/Fl_Image.H>
  43. #include <FL/Fl_BMP_Image.H>
  44. BEGIN_NCBI_SCOPE
  45. CClientBrowser::CClientBrowser(int x, int y, int w, int h)
  46. :   CTreeBrowser(x, y, w, h)
  47. {
  48.     label("Clients");
  49.     show_root(true);
  50.     always_open(true);
  51. }
  52. void    CClientBrowser::AddClient(IWMClient* client)
  53. {
  54.     Node* p_node = AddLeaf(client->GetLabel());
  55.     p_node->user_data(client);
  56.     m_ClientToNode[client] = p_node;
  57. }
  58. void    CClientBrowser::Update(CWindowManager& manager)
  59. {
  60.     
  61.     NON_CONST_ITERATE(TClientToNodeMap, it,m_ClientToNode)   {
  62.         IWMClient* p_client = it->first;
  63.         
  64.         CWindowManager::EClientState state = manager.GetClientState(p_client);
  65.         string s = p_client->GetLabel();
  66.         s += " [";
  67.         switch(state)   {
  68.         case CWindowManager::eFloating: s += "Floating"; break;
  69.         case CWindowManager::eDocked: s += "Docked"; break;
  70.         case CWindowManager::eHidden: s += "Hiddden"; break;
  71.         };
  72.         s += "]";
  73.         
  74.         remove(it->second);
  75.         Node* p_node = it->second = AddLeaf(s);        
  76.         p_node->user_data(p_client);
  77.         
  78.         m_ClientToNode[p_client] = p_node;
  79.     } 
  80. }
  81. void    CClientBrowser::GetSelectedClients(vector<IWMClient*>& clients)
  82. {
  83.     clients.clear();
  84.     int n = num_selected();
  85.     for( int i = 0; i < n; i++ )    {
  86.         CTreeBrowser::Node* p_node = get_selected(i + 1);
  87.         
  88.         IWMClient* p_client = reinterpret_cast<IWMClient*>(p_node->user_data());
  89.         clients.push_back(p_client);
  90.     }
  91. }
  92. static
  93. DEFINE_MENU(Menu)
  94.     SUBMENU("Workspace")
  95.         MENU_ITEM(eCmdNewClient, "Create Client")
  96.         MENU_ITEM(eCmdNewClientInTab, "Create Client in Tab")
  97.     END_SUBMENU()
  98.     SUBMENU("Window Manager")
  99.         MENU_ITEM(eCmdActivateClient, "Activate Client")
  100.         MENU_ITEM(eCmdDockClient, "Dock Client")
  101.         MENU_ITEM(eCmdUndockClient, "Undock Client")
  102.         MENU_ITEM(eCmdHideClient, "Hide Client")
  103.         MENU_SEPARATOR()
  104.         MENU_ITEM(eCmdMaximizeClient, "Maximize Client")
  105.         MENU_ITEM(eCmdRestoreClient,  "Restore Client")
  106.         MENU_ITEM(eCmdMinimizeClient, "Minimize Client")
  107.     END_SUBMENU()
  108. END_MENU()
  109. CWorkspace::CWorkspace(int x, int y, int w, int h, const char* label)
  110. :   Fl_Group(x, y, w, h, label),
  111.     m_FrameWindow(NULL),
  112.     m_ClientsCount(0)
  113. {    
  114.     m_MenuRoot = CreateMenuItems(Menu);
  115.     // create root vertical splitter
  116.     m_pRootSplitter = new CSplitter(x, y, w, h);
  117.     resizable(m_pRootSplitter);
  118.     vector<int> widths;
  119.     widths.push_back(w / 4);
  120.     widths.push_back(w * 3 / 4);
  121.     m_pRootSplitter->Create(CSplitter::eVertical, widths);
  122.     
  123.     end(); // end of immediate children
  124.     m_WindowManager = new CWindowManager();
  125.     AddChildCmdTarget(m_WindowManager); 
  126.     m_pRootSplitter->InsertToCell(m_WindowManager, 1, 0); 
  127.     // create horizontal splitter
  128.     m_pLeftSplitter = new CSplitter(0, 0, 0, 0);
  129.     vector<int> heights;
  130.     heights.push_back(h / 2);
  131.     heights.push_back(h / 2);
  132.     m_pLeftSplitter->Create(CSplitter::eHorizontal, heights);
  133.     m_pRootSplitter->InsertToCell(m_pLeftSplitter, 0, 0); 
  134.     //create browser
  135.     m_pClientBrowser = new CClientBrowser(0, 0, 0, 0);
  136.     m_pLeftSplitter->InsertToCell(m_pClientBrowser, 0, 0);
  137.     m_WindowManager->SetObserver(this);
  138. }
  139. CWorkspace::~CWorkspace()
  140. {
  141.     delete m_MenuRoot;
  142.     //##delete m_WindowManager;
  143. }
  144. void    CWorkspace::SetFrameWindow(CFrameWindow* frame)
  145. {
  146.     m_FrameWindow = frame;
  147.     m_WindowManager->SetFrameWindow(frame);
  148. }
  149. const CMenuItem*    CWorkspace::GetMenu() const
  150. {
  151.     _ASSERT(m_WindowManager);
  152.     CMenuItem* root = m_MenuRoot;
  153.     const CMenuItem* wm_menu = m_WindowManager->GetMenu();
  154.     if(wm_menu) {
  155.         root = root->Clone();
  156.         root->Merge(*wm_menu);
  157.     }
  158.     return root; // memory leak
  159. }
  160. BEGIN_CMD_MAP(CWorkspace, CCommandTarget)
  161.     ON_COMMAND(eCmdNewClient, &CWorkspace::OnNewClient)
  162.     ON_COMMAND(eCmdNewClientInTab, &CWorkspace::OnNewClientInTab)
  163.     ON_COMMAND(eCmdActivateClient, &CWorkspace::OnActivateClient)
  164.     ON_COMMAND(eCmdDockClient, &CWorkspace::OnDockClient)
  165.     ON_COMMAND(eCmdUndockClient, &CWorkspace::OnUndockClient)
  166.     ON_COMMAND(eCmdHideClient, &CWorkspace::OnHideClient)
  167.     ON_COMMAND(eCmdMaximizeClient, &CWorkspace::OnMaximizeClient)
  168.     ON_COMMAND(eCmdMinimizeClient, &CWorkspace::OnMinimizeClient)
  169.     ON_COMMAND(eCmdRestoreClient, &CWorkspace::OnRestoreClient)
  170. END_CMD_MAP()
  171. void    CWorkspace::OnClientChanged(IWMClient* client)
  172. {
  173.     _ASSERT(m_pClientBrowser);
  174.     ///### stupid implementation for now
  175.     m_pClientBrowser->Update(*m_WindowManager);
  176. }
  177. static int m_ClientsCount = 0;
  178. void    CWorkspace::OnNewClient()
  179. {    
  180.     int type = m_ClientsCount % 3 + 1;
  181.     string label = "Client " + NStr::IntToString(m_ClientsCount + 1);
  182.     CFLTestClient* client = new CFLTestClient(type, label.c_str());    
  183.     m_ClientsCount++;
  184.     
  185.     m_WindowManager->AddClientInFrame(client);
  186.     
  187.     m_pClientBrowser->AddClient(client);
  188.     m_pClientBrowser->Update(*m_WindowManager);
  189. }
  190. void    CWorkspace::OnNewClientInTab()
  191. {
  192.     int type = m_ClientsCount % 3 + 1;
  193.     string label = "Client " + NStr::IntToString(m_ClientsCount + 1);
  194.     CFLTestClient* client = new CFLTestClient(type, label.c_str());    
  195.     m_ClientsCount++;
  196.     
  197.     m_WindowManager->AddClientInTab(client);
  198.     
  199.     m_pClientBrowser->AddClient(client);
  200.     m_pClientBrowser->Update(*m_WindowManager);
  201. }
  202. void    CWorkspace::OnActivateClient()
  203. {
  204.     x_DoFrameClientCmd(CWindowManager::eActivate);
  205. }
  206. void    CWorkspace::OnDockClient()
  207. {
  208.     TClients clients;
  209.     m_pClientBrowser->GetSelectedClients(clients);
  210.     ITERATE(TClients, it, clients)  {
  211.         m_WindowManager->MoveClientToTab(*it);
  212.     }   
  213. }
  214. void    CWorkspace::OnUndockClient()
  215. {
  216.     TClients clients;
  217.     m_pClientBrowser->GetSelectedClients(clients);
  218.     ITERATE(TClients, it, clients)  {
  219.         m_WindowManager->MoveClientToFrame(*it);
  220.     }
  221. }
  222. void    CWorkspace::OnHideClient()
  223. {
  224.     TClients clients;
  225.     m_pClientBrowser->GetSelectedClients(clients);
  226.     ITERATE(TClients, it, clients)  {
  227.         m_WindowManager->RemoveClient(*it);
  228.     }
  229. }
  230. void    CWorkspace::OnMaximizeClient()
  231. {
  232.     x_DoFrameClientCmd(CWindowManager::eMaximize);
  233. }
  234. void    CWorkspace::OnMinimizeClient()
  235. {
  236.     x_DoFrameClientCmd(CWindowManager::eMinimize);
  237. }
  238. void    CWorkspace::OnRestoreClient()
  239. {
  240.     x_DoFrameClientCmd(CWindowManager::eRestore);
  241. }
  242. void    CWorkspace::x_DoFrameClientCmd(CWindowManager::EFrameCmd cmd)
  243. {
  244.     TClients clients;
  245.     m_pClientBrowser->GetSelectedClients(clients);
  246.     ITERATE(TClients, it, clients)  {
  247.         m_WindowManager->FrameCommand(*it, cmd);
  248.     }
  249. }
  250. END_NCBI_SCOPE
  251. /*
  252.  * ===========================================================================
  253.  * $Log: workspace.cpp,v $
  254.  * Revision 1000.1  2004/06/01 21:14:56  gouriano
  255.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  256.  *
  257.  * Revision 1.4  2004/05/21 22:27:56  gorelenk
  258.  * Added PCH ncbi_pch.hpp
  259.  *
  260.  * Revision 1.3  2004/05/07 14:24:53  yazhuk
  261.  * Implemented IFrameWindowClient interface; refactoring
  262.  *
  263.  * Revision 1.2  2004/02/05 16:17:20  ucko
  264.  * Remove redundant const from menu definition.
  265.  *
  266.  * Revision 1.1  2004/02/04 19:41:28  yazhuk
  267.  * Initial revision
  268.  *
  269.  * ===========================================================================
  270.  */