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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: legend.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:49:29  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: legend.cpp,v 1000.1 2004/06/01 20:49:29 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/legend.hpp>
  41. BEGIN_NCBI_SCOPE
  42. ///////////////////////////////////////////////////////////////////////////////
  43. /// class CLegend 
  44. CLegend::CLegend()
  45.     : m_Font(CGlBitmapFont::eHelvetica12),
  46.       m_BackColor(0.95f, 0.95f, 0.95f),
  47.       m_BorderColor(0.0f, 0.0f, 0.0f),
  48.       m_bHorz(true), 
  49.       m_Space(10)
  50. {
  51. }
  52. CLegend::~CLegend()
  53. {
  54. }
  55. void    CLegend::SetBackColor(const CGlColor& Color)
  56. {
  57.     m_BackColor = Color;
  58. }
  59. const CGlColor& CLegend::GetBackColor() const
  60. {
  61.     return m_BackColor;
  62. }
  63. void    CLegend::SetBorderColor(const CGlColor& Color)
  64. {
  65.     m_BorderColor = Color;
  66. }
  67. const CGlColor& CLegend::GetBorderColor()
  68. {
  69.     return m_BorderColor;
  70. }
  71. bool    CLegend::SetDataSource(IGraphDataSource* pDS)
  72. {
  73.     ILegendDataSource* pLegendDS = dynamic_cast<ILegendDataSource*>(pDS);
  74.     bool bOk =  pLegendDS!= NULL;
  75.     CGraphBase::SetDataSource(bOk ? pDS : NULL);
  76.     
  77.     CalculateLimits();
  78.     return bOk;
  79. }
  80. const   TModelRect&    CLegend::GetLimits()    const
  81. {
  82.     return m_Limits;
  83. }
  84. void CLegend::CalculateLimits()
  85. {
  86.     m_Limits.Init(0, 0, 1, 1);
  87. }
  88. void    CLegend::Render(CGlPane* pPane)
  89. {
  90.     if(pPane) {        
  91.         pPane->OpenPixels();
  92.         try {
  93.             TVPRect rcVP = pPane->GetViewport();
  94.             
  95.             // fill background
  96.             glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  97.             glColorC(m_BackColor);
  98.             glRecti(rcVP.Left(), rcVP.Bottom(), rcVP.Right(), rcVP.Top());
  99.             
  100.             // draw Border
  101.             glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  102.             glColorC(m_BorderColor);
  103.             glRecti(rcVP.Left(), rcVP.Bottom(), rcVP.Right(), rcVP.Top());
  104.             x_RenderItems(pPane);
  105.         }
  106.         catch(...)  {
  107.             //need to trace it
  108.         }
  109.         pPane->Close();
  110.     }
  111. }
  112. void    CLegend::x_RenderItems(CGlPane* pPane)
  113. {
  114.     ILegendDataSource* pSource = GetLegendDataSource();
  115.     if (pSource) {    
  116.         IStringArray* pLabels = pSource->GetLabelArray();
  117.         IColorArray*  pColors = pSource->GetColorArray();
  118.         INumericArray* pMarkers = pSource->GetMarkerArray();
  119.         
  120.         int H = max( (int)m_Font.TextHeight(), 10);
  121.         TVPRect rcVP = pPane->GetViewport();    
  122.         int LeftLimit = rcVP.Left() + m_Space;
  123.         int RightLimit  = rcVP.Right() - m_Space;
  124.         int BottomLimit = rcVP.Bottom() + m_Space;
  125.         int vpX = LeftLimit; 
  126.         int StepY = H + max(H / 2, 4); 
  127.         int vpY = rcVP.Top() - m_Space - StepY;
  128.         m_BoxW = pSource->ShowMarkers() ? H * 2 : H;
  129.         m_BoxH = H;
  130.         
  131.         int MaxX = LeftLimit;
  132.         
  133.         int N = pLabels->GetSize();
  134.         for ( int i = 0;  i < N;  i++ ) { // iterating by items
  135.             string sText = pLabels->GetElem(i);
  136.             int W = m_BoxW + m_Space + (int)m_Font.TextWidth(sText.c_str());
  137.             int iMarker = pSource->ShowMarkers() ? (int) pMarkers->GetElem(i) : -1;
  138.             if( m_bHorz) {                
  139.                 if (vpX + W > RightLimit) { // new line
  140.                     vpY -= StepY;
  141.                     vpX = LeftLimit;
  142.                 }
  143.                 x_RenderItem(vpX, vpY, sText, pColors->GetElem(i), iMarker);    
  144.                 
  145.                 vpX += W + m_Space * 2;
  146.             } else {                
  147.                 x_RenderItem(vpX, vpY, sText, pColors->GetElem(i), iMarker);    
  148.                 
  149.                 MaxX = max(MaxX, vpX + W);
  150.                 vpY -= StepY;
  151.                 if (vpY < BottomLimit) { // new column
  152.                     vpY = rcVP.Top() - m_Space - StepY;
  153.                     vpX = MaxX + m_Space;
  154.                 }
  155.             }
  156.         }
  157.     }
  158. }
  159. void CLegend::x_RenderItem(int X, int Y, const string& sLabel, const CGlColor& Color, int iMarker)
  160. {
  161.     CGraphDotMarker::EMarkerType Type = static_cast<CGraphDotMarker::EMarkerType>(iMarker);
  162.     
  163.     switch (Type) {
  164.     case CGraphDotMarker::eNone:
  165.     case CGraphDotMarker::eRect:
  166.     case CGraphDotMarker::eDiamond:
  167.     case CGraphDotMarker::eTriangle: 
  168.     case CGraphDotMarker::eCross: {
  169.         //draw line
  170.         glColorC(Color);
  171.         glBegin(GL_LINES);
  172.             glVertex2i(X, Y + m_BoxH / 2);
  173.             glVertex2i(X + m_BoxW, Y + m_BoxH / 2);
  174.         glEnd();
  175.         // draw marker
  176.         TModelUnit MarkerSize = (m_BoxH % 2) ? m_BoxH : (m_BoxH - 1);
  177.         CGraphDotMarker::RenderMarker(X + m_BoxW / 2, Y + m_BoxH / 2, MarkerSize, MarkerSize, Type);
  178.         break;
  179.     }
  180.     default: {
  181.         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  182.         glColorC(Color);
  183.         glRectd(X, Y, X + m_BoxW, Y + m_BoxH);
  184.     
  185.         glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  186.         glColorC(m_BorderColor);
  187.         glRectd(X, Y, X + m_BoxW, Y + m_BoxH);
  188.     }
  189.     } //switch
  190.     glColorC(Color);
  191.     m_Font.TextOut(X + m_BoxW + m_Space, Y, sLabel.c_str());
  192. }
  193. ///////////////////////////////////////////////////////////////////////////////
  194. /// class CLegendDataSource
  195. void    CLegendDataSource::CreateArrays()
  196. {
  197.     CSeriesBase::CreateArrays();
  198.     TStrAdapter* pStrAd = new TStrAdapter(m_Length);
  199.     AddArray(static_cast<IDataArray*>(pStrAd));
  200.     
  201.     TColorAdapter* pCAd = new TColorAdapter(m_Length);
  202.     AddArray(static_cast<IDataArray*>(pCAd));
  203.     TEnumAdapter* pEnAd = new TEnumAdapter(m_Length);
  204.     AddArray(static_cast<IDataArray*>(pEnAd));
  205. }
  206. END_NCBI_SCOPE
  207. /*
  208.  * ===========================================================================
  209.  * $Log: legend.cpp,v $
  210.  * Revision 1000.1  2004/06/01 20:49:29  gouriano
  211.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  212.  *
  213.  * Revision 1.6  2004/05/21 22:27:42  gorelenk
  214.  * Added PCH ncbi_pch.hpp
  215.  *
  216.  * Revision 1.5  2003/09/17 16:24:16  dicuccio
  217.  * Use CGlBitmapFont instead of CGlutFont
  218.  *
  219.  * Revision 1.4  2003/08/19 00:35:52  dicuccio
  220.  * Fixed compilation errors following API change for IGlFont
  221.  *
  222.  * Revision 1.3  2003/08/11 16:10:57  yazhuk
  223.  * Compilation fixes for GCC
  224.  *
  225.  * Revision 1.2  2003/08/08 15:59:36  yazhuk
  226.  * Comments added
  227.  *
  228.  * ===========================================================================
  229.  */
  230.