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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqgraphic_render.cpp,v $
  4.  * PRODUCTION Revision 1000.7  2004/06/01 21:12:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.97
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seqgraphic_render.cpp,v 1000.7 2004/06/01 21:12:56 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:  Vlad Lebedev
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <gui/widgets/seq_graphic/seqgraphic_render.hpp>
  39. #include <gui/widgets/seq_graphic/seqgraphic_ds.hpp>
  40. #include <gui/opengl/glutils.hpp>
  41. #include <gui/widgets/seq_graphic/default_policy.hpp>
  42. #include <gui/widgets/seq_graphic/compact_policy.hpp>
  43. #include <gui/widgets/seq_graphic/genome_policy.hpp>
  44. #include <gui/widgets/seq_graphic/default_layoutpolicy.hpp>
  45. #include <gui/widgets/seq_graphic/genome_layoutpolicy.hpp>
  46. #include <gui/opengl/glbackground.hpp>
  47. #include <math.h>
  48. BEGIN_NCBI_SCOPE
  49. const TModelUnit kZoomFactorX     = 2.0;
  50. const TModelUnit kLenseZoomFactor = 10.0;
  51. const TVPUnit    kMaxPixelsBase   = 12;
  52. CSeqGraphicRenderer::CSeqGraphicRenderer()
  53. {
  54.     m_DS           = NULL;
  55.     m_NeedLensZoom = false;
  56.     m_MinZoomX     = log(1.0f / kMaxPixelsBase);  // Enougth to fit seq. letters
  57.     
  58.     m_FP.SetMinScaleX(1.0f / kMaxPixelsBase);
  59.     m_FP.EnableZoom(true, false);
  60.     m_FP.SetAdjustToLimits(true, false);
  61.     m_FP.EnableOffset(true);
  62.     m_RP.SetMinScaleX(1.0f / kMaxPixelsBase);
  63.     m_RP.EnableZoom(true, false);
  64.     m_RP.SetAdjustToLimits(true, false);
  65.     m_RP.EnableOffset(true);
  66.     m_AllPanes.push_back(&m_RP);
  67.     m_AllPanes.push_back(&m_FP);
  68.     
  69.     m_ScrollXPanes.push_back(&m_RP);
  70.     m_ScrollXPanes.push_back(&m_FP);
  71.     
  72.     m_AllRenderers.push_back(&m_RulerPanel);
  73.     m_AllRenderers.push_back(&m_FeatPanel);
  74. }
  75. CSeqGraphicRenderer::~CSeqGraphicRenderer()
  76. {
  77. }
  78. void CSeqGraphicRenderer::SetConfig(CRef<CSeqGraphicConfig> config)
  79. {
  80.     m_ConfigSettings = config;
  81.     m_FeatPanel.SetConfig(config);
  82.     ConfigureRenderPolicy();
  83. }
  84. void CSeqGraphicRenderer::UpdateConfig()
  85. {
  86.     ConfigureRenderPolicy();
  87. }
  88. void CSeqGraphicRenderer::ConfigureRenderPolicy()
  89. {
  90.     if (m_ConfigSettings) {
  91.         CRef<IPolicy> policy;
  92.         CRef<ILayoutPolicy> layout_policy;
  93.         switch (m_ConfigSettings->GetFeaturePanelRenderPolicy()) {
  94.         
  95.         case CRenderPolicyConfig::eRenderPolicyDefault :
  96.             policy.Reset(new CDefaultPolicy);
  97.             layout_policy.Reset(new CDefaultLayoutPolicy);
  98.             break;
  99.         
  100.         case CRenderPolicyConfig::eRenderPolicyCompact :
  101.             policy.Reset(new CCompactPolicy);
  102.             layout_policy.Reset(new CDefaultLayoutPolicy);
  103.             break;
  104.             
  105.         case CRenderPolicyConfig::eRenderPolicyInline :
  106.             //policy.Reset(new CInlinePolicy);
  107.             policy.Reset(new CDefaultPolicy);
  108.             layout_policy.Reset(new CDefaultLayoutPolicy);
  109.             break;
  110.             
  111.         case CRenderPolicyConfig::eRenderPolicyGenome :
  112.             policy.Reset(new CGenomePolicy);   // Change when we get a Genome Policy.
  113.             layout_policy.Reset(new CGenomeLayoutPolicy);
  114.             break;
  115.             
  116.         default:
  117.             return;
  118.         }
  119.         
  120.         //layout_policy.Reset(new CGenomeLayoutPolicy);
  121.         //policy.Reset(new CCompactPolicy);
  122.         
  123.         m_FeatPanel.SetRenderPolicy(policy);    
  124.         m_FeatPanel.SetLayoutPolicy(layout_policy);
  125.     }
  126. }
  127. TModelUnit CSeqGraphicRenderer::GetHeight()
  128. {
  129.     return m_FeatPanel.GetHeight(m_FP) + m_RulerPanel.GetPreferredSize().Y();
  130. }
  131. void CSeqGraphicRenderer::SetDataSource(const TVPRect& rc, CSeqGraphicDataSource* ds)
  132. {
  133.     m_DS = ds;
  134.     m_FeatPanel.SetHandle(m_DS->GetBioseqHandle());
  135.     m_FeatPanel.SetSelectedObjects(&m_SelectedObjects);
  136.     
  137.     m_RulerPanel.SetHorizontal(true, CRuler::eTop);
  138. m_RulerPanel.SetDisplayOptions(CRuler::fHideLabels |
  139.    CRuler::fShowMetric);    
  140.     x_SetupViewPorts(rc);
  141.     x_SetupModelLimits();
  142.     
  143.     m_MaxZoomX = log(m_FP.GetModelLimitsRect().Width() / rc.Width());
  144. }
  145. void CSeqGraphicRenderer::x_SetupViewPorts(const TVPRect& rc)
  146. {
  147.     TModelUnit ruler_height = m_RulerPanel.GetPreferredSize().Y();
  148.     //TModelUnit height = rc.Height();
  149.     TVPRect ruler_viewport(rc.Left(),  rc.Top() - ruler_height,
  150.                            rc.Right(), rc.Top());
  151.     TVPRect feat_viewport(rc.Left(),  rc.Bottom(),
  152.                           rc.Right(), rc.Top() - ruler_height);
  153.     feat_viewport.Offset(0, -m_ConfigSettings->GetRulerSpacer());
  154.     
  155.     m_RP.SetViewport(ruler_viewport);
  156.     m_FP.SetViewport(feat_viewport);
  157.     _TRACE("ruler: "
  158.            << ruler_viewport.Left() << ", "
  159.            << ruler_viewport.Bottom() << ", "
  160.            << ruler_viewport.Right() << ", "
  161.            << ruler_viewport.Top());
  162.     _TRACE("features: "
  163.            << feat_viewport.Left() << ", "
  164.            << feat_viewport.Bottom() << ", "
  165.            << feat_viewport.Right() << ", "
  166.            << feat_viewport.Top());
  167.     /**
  168.     size_t idx = 0;
  169.     TVPUnit bottom = rc.Bottom() + rc.Height();
  170.     NON_CONST_ITERATE(TGlPanes, iter, m_AllPanes) {
  171.         CGlPane& pane = **iter;
  172.         TVPUnit pref_height = m_AllRenderers[idx]->GetVPRect().Height();
  173.         
  174.         if (pref_height == 1) {
  175.             // TVPRect adds 1 automatically
  176.             pref_height = 0;
  177.         }
  178.         TVPRect rc_tmp(rc.Left(), bottom - pref_height, rc.Right(), bottom);
  179.         _TRACE("viewport: "
  180.                << rc_tmp.Left() << ", "
  181.                << rc_tmp.Bottom() << ", "
  182.                << rc_tmp.Right() << ", "
  183.                << rc_tmp.Top());
  184.         pane.SetViewport(rc_tmp);
  185.         bottom -= pref_height;
  186.         ++idx;
  187.     }
  188.     **/
  189. }
  190. void CSeqGraphicRenderer::x_SetupModelLimits()
  191. {
  192.     NON_CONST_ITERATE(TGlPanes, iter, m_AllPanes) {
  193.         CGlPane& pane = **iter;
  194.         
  195.         TVPRect& vp = pane.GetViewport();
  196.         TModelRect rc;
  197.         if (*iter == &m_RP) {
  198.             rc = TModelRect(0, 0, m_DS->GetSequenceLength() + 1, vp.Height());
  199.         } else {
  200.             rc = TModelRect(0, vp.Height(), m_DS->GetSequenceLength() + 1, 0);
  201.             rc.Offset(0, -m_ConfigSettings->GetRulerSpacer());
  202.         }
  203.         pane.SetModelLimitsRect(rc);
  204.         pane.SetVisibleRect    (rc);
  205.     }
  206. }
  207. void CSeqGraphicRenderer::Render()
  208. {
  209.     x_Draw(NULL);
  210. }
  211. void CSeqGraphicRenderer::Render(TAreaVector& areas)
  212. {
  213.     x_Draw(&areas);
  214. }
  215. void CSeqGraphicRenderer::Render(TAreaVector* p_areas)
  216. {
  217.     x_Draw(p_areas);
  218. }
  219. void CSeqGraphicRenderer::x_Draw(TAreaVector* p_areas)
  220. {
  221.     try {
  222.         CGlColor bg = m_ConfigSettings->GetElementColor(
  223.                             CSeqGraphicColorConfig::eBackground);
  224.         /**
  225.         CGlBackground back;
  226.         back.SetColor(bg);
  227.         back.Draw(m_RP.GetViewport());
  228.         back.Draw(m_FP.GetViewport());
  229.         **/
  230.         glClearColor(bg.GetRed(), bg.GetGreen(), bg.GetBlue(), 0.0f);
  231.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  232.         
  233.         CGlColor ruler_label = m_ConfigSettings->GetElementColor(
  234.                                 CSeqGraphicColorConfig::eLabel_Ruler);
  235.         CGlColor ruler_grid  = m_ConfigSettings->GetElementColor(
  236.                                 CSeqGraphicColorConfig::eRuler_Grid);
  237.         
  238.         m_RulerPanel.SetColor(CRuler::eBackground, bg);
  239.         m_RulerPanel.SetColor(CRuler::eRuller, ruler_grid);
  240.         m_RulerPanel.SetColor(CRuler::eText,   ruler_label);
  241.         if ( !m_DS ) {
  242.             return;
  243.         }
  244.         TModelRect& rcM = m_FP.GetModelLimitsRect();
  245.         TModelRect  rcV = m_FP.GetVisibleRect();
  246.     
  247.         // retrieve and count data. This is temporary.
  248.         TModelUnit rows = m_FeatPanel.GetHeight(m_FP); 
  249.         // We have a "floating" model space. So, adjust the limits 
  250.         rcM.SetBottom(rows);
  251.         m_FP.SetModelLimitsRect(rcM);
  252.         m_FP.SetVisibleRect(rcV);
  253.         // Finally, draw all panels
  254.         for (size_t idx = 0; idx != m_AllRenderers.size(); idx++) {
  255.             m_AllRenderers[idx]->Render( *m_AllPanes[idx] );
  256.         }
  257.         // collect HTML active areas
  258.         if(p_areas) 
  259.         {
  260.             m_FeatPanel.GetHTMLActiveAreas(m_FP, p_areas);
  261.             // Offset by the height of Ruler Panel and Spacer
  262.             NON_CONST_ITERATE (TAreaVector, iter, *p_areas) {
  263.                 // RulerBar
  264.                 (*iter).m_Bounds.Offset(0, m_RP.GetViewport().Height());
  265.                 
  266.                 // RulerBar spacer
  267.                 (*iter).m_Bounds.Offset(0, -m_ConfigSettings->GetRulerSpacer());
  268.             }
  269.         }
  270.         // Draw Zoomed view
  271.         if (m_NeedLensZoom) {
  272.             x_DimDisplay();
  273.             size_t idx = 1;
  274.             NON_CONST_ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  275.                 CGlPane& pane = **iter;
  276.                 TModelRect rc = pane.GetVisibleRect();
  277.                 pane.SetZoomFactor(kLenseZoomFactor);
  278.                 pane.ZoomIn(m_LensZoom);
  279.             
  280.                 if (&pane == &m_FP) {
  281.                     m_FeatPanel.GetHeight(m_FP);
  282.                     m_FeatPanel.Render(pane);
  283.                 } else {
  284.                     m_RulerPanel.Render(pane);
  285.                 }
  286.                 
  287.                 pane.SetZoomFactor(kZoomFactorX);
  288.                 pane.SetVisibleRect(rc);
  289.                 idx++;
  290.             }
  291.         }
  292.     }
  293.     catch (CException& e) {
  294.         m_FP.Close();
  295.         LOG_POST(Error << "Exception in CSeqGraphicRender::Render(): " << e.GetMsg());
  296.     }
  297.     CGlUtils::CheckGlError();
  298. }
  299. void CSeqGraphicRenderer::x_DimDisplay()
  300. {
  301.     glEnable(GL_BLEND);
  302.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  303.     glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
  304.     
  305.     NON_CONST_ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  306.         CGlPane& pane = **iter;
  307.         TVPRect& rc   = pane.GetViewport();
  308.         
  309.         pane.OpenPixels();
  310.         glRecti(rc.Left(), rc.Bottom(), rc.Right()+1, rc.Top());
  311.         pane.Close();
  312.     }
  313.     glDisable(GL_BLEND);
  314. }
  315. void CSeqGraphicRenderer::Resize(const TVPRect& rc)
  316. {
  317.     x_SetupViewPorts(rc);
  318.     
  319.     // prevent Y from resizing in feature panel
  320.     TModelRect& rcV = m_FP.GetVisibleRect();
  321.     rcV.SetTop(0);
  322.     rcV.SetBottom( abs(m_FP.GetViewport().Height()) - 1 );
  323.     m_FP.SetVisibleRect(rcV);
  324.     m_MaxZoomX = log(m_FP.GetModelLimitsRect().Width() / rc.Width());
  325. }
  326. // this function takes an absolute mouse coordinate and determines if any
  327. // features lie underneath the mouse position
  328. // x & y are GL coordinates
  329. const CLayoutObject* CSeqGraphicRenderer::HitTest(int x, int y)
  330. {
  331.     // Main Feature Panel
  332.     if (PanelHitTest(x, y) == eFeatures) {
  333.         return m_FeatPanel.HitTest(m_FP, x, y);
  334.     }
  335.     return NULL;
  336. }
  337. CSeqGraphicRenderer::TRendererPanel
  338. CSeqGraphicRenderer::PanelHitTest(int x, int y) const
  339. {
  340.     if (m_FP.GetViewport().PtInRect(x, y))
  341.         return eFeatures;
  342.     if (m_RP.GetViewport().PtInRect(x, y))
  343.         return eRuler;
  344.     return eNone;
  345. }
  346. void CSeqGraphicRenderer::GetTooltip(int x, 
  347.                     int y, string* title)
  348. {
  349.     *title = "";
  350.     
  351.     const CLayoutObject* obj = HitTest(x, y);
  352.     if (!obj) return;
  353.     
  354.     TRendererPanel pan = PanelHitTest(x, y);
  355.     if (pan == eFeatures)
  356.         m_FeatPanel.GetTooltip(obj, title);
  357. }
  358. void CSeqGraphicRenderer::SelectObject(const CObject* obj)
  359. {
  360.     m_SelectedObjects.push_back(
  361.         CRef<CObject>(const_cast<CObject*>(obj)));
  362. }
  363. void CSeqGraphicRenderer::SetLensZoom(int x, int y)
  364.     TVPRect& rcFP = m_FP.GetViewport();
  365.     if (rcFP.PtInRect(x, y)) {
  366.         m_NeedLensZoom = true;
  367.         m_FP.OpenOrtho();
  368.         m_LensZoom = m_FP.UnProject(x, y);
  369.         m_FP.Close();
  370.     } else {
  371.         m_NeedLensZoom = false;
  372.     }
  373. }
  374. void CSeqGraphicRenderer::CancelLensZoom()
  375. {
  376.     m_NeedLensZoom = false;
  377. }
  378. float CSeqGraphicRenderer::GetZoomX(void) const
  379. {
  380.     TModelUnit scale_x = log(m_FP.GetScaleX());
  381.     return 1.0f - (scale_x - m_MinZoomX) / (m_MaxZoomX - m_MinZoomX);
  382. }
  383. void CSeqGraphicRenderer::SetZoomX(float value)
  384. {
  385. // cout << "In Renderer::SetZoomX" << endl;
  386.     // slider is set up from 0 to 1. Convert to our units:
  387.     TModelUnit scale = m_MinZoomX + (m_MaxZoomX - m_MinZoomX) * (1.0f - value);
  388.     NON_CONST_ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  389.         CGlPane& pane = **iter;
  390.         pane.SetScale(exp(scale), pane.GetScaleY(), 
  391.                       pane.GetVisibleRect().CenterPoint() );
  392.     }
  393. }
  394. void CSeqGraphicRenderer::ZoomInCenter()
  395. {
  396.     ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  397.         (*iter)->ZoomInCenter();
  398.     }
  399. }
  400. void CSeqGraphicRenderer::ZoomOutCenter()
  401. {
  402.     ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  403.         (*iter)->ZoomOutCenter();
  404.     }
  405. void CSeqGraphicRenderer::ZoomAll()
  406. {
  407.     ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  408.         (*iter)->ZoomAll();
  409.     }
  410. void CSeqGraphicRenderer::SetScaleRef(TModelUnit scale_x, TModelUnit scale_y, 
  411.                                       const TModelPoint& point)
  412. {
  413.     if(scale_x > m_FP.GetMinScaleX())  {
  414.         ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  415.             TModelPoint ref_p(point.X(),  (*iter)->GetVisibleRect().Top());
  416.             
  417.             // It may be a little confusing, but
  418.             // model space is setup differently in m_RP panel
  419.             (*iter)->SetScaleRefPoint(scale_x, *iter == &m_RP ? 1 : -1, ref_p);
  420.         }
  421.     }
  422. }
  423. void CSeqGraphicRenderer::ZoomOnObject(const CLayoutObject* obj)
  424. {
  425.     if (!obj) 
  426.         return;
  427.         
  428.     TSeqRange range = obj->GetLocation().GetTotalRange();
  429.     ZoomOnRange(range);
  430. }
  431. void CSeqGraphicRenderer::ZoomOnRange(const TSeqRange& range)
  432. {
  433.     NON_CONST_ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  434.         CGlPane& pane = **iter;
  435.         TModelRect& rc = pane.GetVisibleRect();
  436.         //TModelUnit height = -rc.Height();
  437.         rc.SetLeft (range.GetFrom());
  438.         rc.SetRight(range.GetTo()  );
  439.         //rc.SetTop(0);
  440.         //rc.SetBottom(height);
  441.         //pane.SetVisibleRect(rc);
  442.         pane.ZoomRect(rc);
  443.     }
  444. }
  445. TSeqRange CSeqGraphicRenderer::GetVisibleRange() const
  446. {
  447.     const TModelRect& rc = m_FP.GetVisibleRect();
  448.     return TSeqRange( TSeqPos(rc.Left()), TSeqPos(rc.Right()) );
  449. }
  450. CGlPane& CSeqGraphicRenderer::GetFeatGlPane()
  451. {
  452.     return m_FP;
  453. }
  454. CGlPane& CSeqGraphicRenderer::GetRulerGlPane()
  455. {
  456.     return m_RP;
  457. }
  458. void CSeqGraphicRenderer::Scroll(TModelUnit x, TModelUnit y)
  459. {
  460.     const TModelRect& rc = m_FP.GetVisibleRect();
  461.     
  462.     double dX = x - rc.Left();
  463.     double dY = y - rc.Top();
  464.     
  465.     // Handle horizintal scrollbar
  466.     ITERATE(TGlPanes, iter, m_ScrollXPanes) {
  467.         (*iter)->Scroll(dX, 0.0f);
  468.     }
  469.     
  470.     // Handle vertical scrollbar
  471.     m_FP.Scroll(0.0f, dY);
  472. }
  473. TModelUnit CSeqGraphicRenderer::GetScrollLineSize()
  474. {
  475.     m_FP.OpenOrtho();
  476.     TModelUnit value = m_FP.UnProjectWidth(kMaxPixelsBase);
  477.     m_FP.Close();
  478.     
  479.     return value;
  480. }
  481.     
  482. END_NCBI_SCOPE
  483. /*
  484.  * ===========================================================================
  485.  * $Log: seqgraphic_render.cpp,v $
  486.  * Revision 1000.7  2004/06/01 21:12:56  gouriano
  487.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.97
  488.  *
  489.  * Revision 1.97  2004/05/31 00:29:47  dicuccio
  490.  * Reverted changed with regard to background - use glClear() instead of
  491.  * CGlBackground, avoids rendering artifact for now
  492.  *
  493.  * Revision 1.96  2004/05/21 22:27:55  gorelenk
  494.  * Added PCH ncbi_pch.hpp
  495.  *
  496.  * Revision 1.95  2004/05/21 13:50:13  lebedev
  497.  * Adjust object panel model space when using  ruler panel offsets
  498.  *
  499.  * Revision 1.94  2004/05/14 15:57:11  lebedev
  500.  * Optional argument to specify the type of title/tooltip added
  501.  *
  502.  * Revision 1.93  2004/05/13 16:20:57  lebedev
  503.  * Respect Ruler bar size for HTML active areas
  504.  *
  505.  * Revision 1.92  2004/05/12 16:54:12  lebedev
  506.  * Added  option to specify a space between the ruler and the rest of the dispay
  507.  *
  508.  * Revision 1.91  2004/05/10 15:06:32  lebedev
  509.  * Offset HTML Active areas by the height of the ruler bar
  510.  *
  511.  * Revision 1.90  2004/04/16 15:54:11  dicuccio
  512.  * Removed dead code
  513.  *
  514.  * Revision 1.89  2004/04/14 11:25:48  lebedev
  515.  * Added rendering of Mate Pairs.
  516.  *
  517.  * Revision 1.88  2004/04/06 13:44:17  dicuccio
  518.  * Changed draw -> Render.  Changed resize -> Resize
  519.  *
  520.  * Revision 1.87  2004/03/31 16:08:58  lebedev
  521.  * Methods to get HTML active areas added.
  522.  *
  523.  * Revision 1.86  2004/03/30 13:58:37  lebedev
  524.  * Use elements colors from configuration instead of setting colors directly.
  525.  *
  526.  * Revision 1.85  2004/03/24 15:15:34  dicuccio
  527.  * Changed include for renderer.  Added GetHeight().  Rewrote x_SetupViewports()
  528.  * to handleviewports that have non-zero origins.  Changed clearing of background
  529.  * - use CGlBackground indtead of glClear()
  530.  *
  531.  * Revision 1.84  2004/03/23 12:33:55  lebedev
  532.  * Made sequence and histograms bars a layout objects in the object panel.
  533.  * Made segment map a number of layout objects. Get rid of fixed size rows in the object panel.
  534.  *
  535.  * Revision 1.83  2004/03/12 15:58:15  lebedev
  536.  * ZoomAll method added
  537.  *
  538.  * Revision 1.82  2004/03/11 17:53:06  dicuccio
  539.  * Deprecated typedefs TPosition, TDimension, TIndex, TColor.  Use TSeqRange instead of TRange
  540.  *
  541.  * Revision 1.81  2004/03/04 14:39:27  lebedev
  542.  * Re-enable lens zoom.
  543.  *
  544.  * Revision 1.80  2004/02/24 14:43:14  lebedev
  545.  * Genome-scale rendering policy added
  546.  *
  547.  * Revision 1.79  2004/02/13 18:14:33  lebedev
  548.  * Make use of new ILayoutPolicy interface
  549.  *
  550.  * Revision 1.78  2004/02/10 13:15:33  lebedev
  551.  * ISelHandlerHost interface implemented for selections on sequence pane
  552.  *
  553.  * Revision 1.77  2004/01/29 14:11:54  dicuccio
  554.  * Wrapped draw() in try/catch to minimize unhandled exceptions.  Use TSeqRange
  555.  * instead of TRange
  556.  *
  557.  * Revision 1.76  2004/01/27 16:14:42  lebedev
  558.  * Methods for working with selections added
  559.  *
  560.  * Revision 1.75  2004/01/20 20:34:12  rsmith
  561.  * add ConfigureRenderPolicy and UpdateConfig methods, so that render policy can be changed on the fly.
  562.  *
  563.  * Revision 1.74  2004/01/16 18:43:56  dicuccio
  564.  * Dropped const on GetTooltip() - cascade of const functions made inavlid by this
  565.  *
  566.  * Revision 1.73  2004/01/16 13:40:15  lebedev
  567.  * Tooltips added
  568.  *
  569.  * Revision 1.72  2003/12/22 12:55:53  lebedev
  570.  * Old files removed
  571.  *
  572.  * Revision 1.71  2003/12/16 18:56:37  lebedev
  573.  * Introduced Rendering Policies for feature panels
  574.  *
  575.  * Revision 1.70  2003/12/09 12:40:00  lebedev
  576.  * Implemented IMouseZoomHandlerHost interface for zooming and scrolling with mouse
  577.  *
  578.  * Revision 1.69  2003/11/20 12:22:33  lebedev
  579.  * Changed model space coordinates for Ruler pane (missing ruler bug)
  580.  *
  581.  * Revision 1.68  2003/11/19 20:37:46  friedman
  582.  * API to detect and reset visible range change
  583.  *
  584.  * Revision 1.67  2003/11/14 13:51:49  lebedev
  585.  * Do not scroll ruler bar vertically
  586.  *
  587.  * Revision 1.66  2003/11/13 19:11:07  lebedev
  588.  * Objects selection reorganized. One row ofset bug in selection fixed
  589.  *
  590.  * Revision 1.65  2003/11/13 15:31:53  lebedev
  591.  * Methods to get visible sequence range added
  592.  *
  593.  * Revision 1.64  2003/11/04 17:00:39  lebedev
  594.  * Reverse and Compliment the sequence displayed under CDSs and Proteins on negative strand
  595.  *
  596.  * Revision 1.63  2003/11/04 12:43:06  lebedev
  597.  * Ruler bar added
  598.  *
  599.  * Revision 1.62  2003/10/31 19:06:43  yazhuk
  600.  * Fixed "mouse zoom drifting" bug.
  601.  *
  602.  * Revision 1.61  2003/10/30 13:21:59  lebedev
  603.  * Display of master sequence under selected CDSs and Proteins added
  604.  *
  605.  * Revision 1.60  2003/10/28 19:01:43  dicuccio
  606.  * Fixed compilation errors.  Pass CBioseq_Handle by const-ref and store as value,
  607.  * not as pointer
  608.  *
  609.  * Revision 1.59  2003/10/28 15:29:07  lebedev
  610.  * Use new configuration library
  611.  *
  612.  * Revision 1.58  2003/10/24 13:59:56  lebedev
  613.  * Make vertical scrollbar always visible
  614.  *
  615.  * Revision 1.57  2003/10/24 13:25:56  lebedev
  616.  * Use logarithmic scale fo zoom.
  617.  * Better scrolling in sequence pane.
  618.  *
  619.  * Revision 1.56  2003/10/22 18:32:56  lebedev
  620.  * Histogram display of features added (and compressed display)
  621.  * Zoom to mouse and scroll with mouse added.
  622.  *
  623.  * Revision 1.55  2003/10/21 13:44:48  lebedev
  624.  * Variable renamed to solve name conflict in CodeWarrior
  625.  *
  626.  * Revision 1.54  2003/10/10 15:29:11  lebedev
  627.  * Selection on a sequence and icon view added
  628.  *
  629.  * Revision 1.53  2003/10/10 12:57:48  lebedev
  630.  * Zoom sensitivity reduced
  631.  *
  632.  * Revision 1.52  2003/10/09 17:59:38  lebedev
  633.  * Compilation error fixed
  634.  *
  635.  * Revision 1.51  2003/10/09 16:27:09  lebedev
  636.  * Widget redesign: Use independent IRenderable panels for display
  637.  *
  638.  * ===========================================================================
  639.  */