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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: graph_panel.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:49:23  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: graph_panel.cpp,v 1000.1 2004/06/01 20:49:23 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/graph/graph_panel.hpp>
  41. BEGIN_NCBI_SCOPE
  42. CGraphPanel::CGraphPanel()
  43. :   m_pAxisArea(NULL),
  44.     m_pLegend(NULL),
  45.     m_rcAll(0,0,200,200),
  46.     m_GraphOffsetX(80), m_GraphOffsetY(10),
  47.     m_LegendOffsetX(80), m_LegendH(30),
  48.     m_LimitsModeX(eGraphLimits),
  49.     m_LimitsModeY(eGraphLimits),
  50.     m_bDrawGrid(true),
  51.     m_bDrawAxes(true),
  52.     m_bAntiAliasing(true),
  53.     m_BackColor(1.0f, 1.0f, 1.0f),
  54.     m_GraphBackColor(1.0f, 1.0f, 1.0f)
  55. {
  56. }
  57. CGraphPanel::~CGraphPanel()
  58. {
  59.     destroy_null(m_pLegend);
  60.     destroy_null(m_pAxisArea);
  61. }
  62. void    CGraphPanel::Create()
  63. {
  64.     m_pLegend = CreateLegend();
  65.     m_pAxisArea = CreateAxisArea();
  66.     if (m_pAxisArea)
  67.         m_pAxisArea->SetupAxes();
  68. }
  69. void    CGraphPanel::SetRect(const TVPRect& rcAll, bool bLayout)
  70. {
  71.     m_rcAll = rcAll;
  72.     if (bLayout)
  73.         Layout();
  74. }
  75. void    CGraphPanel::SetLayout( int GraphOffsetX, int GraphOffsetY, 
  76.                                 int LegendOffsetX, int LegendH, bool bLayout)
  77. {
  78.     m_GraphOffsetX = GraphOffsetX;
  79.     m_GraphOffsetY = GraphOffsetY;
  80.     m_LegendOffsetX = LegendOffsetX;
  81.     m_LegendH = LegendH;
  82.     if (bLayout)
  83.         Layout();
  84. }
  85. void    CGraphPanel::Layout()
  86. {
  87.     TVPRect rc = m_rcAll;
  88.     int y = rc.Bottom() + m_LegendH;
  89.     rc.SetBottom(y);
  90.     m_Pane.SetViewport(rc);
  91.     // place Graph pane in the top right corner
  92.     rc.MoveLeft(m_GraphOffsetX);
  93.     rc.MoveBottom(m_GraphOffsetY);
  94.     m_GraphPane.SetViewport(rc);
  95.     // place Legend in the bottom
  96.     rc = m_rcAll;
  97.     rc.SetLeft(m_LegendOffsetX);
  98.     rc.SetTop(y-1);
  99.     m_LegendPane.SetViewport(rc);        
  100. }
  101. void    CGraphPanel::SetLimitsMode(ELimitsMode ModeX, ELimitsMode ModeY)
  102. {
  103.     m_LimitsModeX = ModeX;
  104.     m_LimitsModeY = ModeY;
  105. }
  106. void    CGraphPanel::SetFixedLimits(const TModelRect& rcLimits)
  107. {
  108.     TModelRect rc = m_GraphPane.GetModelLimitsRect();
  109.     if (m_LimitsModeX == eFixed) {
  110.         rc.SetLeft(rcLimits.Left());
  111.         rc.SetRight(rcLimits.Right());
  112.     }
  113.     if (m_LimitsModeY == eFixed) {
  114.         rc.SetBottom(rcLimits.Bottom());
  115.         rc.SetTop(rcLimits.Top());
  116.     }
  117.     m_GraphPane.SetModelLimitsRect(rc);
  118. }
  119. void    CGraphPanel::UpdateLimits()
  120. {
  121.     TModelRect rcLimits = m_GraphPane.GetModelLimitsRect();
  122.     if(m_LimitsModeX == eGraphLimits  ||  m_LimitsModeX == eRounded) {
  123.         TModelRect rcX;
  124.         NON_CONST_ITERATE(TGraphCont, it, m_Graphs) {
  125.             rcX.CombineWith((*it)->GetLimits());
  126.         }
  127.         if(m_LimitsModeX == eRounded) {
  128.             //call extension function
  129.         }
  130.         if(rcX.Width() == 0) 
  131.             rcX.SetRight(1.0);
  132.         rcLimits.SetLeft(rcX.Left());
  133.         rcLimits.SetRight(rcX.Right());
  134.     }
  135.     if(m_LimitsModeY == eGraphLimits  ||  m_LimitsModeY == eRounded) {
  136.         TModelRect rcY;
  137.         NON_CONST_ITERATE(TGraphCont, it, m_Graphs) {
  138.             rcY.CombineWith((*it)->GetLimits());
  139.         }
  140.         if(m_LimitsModeY == eRounded) {
  141.             //call extension function
  142.         }
  143.         if (rcY.Height() == 0) 
  144.             rcY.SetTop(1.0);
  145.         rcLimits.SetBottom(rcY.Bottom());
  146.         rcLimits.SetTop(rcY.Top());
  147.     }
  148.     m_GraphPane.SetModelLimitsRect(rcLimits);
  149. }
  150. void    CGraphPanel::SetIntegerMode(bool bIntegerX, bool bIntegerY)
  151. {
  152.     m_Gen.SetIntegerMode(bIntegerX, bIntegerY);
  153. }
  154. void    CGraphPanel::SetDrawGrid(bool bDraw)
  155. {
  156.     m_bDrawGrid = bDraw;
  157. }
  158. void    CGraphPanel::SetDrawAxes(bool bDraw)
  159. {
  160.     m_bDrawAxes = bDraw;
  161. }
  162. void    CGraphPanel::EnableAntiAliasing(bool bEn)
  163. {
  164.     m_bAntiAliasing = bEn;
  165. }
  166. void    CGraphPanel::SetBackColor(const CGlColor& Color, const CGlColor& GraphColor)
  167. {
  168.     m_BackColor = Color;
  169.     m_GraphBackColor = GraphColor;
  170. }
  171. void    CGraphPanel::AddGraph(IGraph* pGraph)
  172. {
  173.     m_Graphs.push_back(pGraph);
  174.     UpdateLimits();
  175. }
  176. void    CGraphPanel::RemoveAllGraphs()
  177. {
  178.     m_Graphs.clear();
  179.     UpdateLimits();
  180. }
  181. void    CGraphPanel::Render()
  182. {
  183.     PrepareContext();
  184.     if (m_bDrawGrid)
  185.         m_Grid.Render(&m_Pane, &m_GraphPane, &m_Gen);
  186.     
  187.     NON_CONST_ITERATE(TGraphCont, itGr, m_Graphs) {
  188.         (*itGr)->Render(&m_GraphPane);
  189.     }
  190.     
  191.     if (m_pAxisArea && m_bDrawAxes)
  192.         m_pAxisArea->Render(&m_Pane, &m_GraphPane, &m_Gen); 
  193.     if (m_pLegend)
  194.         m_pLegend->Render(&m_LegendPane);
  195. }
  196. void    CGraphPanel::PrepareContext()
  197. {
  198.     if (m_bAntiAliasing) {
  199.         glEnable(GL_BLEND);
  200.         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  201.         glEnable(GL_LINE_SMOOTH);
  202.         glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  203.         glEnable(GL_POINT_SMOOTH);
  204.         glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
  205.     } else {
  206.         glDisable(GL_BLEND);
  207.         glDisable(GL_LINE_SMOOTH);
  208.         glDisable(GL_POINT_SMOOTH);
  209.     }
  210.     glClearColor(m_BackColor.GetRed(), m_BackColor.GetGreen(), m_BackColor.GetBlue(), m_BackColor.GetAlpha());
  211.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
  212.     m_GraphPane.OpenPixels();
  213.     TVPRect rc = m_GraphPane.GetViewport();
  214.     glColorC(m_GraphBackColor);
  215.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  216.     glRectd(rc.Left(), rc.Bottom(), rc.Right(), rc.Top());
  217.     
  218.     m_GraphPane.Close();
  219. }
  220. CAxisArea*  CGraphPanel::CreateAxisArea()
  221. {
  222.     return new CAxisArea();
  223. }
  224. CLegend*    CGraphPanel::CreateLegend()
  225. {
  226.     return new CLegend();
  227. }
  228. END_NCBI_SCOPE
  229. /*
  230.  * ===========================================================================
  231.  * $Log: graph_panel.cpp,v $
  232.  * Revision 1000.1  2004/06/01 20:49:23  gouriano
  233.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  234.  *
  235.  * Revision 1.3  2004/05/21 22:27:42  gorelenk
  236.  * Added PCH ncbi_pch.hpp
  237.  *
  238.  * Revision 1.2  2003/08/28 19:20:51  yazhuk
  239.  * Changed CGlPane function names
  240.  *
  241.  * Revision 1.1  2003/08/14 17:56:31  yazhuk
  242.  * Initial revision
  243.  *
  244.  * ===========================================================================
  245.  */