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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ruler.hpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/04/12 18:16:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_GL___RULER__HPP
  10. #define GUI_WIDGETS_GL___RULER__HPP
  11. /*  $Id: ruler.hpp,v 1000.4 2004/04/12 18:16:37 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 <gui/opengl/glbitmapfont.hpp>
  42. #include <gui/opengl/glpane.hpp>
  43. #include <gui/widgets/gl/irenderable.hpp>
  44. BEGIN_NCBI_SCOPE
  45. ////////////////////////////////////////////////////////////////////////////////
  46. /// CRuler is a renderable object drawing a scale with position labels.
  47. class NCBI_GUIWIDGETS_GL_EXPORT CRuler : public IRenderable
  48. {
  49. public:
  50.     enum EColorType {
  51.         eRuller,
  52.         eText,
  53.         eBackground
  54.     };
  55.     enum EGeometryParam {
  56.         eRegularTickHeight,
  57.         eMajorTickHeight
  58.     };
  59.     enum ELabelPlacement    {
  60.         eBottom,
  61.         eTop,
  62.         eLeft,
  63.         eRight,   
  64.         eDefault     
  65.     };
  66.     enum EDisplayOptions    {
  67.         fHideLabels = 0x1, // do not render labels along the scale
  68.         fShowOrigin = 0x2, // draw "Origin" label
  69.         fShowMetric = 0x4  // draw "Metric"
  70.     };
  71.     
  72.     /// Origin specifies position in the model space that is represented as "1"
  73.     /// by the Ruler. It can be thought of as offset of the local coordinate 
  74.     /// system associated with Ruler relative to the global coordinate system.
  75.     
  76.     CRuler(bool b_horz = true);
  77.     virtual ~CRuler();
  78.     void    SetHorizontal(bool b_horz, ELabelPlacement place = eDefault);
  79.     void    SetColor(EColorType type, const CGlColor& color);
  80.     void    SetFont(CGlBitmapFont::EFont font_type);
  81.     void    SetGeometryParam(EGeometryParam geom, int value);   
  82.     
  83.     // takes a combination of EDisplayOptions flags 
  84.     void    SetDisplayOptions(int options);
  85.     
  86.     /// SetAutoRange() activates automatic mode in which ruler's range is equal to
  87.     /// the provided model limits range (obtained by CGlPane::GetModelLimitsRect()).
  88.     void    SetAutoRange();
  89.     
  90.     /// SetRange() activates "custom" or "manual" mode in which rulers's range in
  91.     /// model space is explicitly limited to [Start, End], SeqStart specifies number
  92.     /// corresponding to the first position in the range; if b_reverse == "true"
  93.     /// then labels SeqStart will correspond to End and displayed numbers will 
  94.     /// increase from right to the left.
  95.     void    SetRange(int Start, int End, int SeqStart, bool b_reverse);
  96.     
  97.     TVPPoint    GetPreferredSize() const;
  98.     virtual void Render(CGlPane& pane);
  99.     virtual TVPRect    GetVPRect();
  100.     virtual TModelRect GetModelRect();
  101. protected:    
  102.     int     x_ToDisplay(int model) const;
  103.     int     x_ToModel(int display) const;
  104.     void    x_CalculatePosLabelsStep(CGlPane& Pane);
  105.     void    x_RenderScale(CGlPane& pane, int first_elem, int last_elem);
  106.     void    x_RenderAllPosLabels(CGlPane& pane, int first_elem, int last_elem);    
  107.     void    x_RenderOriginAndMetric(CGlPane& pane);
  108.     
  109.     string  x_GetPositionLabel(int iElem);
  110.     void    x_GenerateLabelPositions(int first_elem, int last_elem, 
  111.                                      vector<int>& vElemPos);
  112.     void    x_RenderPosLabel(CGlPane& pane, double pos_u, 
  113.                              double label_offset_u, const string& Text);
  114.     
  115.     int     x_GetBaseHeight() const;
  116. protected:
  117.     bool    m_bHorz;
  118.     //bool    m_bReverse;
  119.     ELabelPlacement m_LabelPlace;
  120.     TVPRect m_rcBounds;    
  121.     bool m_bAutoRange;
  122.     int  m_Start, m_End; /// range in model space represented by ruller
  123.     int  m_Offset; /// added to m_Start to produce displayed numbers, so that
  124.     /// range displayed is [m_Start + m_Offset, m_End + m_Offset]
  125.     
  126.     bool    m_bReverseDisplay;
  127.     
  128.     int     m_DisplayOptions;
  129.     CGlBitmapFont   m_Font;
  130.     CGlColor    m_TextColor;
  131.     CGlColor    m_RullerColor;
  132.     CGlColor    m_BackColor;   
  133.     
  134.     // Layout params
  135.     int     m_MajorTickSize;
  136.     int     m_RegTickSize;
  137.     bool    m_bDirty; /// "true" if parameters affecting layout have been changed
  138.     TModelRect  m_rcLimits;
  139.     double m_ScaleX, m_ScaleY;
  140.     double m_MaxLabelW;
  141.     double m_MaxLabelH;
  142.     
  143.     int m_BaseStep; // has form 10^X,  m_PosLabelsStep = K * m_BaseStep;
  144.     int m_PosLabelsStep; // distance between two labels (in model coords)
  145.     int m_TickSpace;     // distance beween two regular ticks (in model coords)    
  146. };
  147. END_NCBI_SCOPE
  148. /*
  149.  * ===========================================================================
  150.  * $Log: ruler.hpp,v $
  151.  * Revision 1000.4  2004/04/12 18:16:37  gouriano
  152.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.7
  153.  *
  154.  * Revision 1.7  2004/03/04 19:32:44  yazhuk
  155.  * Added comments
  156.  *
  157.  * Revision 1.6  2004/03/02 21:53:38  yazhuk
  158.  * Added rendering of origin and metric
  159.  *
  160.  * Revision 1.5  2003/12/10 16:55:25  yazhuk
  161.  * Implemented control over displayed range, offset and direction.
  162.  *
  163.  * Revision 1.4  2003/12/01 16:34:08  yazhuk
  164.  * Added m_BaseStep data member
  165.  *
  166.  * Revision 1.3  2003/11/18 17:55:31  yazhuk
  167.  * Fixed GCC warnings
  168.  *
  169.  * Revision 1.2  2003/11/18 00:52:18  yazhuk
  170.  * Restored IRenderable implementation
  171.  *
  172.  * Revision 1.1  2003/11/17 20:22:53  yazhuk
  173.  * Renamed from ruller.hpp
  174.  *
  175.  * Revision 1.2  2003/10/31 14:05:53  dicuccio
  176.  * Fixed spelling error: CRuller -> CRuler
  177.  *
  178.  * Revision 1.1  2003/10/29 23:18:45  yazhuk
  179.  * Initial revision
  180.  *
  181.  * ===========================================================================
  182.  */
  183. #endif  // GUI_WIDGETS_GL___RULER__HPP