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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: splitter.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:52:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_FL___SPLITTER__HPP
  10. #define GUI_WIDGETS_FL___SPLITTER__HPP
  11. /*  $Id: splitter.hpp,v 1000.1 2004/06/01 19:52:22 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistd.hpp>
  42. #include <gui/utils/fltk_utils.hpp>
  43. #include <FL/Fl_Group.H>
  44. /** @addtogroup GUI_FltkWidgets
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. // by default it has a single cell
  50. ///////////////////////////////////////////////////////////////////////////////
  51. /// CSplitter - container with resizable separators.
  52. ///
  53. /// CSplitter is divided into a number of Cells, each cell can contain one child
  54. /// widget. Any child widget can belong to a single cell.
  55. class NCBI_GUIWIDGETS_FL_EXPORT CSplitter : public Fl_Group
  56. {
  57. public:
  58.     typedef vector<int> TPosVector;
  59.     typedef vector<int> TSizeVector;
  60.     /// EMode - splitter orientation
  61.     enum EMode  {
  62.         eHorizontal, /// cells are separated with horizontal split lines
  63.         eVertical,   /// cells are separated with vertical split lines
  64.         eGrid        /// cells are separated with in both directions
  65.     };
  66.     CSplitter(int x, int y, int w, int h, const char* label = 0);
  67.     virtual ~CSplitter();
  68.     
  69.     EMode   GetMode() const;
  70.     /// Creates a splitter with a single cell
  71.     virtual void    Create(EMode mode);
  72.     
  73.     /// Creates a splitter with cells defined by "sizes". If mode == eGrid then
  74.     /// size will be used as both width and heights
  75.     virtual void    Create(EMode mode, const TPosVector& sizes);
  76.     /// Creates a splitter with cells defined by "sizes". If mode == eGrid then
  77.     /// ar_sizes will be used as both width and heights. "ar_sizes" is -1 terminated
  78.     /// array.
  79.     virtual void    Create(EMode mode, const int ar_size[]);
  80.     
  81.     /// Creates splitter, "widths" and "height" define number and sizes of cells.
  82.     virtual void    Create(EMode mode, const TPosVector& widths, const TPosVector& heights);
  83.     /// Creates splitter, "ar_w" and "ar_h" are arrays terminated by -1.
  84.     virtual void    Create(EMode mode, const int ar_w[], const int ar_h[]);
  85.     
  86.     virtual void    Create(int n_horz_panes, int n_vert_panes);
  87.     int     GetColumnsCount() const;
  88.     int     GetRowsCount() const;
  89.     /// returns "true" if cell specified by (i_x, i_y) exists in splitter
  90.     bool    IsValidCell(int i_x, int i_y) const;
  91.     
  92.     int GetColumnWidth(int i_x) const   {   return x_GetWidth(i_x);     }
  93.     int GetRowHeight(int i_y) const     {   return x_GetHeight(i_y);    }
  94.     
  95.     /// If cell [ix, i_y] exists and vacant - adds widget to the container. 
  96.     /// Returns "true" if widget has been added.
  97.     bool    InsertToCell(Fl_Widget* w, int i_x, int i_y);
  98.     /// Removes a widget from the cell specified by [i_x, i_y]. Returns pointer     
  99.     /// to removed widget.
  100.     Fl_Widget*    RemoveFromCell(int i_x, int i_y);
  101.     bool    Remove(Fl_Widget* w);
  102.     void    RemoveAll();
  103.     bool    Find(Fl_Widget* w, int& i_x, int& i_y)  const;
  104. public:
  105.     /// @name Fl_Group functions
  106.     /// @{
  107.     /// Adds widgets to the next available cell
  108.     void add(Fl_Widget *w);    
  109.     void add(Fl_Widget&  w);    
  110.     void remove(Fl_Widget &w);
  111.     //virtual void clear();
  112.     virtual void    draw();
  113.     virtual void    resize(int new_x, int new_y, int new_w, int new_h);
  114.     virtual int     handle(int);
  115.     /// @}
  116. protected:
  117.     /// @name deprecated Fl_Group overridable
  118.     /// @{
  119.      void    init_sizes();
  120.      void    insert(Fl_Widget &w, int n);
  121.      void    begin();
  122.      void    end();
  123.      const Fl_Widget** array() const;
  124.      Fl_Widget*        child(int n) const;
  125.      int children() const;
  126.      int     find(const Fl_Widget *w) const;
  127.      int     find(const Fl_Widget &w) const;
  128.      void    resizable(Fl_Widget *box); 
  129.      void    resizable(Fl_Widget &box); 
  130.      Fl_Widget*  resizable() const;
  131.      Fl_Group&   add_resizable(Fl_Widget &box);
  132.     /// @}
  133. protected:    
  134.     void    x_Create(EMode mode, const TPosVector& widths, const TPosVector& heights);
  135.     Fl_Widget*   x_GetCell(int i_x, int i_y);
  136.     int     x_GetCellIndex(int i_x, int i_y);
  137.     int     x_GetColumn(int i_cell) const;
  138.     int     x_GetRow(int i_cell) const;
  139.     int     x_GetLeft(int i_x)  const;
  140.     int     x_GetRight(int i_x)  const;
  141.     int     x_GetWidth(int i_x)  const;
  142.     
  143.     int     x_GetTop(int i_y)     const;
  144.     int     x_GetBottom(int i_y)  const;    
  145.     int     x_GetHeight(int i_y)  const;    
  146.     
  147.     void    x_Clear();
  148.     void    x_ResizeToCell(int i_cell);
  149.     void    x_ResizeToCell(int i_x, int i_y);
  150.     int     x_HandleKeyEvent();
  151.     int     x_HandleMouseMove();
  152.     int     x_HandleMousePush();
  153.     int     x_HandleMouseDrag();
  154.     int     x_HandleMouseRelease();
  155.     virtual void    x_OnShowPopupMenu();    
  156.     void    x_DoDragSeparator(bool b_final);
  157.     
  158.     /// returns Separator index if hit or -1
  159.     int     x_HitTestSeparator(int z, TPosVector& vpos);
  160.     void    x_HitTest(int z, TPosVector& vpos, int& i_cell, int& i_sep);
  161.     bool    x_IsDragging()  
  162.     {   
  163.         return m_iDragSepX != -1    ||  m_iDragSepY != -1;    
  164.     }
  165.     void    x_DistributeEvenly(bool b_x, bool b_y);
  166.     void    x_DoDistributeEvenly(TPosVector& vSplitPos, int size);
  167.     void    x_DoResize(TPosVector& v_split_pos, TSizeVector& v_norm_sizes, 
  168.                        int size, int new_size);
  169.     void    x_MoveSeparator(int i_sep, int new_pos, 
  170.                             TPosVector& vSplitPos, int size, 
  171.                             int& start, int& stop);
  172.     
  173.     // updates cells belonging to [start_x, stop_x] or to [start_y, stop_y]
  174.     void    x_UpdateRegion(int start_x, int stop_x, int start_y, int stop_y);
  175.     
  176.     void    x_NewSplit(TPosVector& v_split_pos, TSizeVector& v_norm_size, int size);
  177.     void    x_Deprecated()  const   {   _ASSERT(false); }
  178. protected:
  179.     typedef vector<Fl_Widget*>  TCells;
  180.     
  181.     EMode m_Mode;
  182.     TPosVector  m_vSplitPosX; // first pixels of separator
  183.     TPosVector  m_vSplitPosY; // first pixels of separator
  184.     int m_SepSize;
  185.     TSizeVector m_vNormSizeX; // normal (not "shrinked") sizes of cells
  186.     TSizeVector m_vNormSizeY; // normal (not "shrinked") sizes of cells  
  187.     TCells  m_vCells;
  188.     int m_MouseDownX, m_MouseDownY; // window coordinate of last Mouse-Down 
  189.     int m_StartPosX, m_StartPosY; // start position of separators being dragged (local)
  190.     int m_iDragSepX, m_iDragSepY; // index of separtor being dragged or -1
  191.     
  192.     CGUIEvent   m_Event;
  193. };
  194. END_NCBI_SCOPE
  195. /* @} */
  196. /*
  197.  * ===========================================================================
  198.  * $Log: splitter.hpp,v $
  199.  * Revision 1000.1  2004/06/01 19:52:22  gouriano
  200.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  201.  *
  202.  * Revision 1.6  2004/05/11 18:55:14  dicuccio
  203.  * Added doxygen modules info
  204.  *
  205.  * Revision 1.5  2004/02/04 20:02:32  yazhuk
  206.  * Added Remove(), RemoveAll(), Find() and new overload for Create()
  207.  *
  208.  * Revision 1.4  2004/01/28 16:45:26  tereshko
  209.  * Added NCBI_GUIWIDGETS_FL_EXPORT
  210.  *
  211.  * Revision 1.3  2004/01/28 16:38:55  yazhuk
  212.  * Refactored and extended API, added Fl_Group functions
  213.  *
  214.  * Revision 1.2  2004/01/23 03:14:45  ucko
  215.  * Properly capitalize FL directory for headers, and fix another typo nearby.
  216.  *
  217.  * Revision 1.1  2004/01/22 16:27:19  yazhuk
  218.  * Initial revision
  219.  *
  220.  * ===========================================================================
  221.  */
  222. #endif  // GUI_WIDGETS_FL___SPLITTER__HPP