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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: frame_window.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:32:04  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: frame_window.cpp,v 1000.0 2004/06/01 21:32:04 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/frame_window.hpp>
  41. #include <gui/utils/accel_table.hpp>
  42. BEGIN_NCBI_SCOPE
  43. const static double kUpdateUIPeriod = 0.5;
  44. const static int    kUpdateTimerID = 1;
  45. CFrameWindow::CFrameWindow(int w, int h, const char* title)
  46. :   TParent(w, h, title),    
  47.     m_BaseMenu(NULL),
  48.     m_MenuBar(NULL), 
  49.     m_MenuBarH(0),
  50.     m_CmdHintSlot(-1),
  51.     m_StatusBarH(24),
  52.     m_ClientGroup(NULL),
  53.     m_Client(NULL),
  54.     m_CmdTarget(NULL)
  55. {   
  56.     m_BaseMenu = new CMenuItem("Root");
  57.     m_MenuBar = new CMenuBar1(0 , 0, w, 0);
  58.     m_MenuBar->SetItems(m_BaseMenu);
  59.     m_MenuBarH = m_MenuBar->GetPreferredSize().Y();
  60.     m_MenuBar->size(w, m_MenuBarH);
  61.     m_MenuBar->SetCmdTarget(this);
  62.     m_MenuBar->SetHintListener(this);
  63.     
  64.     m_ClientGroup = new Fl_Group(0, m_MenuBarH, w, h - m_MenuBarH - m_StatusBarH);
  65.     m_ClientGroup->box(FL_DOWN_BOX);
  66.     m_ClientGroup->color(FL_WHITE);
  67.     x_SetupStatusBar();
  68.     
  69.     resizable(m_ClientGroup);
  70.     end();
  71.     
  72.     m_UpdateUITimer.Init(kUpdateTimerID, kUpdateUIPeriod, true, this);
  73.     m_Event.StandardConfig();
  74. }
  75. CFrameWindow::~CFrameWindow()
  76. {
  77.     hide();
  78.     delete m_MenuBar;
  79. }
  80. /// override this function in derived class to create application-specific status bar
  81. void    CFrameWindow::x_SetupStatusBar()
  82. {
  83.     m_StatusBar = new CStatusBar1(0, h() - m_StatusBarH, w(), m_StatusBarH);
  84.     m_CmdHintSlot = m_StatusBar->CreateSlot(200);
  85.     m_StatusBar->SetSlotStyles(m_CmdHintSlot, ISBSlot::fResizable);
  86.     
  87.     /*CStatusBar1::TSlotHandle h_slot2 = m_StatusBar->CreateSlot(150);
  88.     m_StatusBar->SetSlotStyles(h_slot2, ISBSlot::fDownBox | ISBSlot::fCenterText);
  89.     m_StatusBar->SetSlotText(h_slot2, "The second one");
  90.     CStatusBar1::TSlotHandle h_slot3 = m_StatusBar->CreateSlot(40);
  91.     m_StatusBar->SetSlotStyles(h_slot3, ISBSlot::fUpBox | ISBSlot::fCenterText);
  92.     m_StatusBar->SetSlotText(h_slot3, "Ins");*/
  93. }
  94. void    CFrameWindow::ResetMenu(const CMenuItem& item)
  95. {
  96.     m_MenuBar->SetItems((CMenuItem*) NULL); //reset
  97.     
  98.     m_BaseMenu = new CMenuItem("Root");
  99.     m_BaseMenu->Merge(item);
  100.     m_MenuBar->SetItems(m_BaseMenu->Clone());
  101.     x_AddClientMenu();
  102.     m_MenuBarH = m_MenuBar->GetPreferredSize().Y();
  103.     x_Layout();
  104.     redraw();
  105. }
  106. void    CFrameWindow::ResetMenu()
  107. {
  108.     m_MenuBar->SetItems(m_BaseMenu->Clone());
  109.     m_MenuBarH = m_MenuBar->GetPreferredSize().Y();
  110.     x_AddClientMenu();
  111.     x_Layout();
  112.     redraw();
  113. }
  114. void    CFrameWindow::MergeMenu(const CMenuItem& item)
  115. {
  116.     CMenuItem* root = m_MenuBar->GetRootItem();
  117.     root = root->Clone();
  118.     root->Merge(item);
  119.     m_MenuBar->SetItems(root);
  120.     m_MenuBarH = m_MenuBar->GetPreferredSize().Y();
  121.     x_Layout();
  122.     redraw();
  123. }
  124. void    CFrameWindow::x_AddClientMenu()
  125. {
  126.     const CMenuItem* item = m_Client ? m_Client->GetMenu() : NULL;
  127.     if(item)    {
  128.         MergeMenu(*item);
  129.     }
  130. }
  131. void    CFrameWindow::RemoveClient()
  132. {
  133.     if(m_Client)    {
  134.         if(m_CmdTarget)    {
  135.             RemoveChildCmdTarget(m_CmdTarget);
  136.         }
  137.         
  138.         m_MenuBar->SetItems((CMenuItem*) NULL);
  139.         m_MenuBarH = m_MenuBar->GetPreferredSize().Y();
  140.         Fl_Widget* widget = dynamic_cast<Fl_Widget*>(m_Client);
  141.         m_ClientGroup->remove(widget);
  142.         m_ClientGroup->resizable(NULL);
  143.         
  144.         m_Client->SetFrameWindow(NULL);
  145.         m_Client = NULL;
  146.     }
  147.     x_Layout();
  148. }
  149.     
  150. void    CFrameWindow::SetClient(IFrameWindowClient* client)
  151. {
  152.     RemoveClient();
  153.     Fl_Widget* widget = dynamic_cast<Fl_Widget*>(client);
  154.     if(widget)  {
  155.         m_Client = client;
  156.         m_Client->SetFrameWindow(this);
  157.         
  158.         m_ClientGroup->add(widget);
  159.         widget->resize(m_ClientGroup->x(), m_ClientGroup->y(), m_ClientGroup->w(),  m_ClientGroup->h());
  160.         m_ClientGroup->resizable(widget);
  161.         // update Menu Bar
  162.         x_AddClientMenu();
  163.         m_MenuBarH = m_MenuBar->GetPreferredSize().Y();
  164.     
  165.         m_CmdTarget = dynamic_cast<CCommandTarget*>(client);
  166.         if(m_CmdTarget)    {
  167.             AddChildCmdTarget(m_CmdTarget);
  168.         }
  169.     }
  170.     x_Layout();
  171. }
  172. void    CFrameWindow::show()
  173. {
  174.     if(! m_UpdateUITimer.IsRunning()) {
  175.         m_UpdateUITimer.Start();
  176.     }
  177.     TParent::show();
  178. }
  179. void    CFrameWindow::hide()
  180. {
  181.     m_UpdateUITimer.Stop();
  182.     
  183.     TParent::hide();
  184. }
  185. void    CFrameWindow::resize(int x, int y, int w, int h)
  186. {
  187.     TParent::resize(x, y, w, h);
  188.     
  189.     x_Layout();    
  190. }
  191. int     CFrameWindow::handle(int event)
  192. {
  193.     m_Event.OnFLTKEvent(event);
  194.     bool handled = false;
  195.     if(event == FL_KEYDOWN) {
  196.         handled = x_HandleAccelerator();
  197.     }
  198.     if(! handled)   {
  199.         handled = (TParent::handle(event) != 0);
  200.         if(! handled  &&  event == FL_KEYDOWN)   {
  201.             handled = x_HandleMenuActivate();
  202.         }
  203.     }
  204.     return handled;
  205. }
  206. bool CFrameWindow::x_HandleAccelerator()
  207. {
  208.     int accel = m_Event.GetAccelByEvent();
  209.     TCmdID cmd = eCmdInvalid;
  210.     if(CAccelTable::GetCommandByAccel(accel, cmd))    {
  211.         OnCommand(cmd);
  212.         return true;
  213.     }    
  214.     return false;
  215. }
  216. bool CFrameWindow::x_HandleMenuActivate()
  217. {
  218.     if(m_Event.GetGUISignal() == CGUIEvent::eMenuActivateSignal) {
  219.         if(m_MenuBar)   {
  220.             m_MenuBar->Activate();
  221.         }
  222.     }
  223.     return false;
  224. }
  225. Fl_Widget*      CFrameWindow::x_ClientWidget()
  226. {
  227.     return  dynamic_cast<Fl_Widget*>(m_Client);
  228. }
  229. // layouts child widgets
  230. void    CFrameWindow::x_Layout()
  231. {
  232.     m_MenuBar->size(w(), m_MenuBarH);
  233.     if(m_Client)    {
  234.         m_ClientGroup->resize(0, m_MenuBarH, w(), h() - m_MenuBarH - m_StatusBarH);
  235.     }
  236.     m_StatusBar->resize(0, h() - m_StatusBarH, w(), m_StatusBarH);
  237. }
  238. void    CFrameWindow::OnTimeout(int timer_id)
  239. {
  240.     if(timer_id == kUpdateTimerID)   {
  241.         x_OnUpdateUI();
  242.     }
  243. }
  244. void     CFrameWindow::x_OnUpdateUI()
  245. {
  246.     if(Fl::grab() == NULL  &&  m_MenuBar)   {
  247.         m_MenuBar->UpdateItems();
  248.     }
  249. }
  250. void    CFrameWindow::OnHint(const string& hint)
  251. {
  252.     m_StatusBar->SetSlotText(m_CmdHintSlot, hint);
  253.     
  254.     if(Fl::grab())  {
  255.         flush();  // force repainting
  256.     }
  257. }
  258. END_NCBI_SCOPE
  259. /*
  260.  * ===========================================================================
  261.  * $Log: frame_window.cpp,v $
  262.  * Revision 1000.0  2004/06/01 21:32:04  gouriano
  263.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  264.  *
  265.  * Revision 1.4  2004/05/21 22:27:56  gorelenk
  266.  * Added PCH ncbi_pch.hpp
  267.  *
  268.  * Revision 1.3  2004/05/20 12:42:56  dicuccio
  269.  * Fix compiler warning about int -> bool conversion
  270.  *
  271.  * Revision 1.2  2004/05/13 17:33:12  yazhuk
  272.  * Added support for status bar, accelerators, keyboard activated menu bar
  273.  *
  274.  * Revision 1.1  2004/05/07 14:23:15  yazhuk
  275.  * Initial revision
  276.  *
  277.  * ===========================================================================
  278.  */