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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: wm_splitter.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:14:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: wm_splitter.cpp,v 1000.1 2004/06/01 21:14:51 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/wm_splitter.hpp>
  41. #include <gui/widgets/fl/menu_window.hpp>
  42. BEGIN_NCBI_SCOPE
  43. ///////////////////////////////////////////////////////////////////////////////
  44. /// IWMPosition
  45. CWMSplitterPos::CWMSplitterPos()
  46. :   m_Row(-1),
  47.     m_Column(-1) // invaid position
  48. {
  49. }
  50. CWMSplitterPos::CWMSplitterPos(int row, int col)
  51. :   m_Row(row), m_Column(col)
  52. {
  53. }
  54. CWMSplitterPos::~CWMSplitterPos()
  55. {
  56. }
  57. bool    CWMSplitterPos::IsValid()   const
  58. {
  59.     return m_Row >=0  && m_Column >= 0;
  60. }
  61. IWMPosition*    CWMSplitterPos::Clone() const
  62. {
  63.     return new CWMSplitterPos(m_Row, m_Column);
  64. }
  65. int     CWMSplitterPos::GetRow()    const
  66. {
  67.     return m_Row;
  68. }
  69. int     CWMSplitterPos::GetColumn() const
  70. {
  71.     return m_Column;
  72. }
  73. void    CWMSplitterPos::Set(int column, int row)
  74. {
  75.     m_Column = column;
  76.     m_Row = row;     
  77. }
  78. ///////////////////////////////////////////////////////////////////////////////
  79. /// CWMSplitter
  80. CWMSplitter::CWMSplitter()
  81. :   CSplitter(0, 0, 0, 0),
  82.     m_pManager(NULL)
  83. {
  84. }
  85. CWMSplitter::CWMSplitter(int x, int y, int w, int h, const char* label)
  86. :   CSplitter(x, y, w, h, label),
  87.     m_pManager(NULL)
  88. {
  89. }
  90. CWMSplitter::~CWMSplitter()
  91. {
  92. }
  93. BEGIN_CMD_MAP(CWMSplitter, CCommandTarget)
  94.     ON_COMMAND(eCmdDistributeEvenly, &CWMSplitter::OnDistributeEvenly)
  95. END_CMD_MAP()
  96. void    CWMSplitter::SetManager(IWindowManager* manager)
  97. {
  98.     m_pManager = manager;
  99. }
  100. bool    CWMSplitter::IsVacant(const IWMPosition& pos)
  101. {
  102.     const CWMSplitterPos* p_pos = dynamic_cast<const CWMSplitterPos*>(&pos);
  103.     if(p_pos)   {
  104.         int i_x = p_pos->GetColumn();
  105.         int i_y = p_pos->GetRow();
  106.         if(IsValidCell(i_x, i_y))  {
  107.             Fl_Widget*  w = x_GetCell(i_x, i_y);
  108.             return x_GetCell(i_x, i_y) == NULL;
  109.         }
  110.     }
  111.     return false;
  112. }
  113. Fl_Widget*  CWMSplitter::GetChild(const IWMPosition& pos)
  114. {
  115.     const CWMSplitterPos* p_pos = dynamic_cast<const CWMSplitterPos*>(&pos);    
  116.     if(p_pos)   {
  117.         if(p_pos->IsValid())   {
  118.             return x_GetCell(p_pos->GetColumn(), p_pos->GetRow());
  119.         }
  120.     }
  121.     return NULL;
  122. }
  123. void    CWMSplitter::GetChildren(vector<TChild*>& children)
  124. {
  125.     children.clear();
  126.     for( int i = 0; i < (int) m_vCells.size(); i++ )    {
  127.         Fl_Widget* child = m_vCells[i];
  128.         if(child)   {
  129.             children.push_back(child);
  130.         }
  131.     }
  132. }
  133. bool    CWMSplitter::Insert(Fl_Widget* widget, const IWMPosition& pos)
  134. {
  135.     const CWMSplitterPos* p_pos = dynamic_cast<const CWMSplitterPos*>(&pos);    
  136.     if(widget  &&  p_pos)   {
  137.         if(p_pos->IsValid()  &&  IsVacant(pos))   {
  138.             return InsertToCell(widget, p_pos->GetColumn(), p_pos->GetRow());
  139.         }
  140.     }
  141.     return false;
  142. }
  143. bool  CWMSplitter::Remove(const IWMPosition& pos)
  144. {
  145.     const CWMSplitterPos* p_pos = dynamic_cast<const CWMSplitterPos*>(&pos);    
  146.     if(p_pos  &&  p_pos->IsValid())   {
  147.         Fl_Widget* w = RemoveFromCell(p_pos->GetColumn(), p_pos->GetRow());
  148.         return w != NULL;
  149.     }
  150.     return false;
  151. }
  152. bool  CWMSplitter::Remove(TChild* child)
  153. {
  154.     return CSplitter::Remove(child);
  155. }
  156. void    CWMSplitter::RemoveAll()
  157. {
  158.     CSplitter::RemoveAll();    
  159. }
  160. void    CWMSplitter::x_OnShowPopupMenu()
  161. {
  162.     int i_cell_x, i_cell_y, i_sep_x, i_sep_y;
  163.     x_HitTest(Fl::event_x() - x(), m_vSplitPosX, i_cell_x, i_sep_x);
  164.     x_HitTest(Fl::event_y() - y(), m_vSplitPosY, i_cell_y, i_sep_y);
  165.     CMenuItem* root = new CMenuItem("Root");
  166.     
  167.     m_PopupPos.Set(i_cell_x, i_cell_y);
  168.     if(i_cell_x != -1  && i_cell_y != -1) { // hit the cell
  169.         if(m_pManager)  {
  170.             vector<CMenuItem*>  items;            
  171.             m_pManager->GetPopupItems(this, m_PopupPos, items); 
  172.             ITERATE(vector<CMenuItem*>, it, items)  {
  173.                 root->AddSubItem(*it);
  174.             }
  175.         }
  176.     } else {
  177.         root->AddSubItem("Distribute Evenly (Dbl Click)", eCmdDistributeEvenly);
  178.     }
  179.     CPopupMenu1  menu(Fl::event_x_root(), Fl::event_y_root(), root, this);
  180.     menu.Popup();
  181. }
  182. void    CWMSplitter::OnDistributeEvenly()
  183. {
  184.     x_DistributeEvenly(true, true);
  185. }
  186. bool    CWMSplitter::OnCommand(const TCmdID cmd)
  187. {
  188.     bool b_handled = CCommandTarget::OnCommand(cmd);
  189.     if(! b_handled  && m_pManager) {
  190.         b_handled = m_pManager->OnContainerCommand(this, m_PopupPos, cmd);        
  191.     }
  192.     return b_handled;
  193. }
  194. END_NCBI_SCOPE
  195. /*
  196.  * ===========================================================================
  197.  * $Log: wm_splitter.cpp,v $
  198.  * Revision 1000.1  2004/06/01 21:14:51  gouriano
  199.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  200.  *
  201.  * Revision 1.3  2004/05/21 22:27:56  gorelenk
  202.  * Added PCH ncbi_pch.hpp
  203.  *
  204.  * Revision 1.2  2004/05/07 14:27:25  yazhuk
  205.  * Replaced CPopupMenu  with CPopupMenu1
  206.  *
  207.  * Revision 1.1  2004/02/04 19:41:42  yazhuk
  208.  * Initial revision
  209.  *
  210.  * ===========================================================================
  211.  */