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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cross_aln_render.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:06:30  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cross_aln_render.cpp,v 1000.2 2004/06/01 21:06:30 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 "cross_aln_render.hpp"
  39. #include <gui/widgets/aln_crossaln/cross_aln_ds.hpp>
  40. #include <gui/widgets/seq_graphic/compact_policy.hpp>
  41. #include <gui/widgets/seq_graphic/default_layoutpolicy.hpp>
  42. #include <gui/opengl/glutils.hpp>
  43. #include <math.h>
  44. BEGIN_NCBI_SCOPE
  45. const TModelUnit kZoomFactorX     = 2.0;
  46. const TModelUnit kLenseZoomFactor = 10.0;
  47. const TVPUnit    kMaxPixelsBase   = 12;
  48. CCrossAlnRenderer::CCrossAlnRenderer()
  49. {
  50.     m_Offset2    = 0;
  51.     m_DS         = NULL;
  52.     m_MinZoomX   = log(1.0f / kMaxPixelsBase);  // Enougth to fit seq. letters
  53.     
  54.     m_FP1.SetMinScaleX(1.0f / kMaxPixelsBase);
  55.     m_FP1.EnableZoom(true, false);
  56.     m_FP1.SetAdjustToLimits(true, false);
  57.     m_FP1.EnableOffset(true);
  58.     
  59.     m_RP1.SetMinScaleX(1.0f / kMaxPixelsBase);
  60.     m_RP1.EnableZoom(true, false);
  61.     m_RP1.SetAdjustToLimits(true, false);
  62.     m_CP.SetMinScaleX(1.0f / kMaxPixelsBase);
  63.     m_CP.EnableZoom(true, false);
  64.     m_CP.SetAdjustToLimits(true, false);
  65.     m_CP.EnableOffset(true);
  66.     m_FP2.SetMinScaleX(1.0f / kMaxPixelsBase);
  67.     m_FP2.EnableZoom(true, false);
  68.     m_FP2.SetAdjustToLimits(true, false);
  69.     m_FP2.EnableOffset(true);
  70.     
  71.     m_RP2.SetMinScaleX(1.0f / kMaxPixelsBase);
  72.     m_RP2.EnableZoom(true, false);
  73.     m_RP2.SetAdjustToLimits(true, false);
  74.     m_RulerPanel1.SetHorizontal(true, CRuler::eTop);
  75.     // tune panels
  76.     m_FeatPanel1.SetSelectedObjects(&m_SelectedObjects);
  77.     m_FeatPanel2.SetSelectedObjects(&m_SelectedObjects);
  78.     
  79.     // add to containers
  80.     m_AllPanes.push_back(&m_FP1);
  81.     m_AllPanes.push_back(&m_RP1);
  82.     m_AllPanes.push_back(&m_CP);
  83.     m_AllPanes.push_back(&m_RP2);
  84.     m_AllPanes.push_back(&m_FP2);
  85.     m_ScrollXPanes1.push_back(&m_FP1);
  86.     m_ScrollXPanes1.push_back(&m_RP1);
  87.     m_ScrollXPanes1.push_back(&m_CP);
  88.     m_ScrollXPanes2.push_back(&m_FP2);
  89.     m_ScrollXPanes2.push_back(&m_RP2);
  90.     m_AllRenderers.push_back(&m_FeatPanel1);
  91.     m_AllRenderers.push_back(&m_RulerPanel1);
  92.     m_AllRenderers.push_back(&m_CrossPanel);
  93.     m_AllRenderers.push_back(&m_RulerPanel2);
  94.     m_AllRenderers.push_back(&m_FeatPanel2);
  95.     
  96.     CRef<IPolicy> compact_policy(new CCompactPolicy());
  97.     CRef<ILayoutPolicy> layout_policy(new CDefaultLayoutPolicy());
  98.     m_FeatPanel1.SetRenderPolicy(compact_policy);
  99.     m_FeatPanel2.SetRenderPolicy(compact_policy);
  100.     m_FeatPanel1.SetLayoutPolicy(layout_policy);
  101.     m_FeatPanel2.SetLayoutPolicy(layout_policy);
  102. }
  103. CCrossAlnRenderer::~CCrossAlnRenderer()
  104. {
  105. }
  106. void CCrossAlnRenderer::SetConfig(CRef<CSeqGraphicConfig> config)
  107. {
  108.     m_FeatPanel1.SetConfig(config);
  109.     m_FeatPanel2.SetConfig(config);
  110. }
  111. void CCrossAlnRenderer::Update()
  112. {
  113.     CBioseq_Handle hndl1 = m_DS->GetQueryHandle();
  114.     CBioseq_Handle hndl2 = m_DS->GetSubjectHandle();
  115.     
  116.     m_SeqLength1 = hndl1.GetBioseqLength();
  117.     m_SeqLength2 = hndl2.GetBioseqLength();
  118.     m_FeatPanel1.SetHandle(hndl1);
  119.     m_FeatPanel2.SetHandle(hndl2);
  120.     x_SetupModelLimits();
  121.     
  122.     ZoomOnAlignment();
  123.     
  124.     x_AdjustCrossPane();
  125. }
  126. void CCrossAlnRenderer::SetDataSource(const TVPRect& rc, CCrossAlnDataSource* ds)
  127. {
  128.     m_DS = ds;
  129.     
  130.     m_CrossPanel.SetDataSource(ds);
  131.     x_SetupViewPorts(rc);
  132.         
  133.     m_MaxZoomX = log(m_FP1.GetModelLimitsRect().Width() / rc.Width());
  134. }
  135. void CCrossAlnRenderer::x_SetupViewPorts(const TVPRect& rc)
  136. {
  137.     int kCrossPanelSize = 100;
  138.     
  139.     TVPUnit total = rc.Top();
  140.     TVPUnit ruler_height = m_RulerPanel1.GetVPRect().Height();
  141.     TVPUnit feat_height = (total - ruler_height * 2 - kCrossPanelSize) / 2;
  142.     if (feat_height < 0) // panel resized too small
  143.         feat_height = 0; // do not resize any more
  144.     
  145.     m_FP1.SetViewport( TVPRect(rc.Left(), total - feat_height, rc.Right(), total) );
  146.     total -= feat_height;
  147.     
  148.     m_RP1.SetViewport( TVPRect(rc.Left(), total - ruler_height, rc.Right(), total) );
  149.     total -= ruler_height;
  150.     
  151.     m_CP.SetViewport( TVPRect(rc.Left(), total - kCrossPanelSize, rc.Right(), total) );
  152.     total -= kCrossPanelSize;
  153.     
  154.     m_RP2.SetViewport( TVPRect(rc.Left(), total - ruler_height, rc.Right(), total) );
  155.     total -= ruler_height;
  156.     
  157.     m_FP2.SetViewport( TVPRect(rc.Left(), total - feat_height, rc.Right(), total) );    
  158. }
  159. void CCrossAlnRenderer::x_SetupModelLimits()
  160. {
  161.     if (!m_DS) return;
  162.     
  163.     m_Offset2 = m_DS->GetOffset();
  164.     //cout << "offset: " << m_Offset2 << endl;
  165.     //m_Offset2 = -200;
  166.     TSignedSeqPos max_len = max(m_SeqLength1 - m_Offset2, 
  167.                                 m_SeqLength2 + m_Offset2);
  168.     
  169.     TModelRect rc1(0, 0, max_len + 1, m_FP1.GetViewport().Height());
  170.     
  171.     TModelRect rc2(0, 0, max_len + 1, m_RP1.GetViewport().Height());
  172.     
  173.     TModelRect rc3(0, 0, max_len + 1, m_RP2.GetViewport().Height());
  174.     
  175.     TModelRect rc4(0, m_FP2.GetViewport().Height(), max_len + 1, 0);
  176.     
  177.     TModelRect rcc(0, m_CP.GetViewport().Height(), max_len + 1, 0);
  178.     
  179.     m_RulerPanel1.SetRange(0, m_SeqLength1, 0, false);
  180.     m_RulerPanel2.SetRange(0, m_SeqLength2, 0, false);
  181.     
  182.     m_FP1.SetModelLimitsRect(rc1);
  183.     m_FP1.SetVisibleRect    (rc1);
  184.     
  185.     m_RP1.SetModelLimitsRect(rc2);
  186.     m_RP1.SetVisibleRect    (rc2);
  187.     
  188.     m_CP.SetModelLimitsRect(rcc);
  189.     m_CP.SetVisibleRect    (rcc);
  190.     m_RP2.SetModelLimitsRect(rc3);
  191.     m_RP2.SetVisibleRect    (rc3);
  192.     m_FP2.SetModelLimitsRect(rc4);
  193.     m_FP2.SetVisibleRect    (rc4);
  194.     
  195.     x_AdjustCrossPane();
  196. }
  197. void CCrossAlnRenderer::draw()
  198. {
  199.     glClearColor(1.0f, 1.0f, 0.95f, 0.0f);
  200.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  201.     if ( !m_DS ) return;  
  202.     
  203.     TModelRect rcVF1 = m_FP1.GetVisibleRect();
  204.     TModelRect rcVF2 = m_FP2.GetVisibleRect();
  205.     
  206.     TModelRect& rcVR1 = m_RP1.GetVisibleRect();
  207.     TModelRect& rcVR2 = m_RP2.GetVisibleRect();
  208.     TModelRect& rcM1 = m_FP1.GetModelLimitsRect();
  209.     TModelRect& rcM2 = m_FP2.GetModelLimitsRect();
  210.     TModelRect tmp_rc;
  211.     tmp_rc.SetLeft(0);
  212.     
  213.     // trick the feature panels that the model space begins with 0
  214.     // (that will be moved to the feature panel later) 
  215.     if (m_Offset2 < 0) {
  216.         rcVF1.Offset(+m_Offset2, 0);
  217.         rcVR1.Offset(+m_Offset2, 0);
  218.         tmp_rc.SetRight(m_SeqLength1);
  219.         tmp_rc.SetTop(rcVF1.Top());
  220.         tmp_rc.SetBottom(rcVF1.Bottom());
  221.         TModelRect inrc = tmp_rc.IntersectWith(rcVF1);    
  222.         inrc.SetTop(rcVF1.Top());
  223.         inrc.SetBottom(rcVF1.Bottom());
  224.         
  225.         m_FP1.SetVisibleRect(inrc);
  226.     }  else {
  227.         rcVF2.Offset(-m_Offset2, 0);
  228.         rcVR2.Offset(-m_Offset2, 0);
  229.                         
  230.         tmp_rc.SetRight(m_SeqLength2);
  231.         
  232.         TModelRect inrc = tmp_rc.IntersectWith(rcVF2);
  233.         inrc.SetTop(rcVF2.Top());
  234.         inrc.SetBottom(rcVF2.Bottom());
  235.         
  236.         m_FP2.SetVisibleRect(inrc);
  237.     }
  238.         
  239.     // retrieve and count data. This is temporary.
  240.     TModelUnit rows1 = 0, rows2 = 0;
  241.     
  242.     if (m_FP1.GetVisibleRect().Width() != 0) 
  243.         rows1 = m_FeatPanel1.GetHeight(m_FP1);
  244.     if (m_FP2.GetVisibleRect().Width() != 0) 
  245.         rows2 = m_FeatPanel2.GetHeight(m_FP2);
  246.     
  247.     // We have a "floating" model space. So, adjust the limits  
  248.     rcM1.SetTop(rows1); 
  249.     m_FP1.SetModelLimitsRect(rcM1);
  250.     m_FP1.SetVisibleRect(rcVF1);
  251.     rcM2.SetBottom(rows2); 
  252.     m_FP2.SetModelLimitsRect(rcM2);
  253.     m_FP2.SetVisibleRect(rcVF2);
  254.     
  255.     // Finally, draw all panels
  256.     for (size_t idx = 0; idx != m_AllRenderers.size(); idx++) {
  257.         m_AllRenderers[idx]->Render( *m_AllPanes[idx] );
  258.     }
  259.     
  260.     
  261.     // Now set model space back to normal
  262.     if (m_Offset2 < 0) {
  263.         rcVF1.Offset(-m_Offset2, 0);
  264.         rcVR1.Offset(-m_Offset2, 0);
  265.         
  266.         m_FP1.SetVisibleRect(rcVF1);
  267.         m_RP1.SetVisibleRect(rcVR1);
  268.     } else {
  269.         rcVF2.Offset(+m_Offset2, 0);
  270.         rcVR2.Offset(+m_Offset2, 0);
  271.         
  272.         m_FP2.SetVisibleRect(rcVF2);
  273.         m_RP2.SetVisibleRect(rcVR2);
  274.     }
  275.     CGlUtils::CheckGlError();
  276. }
  277. void CCrossAlnRenderer::resize(const TVPRect& rc)
  278. {
  279.     x_SetupViewPorts(rc);
  280.     
  281.     // prevent Y from resizing in feature panel
  282.     TModelRect& rcV1 = m_FP1.GetVisibleRect();
  283.     rcV1.SetTop(m_FP1.GetViewport().Height());
  284.     rcV1.SetBottom(0);
  285.     m_FP1.SetVisibleRect(rcV1);
  286.     TModelRect& rcV2 = m_FP2.GetVisibleRect();
  287.     rcV2.SetTop(0);
  288.     rcV2.SetBottom( m_FP2.GetViewport().Height() );
  289.     m_FP2.SetVisibleRect(rcV2);
  290.     
  291.     m_MaxZoomX = log(m_FP1.GetModelLimitsRect().Width() / rc.Width());
  292. }
  293. // this function takes an absolute mouse coordinate and determines if any
  294. // features lie underneath the mouse position
  295. // x & y are GL coordinates
  296. const CLayoutObject* CCrossAlnRenderer::HitTest(int x, int y)
  297. {
  298.     // Main Feature Panel
  299.     if (PanelHitTest(x, y) == eFeatures1) {
  300.         return m_FeatPanel1.HitTest(m_FP1, x, y);
  301.     }
  302.     if (PanelHitTest(x, y) == eFeatures2) {
  303.         return m_FeatPanel2.HitTest(m_FP2, x, y);
  304.     }
  305.     return NULL;
  306. }
  307. CCrossAlnRenderer::TRendererPanel
  308. CCrossAlnRenderer::PanelHitTest(int x, int y) const
  309. {
  310.     if (m_FP1.GetViewport().PtInRect(x, y))
  311.         return eFeatures1;
  312.     if (m_FP2.GetViewport().PtInRect(x, y))
  313.         return eFeatures2;
  314.     if (m_CP.GetViewport().PtInRect(x, y))
  315.         return eCross;
  316.     return eNone;
  317. }
  318. CGlPane*
  319. CCrossAlnRenderer::PaneHitTest(int x, int y)
  320. {
  321.     if (m_FP1.GetViewport().PtInRect(x, y))
  322.         return &m_FP1;
  323.     if (m_FP2.GetViewport().PtInRect(x, y))
  324.         return &m_FP2;
  325.     if (m_CP.GetViewport().PtInRect(x, y))
  326.         return &m_CP;
  327.     return NULL;
  328. }
  329. void CCrossAlnRenderer::GetTooltip(int x, int y, string* title)
  330. {
  331.     *title = "";
  332.     
  333.     const CLayoutObject* obj = HitTest(x, y);
  334.     if (!obj) return;
  335.     
  336.     TRendererPanel pan = PanelHitTest(x, y);
  337.     if (pan == eFeatures1)
  338.         m_FeatPanel1.GetTooltip(obj, title);
  339.     if (pan == eFeatures2)
  340.         m_FeatPanel2.GetTooltip(obj, title);
  341. }
  342. void CCrossAlnRenderer::SelectObject(const CObject* obj)
  343. {
  344.     m_SelectedObjects.push_back(
  345.         CRef<CObject>(const_cast<CObject*>(obj)));
  346. }
  347. float CCrossAlnRenderer::GetZoomX(void) const
  348. {
  349.     TModelUnit scale_x = log(m_FP1.GetScaleX());
  350.     return 1.0f - (scale_x - m_MinZoomX) / (m_MaxZoomX - m_MinZoomX);
  351. }
  352. void CCrossAlnRenderer::SetZoomX(float value)
  353. {
  354.     // slider is set up from 0 to 1. Convert to our units:
  355.     TModelUnit scale = m_MinZoomX + (m_MaxZoomX - m_MinZoomX) * (1.0f - value);
  356.     NON_CONST_ITERATE(TGlPanes, iter, m_ScrollXPanes1) {
  357.         CGlPane& pane = **iter;
  358.         pane.SetScale(exp(scale), pane.GetScaleY(), 
  359.                       pane.GetVisibleRect().CenterPoint() );
  360.     }
  361. }
  362. void CCrossAlnRenderer::ZoomInCenter()
  363. {
  364.     ITERATE(TGlPanes, iter, m_ScrollXPanes1) {
  365.         (*iter)->ZoomInCenter();
  366.     }
  367. }
  368. void CCrossAlnRenderer::ZoomOutCenter()
  369. {
  370.     ITERATE(TGlPanes, iter, m_ScrollXPanes1) {
  371.         (*iter)->ZoomOutCenter();
  372.     }
  373. void CCrossAlnRenderer::x_AdjustCrossPane()
  374. {
  375.     TModelUnit p_scale = m_CP.GetScaleX() / m_FP2.GetScaleX();
  376.     m_CrossPanel.SetProportions(p_scale, m_Offset2);
  377.     m_CrossPanel.SetShifts(m_FP1.GetVisibleRect().Left(), 
  378.                            m_FP2.GetVisibleRect().Left());
  379. }
  380. void CCrossAlnRenderer::SetScaleRef1(TModelUnit scale_x, TModelUnit scale_y, 
  381.                                      const TModelPoint& point)
  382. {
  383.     if(scale_x > m_FP1.GetMinScaleX())  
  384.     {
  385.         ITERATE(TGlPanes, iter, m_ScrollXPanes1) {
  386.             TModelPoint ref_p(point.X(),  (*iter)->GetVisibleRect().Top());
  387.             (*iter)->SetScaleRefPoint(scale_x, *iter == &m_CP ? -1 : 1, ref_p);
  388.         }    
  389.     }
  390.     x_AdjustCrossPane();
  391. }
  392. void CCrossAlnRenderer::SetScaleRef2(TModelUnit scale_x, TModelUnit scale_y, 
  393.                                      const TModelPoint& point)
  394. {
  395.     if(scale_x > m_FP2.GetMinScaleX())  
  396.     {
  397.         ITERATE(TGlPanes, iter, m_ScrollXPanes2) {
  398.             TModelPoint ref_p(point.X(),  (*iter)->GetVisibleRect().Top());
  399.             (*iter)->SetScaleRefPoint(scale_x, *iter == &m_RP2 ? 1 : -1, ref_p);
  400.         }    
  401.     }
  402.     x_AdjustCrossPane();
  403. }
  404. void CCrossAlnRenderer::SetScaleRefC(TModelUnit scale_x, TModelUnit scale_y, 
  405.                                      const TModelPoint& point)
  406. {
  407.     if(scale_x > m_CP.GetMinScaleX())  
  408.     {
  409.         ITERATE(TGlPanes, iter, m_AllPanes) {
  410.             TModelPoint ref_p(point.X(),  (*iter)->GetVisibleRect().Top());
  411.             (*iter)->SetScaleRefPoint(scale_x, 
  412.                         (*iter == &m_CP || *iter == &m_FP2) ? -1 : 1, ref_p);
  413.         }
  414.     }
  415.     
  416.     x_AdjustCrossPane();
  417. }
  418. void CCrossAlnRenderer::ZoomOnObject(const CLayoutObject* obj)
  419. {
  420.     if (!obj) 
  421.         return;
  422.         
  423.     TSeqRange range = obj->GetLocation().GetTotalRange();
  424.     ZoomOnRange(range);
  425. }
  426. void CCrossAlnRenderer::ZoomOnRange(const TSeqRange& range)
  427. {
  428.     ITERATE(TGlPanes, iter, m_AllPanes) {
  429.         TModelRect rc = (*iter)->GetVisibleRect();
  430.         rc.SetLeft (range.GetFrom());
  431.         rc.SetRight (range.GetTo());
  432.         (*iter)->ZoomRect(rc);
  433.     }
  434.     x_AdjustCrossPane();
  435. }
  436. void CCrossAlnRenderer::ZoomOnAlignment()
  437. {
  438.     const TSeqRange& range = m_DS->GetTotalRange();
  439.     ZoomOnRange(range);
  440. }
  441. void CCrossAlnRenderer::FitToWindow(void)
  442. {
  443.     // FixMe
  444. }
  445. void CCrossAlnRenderer::ZoomToSequence(void)
  446. {
  447.     // FixMe
  448. }
  449. CGlPane& CCrossAlnRenderer::GetFeatGlPane1()
  450. {
  451.     return m_FP1;
  452. }
  453. CGlPane& CCrossAlnRenderer::GetFeatGlPane2()
  454. {
  455.     return m_FP2;
  456. }
  457. CGlPane& CCrossAlnRenderer::GetCrossGlPane()
  458. {
  459.     return m_CP;
  460. }
  461.     
  462. void CCrossAlnRenderer::Scroll(TModelUnit x1, TModelUnit y1, 
  463.                                TModelUnit x2, TModelUnit y2)
  464. {   
  465.     const TModelRect& rc1 = m_FP1.GetVisibleRect();
  466.     const TModelRect& rc2 = m_FP2.GetVisibleRect();
  467.     
  468.     double dX1 = x1 - rc1.Left();
  469.     double dY1 = y1 - rc1.Bottom();
  470.     double dX2 = x2 - rc2.Left();
  471.     double dY2 = y2 - rc2.Top();
  472.     
  473.     // Handle horizintal scrollbar
  474.     ITERATE(TGlPanes, iter, m_ScrollXPanes1)
  475.         (*iter)->Scroll(dX1, 0.0f);
  476.     
  477.     ITERATE(TGlPanes, iter, m_ScrollXPanes2)
  478.         (*iter)->Scroll(dX2, 0.0f);
  479.         
  480.     m_FP1.Scroll(0.0f, dY1); // Handle vertical scrollbar 1
  481.     m_FP2.Scroll(0.0f, dY2); // Handle vertical scrollbar 2
  482.     x_AdjustCrossPane();
  483. }
  484. TModelUnit CCrossAlnRenderer::GetScrollLineSize1()
  485. {
  486.     m_FP1.OpenOrtho();
  487.     TModelUnit value = m_FP1.UnProjectWidth(kMaxPixelsBase);
  488.     m_FP1.Close();
  489.     
  490.     return value;
  491. }
  492. TModelUnit CCrossAlnRenderer::GetScrollLineSize2()
  493. {
  494.     m_FP2.OpenOrtho();
  495.     TModelUnit value = m_FP2.UnProjectWidth(kMaxPixelsBase);
  496.     m_FP2.Close();
  497.     
  498.     return value;
  499. }
  500.     
  501. END_NCBI_SCOPE
  502. /*
  503.  * ===========================================================================
  504.  * $Log: cross_aln_render.cpp,v $
  505.  * Revision 1000.2  2004/06/01 21:06:30  gouriano
  506.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  507.  *
  508.  * Revision 1.13  2004/05/21 22:27:52  gorelenk
  509.  * Added PCH ncbi_pch.hpp
  510.  *
  511.  * Revision 1.12  2004/05/14 15:57:18  lebedev
  512.  * Optional argument to specify the type of title/tooltip added
  513.  *
  514.  * Revision 1.11  2004/04/16 12:44:37  lebedev
  515.  * Use default layout policy for both feature panels.
  516.  *
  517.  * Revision 1.10  2004/03/11 17:50:41  dicuccio
  518.  * Updated typedefs: dropped TDimension, TPosition, TIndex, TColor; use TSeqRange
  519.  * instead of TRange
  520.  *
  521.  * Revision 1.9  2004/02/13 19:00:07  lebedev
  522.  * Do not use EnableViewOption in graphical widget any more
  523.  *
  524.  * Revision 1.8  2004/01/30 17:18:47  dicuccio
  525.  * Use CBioseq_Handle::GetBioseqLength() instead of creating a CSeqVector
  526.  *
  527.  * Revision 1.7  2004/01/27 16:20:41  lebedev
  528.  * Changed stored selection from CLayoutObject to CObject
  529.  *
  530.  * Revision 1.6  2004/01/20 18:19:53  dicuccio
  531.  * Minot code rearrangement
  532.  *
  533.  * Revision 1.5  2004/01/16 19:17:06  tereshko
  534.  * Removed const modifyer for GetTooltip method
  535.  *
  536.  * Revision 1.4  2004/01/16 13:40:39  lebedev
  537.  * Tooltips added
  538.  *
  539.  * Revision 1.3  2003/12/22 19:37:43  dicuccio
  540.  * Fixed compiler warnings about double -> float conversion
  541.  *
  542.  * Revision 1.2  2003/12/22 16:51:32  lebedev
  543.  * Use CHitElemDataAdapter to get start/length from datasource
  544.  *
  545.  * Revision 1.1  2003/12/22 13:12:33  lebedev
  546.  * Initial revision
  547.  *
  548.  * ===========================================================================
  549.  */