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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqgraphic_widget.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:12:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seqgraphic_widget.cpp,v 1000.2 2004/06/01 21:12:59 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/utils/fltk_utils.hpp>
  39. #include <gui/widgets/seq_graphic/seqgraphic_widget.hpp>
  40. #include <gui/widgets/seq_graphic/seqgraphic_ds.hpp>
  41. #include <gui/widgets/fl/menu.hpp>
  42. #include <gui/config/feat_config_list.hpp>
  43. #include "seqgraphic_pane.hpp"
  44. #include <FL/Fl_Box.H>
  45. BEGIN_NCBI_SCOPE
  46. USING_SCOPE(objects);
  47. void s_CSeqGraphicWidget_ScrollCB(Fl_Widget* w, void*)
  48. {
  49.     dynamic_cast<CSeqGraphicWidget&> (*w->parent()).x_ScrollCB();
  50. }
  51. void s_CSeqGraphicWidget_SliderXCB(Fl_Widget* w, void*)
  52. {
  53.     dynamic_cast<CSeqGraphicWidget&> (*w->parent()).x_SliderCB();
  54. }
  55. void s_CSeqGraphicWidget_SearchXCB(Fl_Widget* w, void*)
  56. {
  57.     dynamic_cast<CSeqGraphicWidget&> (*w->parent()->parent()).x_SearchCB();
  58. }
  59. void s_CSeqGraphicWidget_PrevXCB(Fl_Widget* w, void*)
  60. {
  61.     dynamic_cast<CSeqGraphicWidget&> (*w->parent()->parent()).x_PrevCB();
  62. }
  63. void s_CSeqGraphicWidget_NextXCB(Fl_Widget* w, void*)
  64. {
  65.     dynamic_cast<CSeqGraphicWidget&> (*w->parent()->parent()).x_NextCB();
  66. }
  67. static
  68. DEFINE_MENU(PopupMenu)
  69.     MENU_ITEM(eCmdZoomIn, "Zoom In")
  70.     MENU_ITEM(eCmdZoomOut, "Zoom Out")
  71.     MENU_ITEM(eCmdZoomAll, "Zoom All")
  72.     MENU_ITEM(eCmdZoomObject, "Zoom on Object")
  73.     MENU_SEPARATOR()
  74.     MENU_ITEM(eCmdPrevExon, "Feature: Prev. Exon")
  75.     MENU_ITEM(eCmdNextExon, "Feature: Next Exon")
  76. END_MENU()
  77. BEGIN_CMD_MAP(CSeqGraphicWidget, CCommandTarget)
  78.     ON_COMMAND(eCmdZoomIn,     &CSeqGraphicWidget::OnZoomIn)
  79.     ON_COMMAND(eCmdZoomOut,    &CSeqGraphicWidget::OnZoomOut)
  80.     ON_COMMAND(eCmdZoomAll,    &CSeqGraphicWidget::OnZoomAll)
  81.     ON_COMMAND(eCmdZoomObject, &CSeqGraphicWidget::OnZoomObject)
  82.     ON_COMMAND(eCmdPrevExon,   &CSeqGraphicWidget::OnPrevExon)
  83.     ON_COMMAND(eCmdNextExon,   &CSeqGraphicWidget::OnNextExon)
  84. END_CMD_MAP()
  85. void CSeqGraphicWidget::OnZoomIn(void)
  86. {
  87.     m_SeqGraphicPane->ZoomIn();
  88. }
  89. void CSeqGraphicWidget::OnZoomOut(void)
  90. {
  91.     m_SeqGraphicPane->ZoomOut();
  92. }
  93. void CSeqGraphicWidget::OnZoomAll(void)
  94. {
  95.     m_SeqGraphicPane->ZoomAll();
  96. }
  97. void CSeqGraphicWidget::OnZoomObject(void)
  98. {
  99.     m_SeqGraphicPane->ZoomObject();
  100. }
  101. void CSeqGraphicWidget::OnPrevExon(void)
  102. {
  103.     m_SeqGraphicPane->NextPrevExon(CSeqGraphicPane::ePrev);
  104. }
  105. void CSeqGraphicWidget::OnNextExon(void)
  106. {
  107.     m_SeqGraphicPane->NextPrevExon(CSeqGraphicPane::eNext);
  108. }
  109. void CSeqGraphicWidget::OnShowPopup()
  110. {
  111.     CPopupMenu menu(x(), y(), w(), h());
  112.     menu.SetCmdTarget(static_cast<CCommandTarget*>(this));
  113.     add(&menu);
  114.     menu.SetItems(PopupMenu);
  115.     
  116.     menu.popup(); 
  117.     remove(&menu);
  118. }
  119. CSeqGraphicWidget::CSeqGraphicWidget(int x, int y, 
  120.                                  int w, int h, const char* label)
  121.     : Fl_Group(x, y, w, h, label)
  122. {
  123.     const int kScrollBarSize = 15;
  124.     const int kSliderBarSize = 40;
  125.     const int kSearchBarSize = 24;
  126.     
  127.     const int kNextW   = 14;
  128.     const int kPrevW   = 14;
  129.     const int kChoiceW = 150;
  130.     const int kRangeW  = 100;
  131.     const int kAllW    = kChoiceW + kRangeW + kPrevW + kNextW;
  132.     const int kSearchW = x + (w - kAllW) - 86;
  133.     
  134.     begin();
  135.     m_ScrollX = new Fl_Scrollbar
  136.             (x, y+(h - kScrollBarSize - kSliderBarSize - kSearchBarSize), 
  137.             w - kScrollBarSize, kScrollBarSize);
  138.     m_ScrollX->type(FL_HORIZONTAL);
  139.     m_ScrollX->callback( s_CSeqGraphicWidget_ScrollCB );
  140.     m_ScrollX->when(m_ScrollX->when() | FL_WHEN_RELEASE);
  141.     m_ScrollX->labeltype(FL_NO_LABEL);
  142.     m_ScrollY = new Fl_Scrollbar
  143.         (x + (w - kScrollBarSize), y, kScrollBarSize, 
  144.                   h - kSliderBarSize - kSearchBarSize - kScrollBarSize);
  145.     m_ScrollY->callback( s_CSeqGraphicWidget_ScrollCB );
  146.     m_ScrollY->labeltype(FL_NO_LABEL);
  147.     m_SlideZoomX = new Fl_Value_Slider
  148.         (x + 2, y+(h - kSearchBarSize - (kSliderBarSize - 20)), 
  149.         w - 4, kSliderBarSize - 20, "Sequence Zoom Level");
  150.     m_SlideZoomX->type(FL_HOR_NICE_SLIDER);
  151.     m_SlideZoomX->callback( s_CSeqGraphicWidget_SliderXCB );
  152.     m_SlideZoomX->when(m_SlideZoomX->when() | FL_WHEN_RELEASE);
  153.     m_SlideZoomX->align(FL_ALIGN_TOP);
  154.     //
  155.     // search bar
  156.     //
  157.     Fl_Group* search = new Fl_Group(x, y+(h - kSearchBarSize), 
  158.                                     w, kSearchBarSize);
  159.     search->box(FL_DOWN_FRAME);
  160.     search->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT);
  161.     {{
  162.         Fl_Box* box =
  163.             new Fl_Box(search->x() + Fl::box_dx(FL_DOWN_FRAME),
  164.                        search->y() + Fl::box_dy(FL_DOWN_FRAME),
  165.                        60 - Fl::box_dx(FL_DOWN_FRAME),
  166.                        kSearchBarSize - Fl::box_dh(FL_DOWN_FRAME));
  167.         box->label("Search:");
  168.     }}
  169.     m_SearchInput =
  170.         new Fl_Input(search->x() + 60,
  171.                      search->y() + Fl::box_dy(FL_DOWN_FRAME), 
  172.                      kSearchW,
  173.                      kSearchBarSize - Fl::box_dh(FL_DOWN_FRAME));
  174.     m_SearchInput->callback( s_CSeqGraphicWidget_SearchXCB );
  175.     m_SearchInput->when(FL_WHEN_ENTER_KEY);
  176.     
  177.     m_PrevButton =
  178.         new Fl_Button(m_SearchInput->x() + m_SearchInput->w() + 4,
  179.                       search->y() + Fl::box_dy(FL_DOWN_FRAME),
  180.                       kPrevW,
  181.                       kSearchBarSize - Fl::box_dh(FL_DOWN_FRAME),
  182.                       "<");
  183.     m_PrevButton->callback( s_CSeqGraphicWidget_PrevXCB );
  184.     m_NextButton =
  185.         new Fl_Button(m_PrevButton->x() + m_PrevButton->w() + 2,
  186.                       search->y() + Fl::box_dy(FL_DOWN_FRAME),
  187.                       kNextW, kSearchBarSize - Fl::box_dh(FL_DOWN_FRAME),
  188.                       ">");
  189.     m_NextButton->callback( s_CSeqGraphicWidget_NextXCB );
  190.     
  191.     m_SearchChoice =
  192.         new Fl_Choice(m_NextButton->x() + m_NextButton->w() + 4,
  193.                       search->y() + Fl::box_dy(FL_DOWN_FRAME),
  194.                       kChoiceW, kSearchBarSize - Fl::box_dh(FL_DOWN_FRAME));
  195.     m_RangeChoice =
  196.         new Fl_Choice(m_SearchChoice->x() + m_SearchChoice->w() + 4,
  197.                       search->y() + Fl::box_dy(FL_DOWN_FRAME),
  198.                       kRangeW, kSearchBarSize - Fl::box_dh(FL_DOWN_FRAME));
  199.     search->resizable(m_SearchInput);
  200.     search->end();
  201.     // we wrap the panel in a group because FLTK will not respect the
  202.     // widget's border type
  203.     Fl_Group* group = new Fl_Group(x, y,
  204.             w - kScrollBarSize,  h - kScrollBarSize - 
  205.             kSliderBarSize - kSearchBarSize);
  206.     const Fl_Boxtype panel_box = FL_THIN_DOWN_FRAME;
  207.     group->box(panel_box);
  208.     group->labeltype(FL_NO_LABEL);
  209.     m_SeqGraphicPane = new CSeqGraphicPane
  210.         (x + Fl::box_dx(panel_box), y + Fl::box_dy(panel_box),
  211.          w - kScrollBarSize - Fl::box_dw(panel_box),
  212.          h - kScrollBarSize - kSliderBarSize - 
  213.          kSearchBarSize - Fl::box_dh(panel_box));
  214.     group->end();
  215.     group->resizable(m_SeqGraphicPane);
  216.     m_SeqGraphicPane->SetWidget(this); // For popups to work
  217.     
  218.     end();
  219.     resizable(group);
  220.     
  221.     // Fill In Data
  222.     m_RangeChoice->add("Molecule");
  223.     m_RangeChoice->add("Range");
  224.     m_RangeChoice->value(0);
  225.     vector<string> names;
  226.     GetFeatConfigList()->GetDescriptions(names, true);
  227.     // m_SeqGraphicPane->GetFeatureNames(names);
  228.     ITERATE(vector<string>, iter, names) {
  229.         m_SearchChoice->add( (*iter).c_str() );
  230.     }
  231.     m_SearchChoice->value(1);
  232.     
  233.     m_PrevButton->deactivate();
  234.     m_NextButton->deactivate();
  235. }
  236. CSeqGraphicWidget::~CSeqGraphicWidget()
  237. {
  238. }
  239. // ISelection interface
  240. void CSeqGraphicWidget::GetSelections(TConstScopedObjects& objs) const
  241. {
  242.     CRef<CScope> scope
  243.         (&m_SeqGraphicPane->GetDataSource()->GetBioseqHandle().GetScope());
  244.     objs.clear();
  245.     {{
  246.         TConstObjects sel_objs =
  247.             m_SeqGraphicPane->GetSelectedObjects();
  248.         ITERATE (TConstObjects, iter, sel_objs) {
  249.             objs.push_back(SConstScopedObject(**iter, *scope));
  250.         }
  251.     }}
  252.     {{
  253.         vector< CRef<CSeq_loc> > sel_objs = GetSelectedSeqLocs();
  254.         ITERATE (vector< CRef<CSeq_loc> >, iter, sel_objs) {
  255.             objs.push_back(SConstScopedObject(**iter, *scope));
  256.         }
  257.     }}
  258. }
  259. void CSeqGraphicWidget::SetSelections(const TConstScopedObjects& objs)
  260. {
  261.     ClearSelection();
  262.     ITERATE (TConstScopedObjects, iter, objs) {
  263.         const CObject* obj = iter->object;
  264.         const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(obj);
  265.         if (loc) {
  266.             SelectSeqLoc(loc);
  267.         } else if (obj) {
  268.             SelectObject(obj);
  269.         }
  270.     }
  271. }
  272. void CSeqGraphicWidget::x_ScrollCB()
  273. {
  274.     m_SeqGraphicPane->Scroll(TSeqPos(m_ScrollX->value()), 
  275.                              TSeqPos(m_ScrollY->value()) );
  276.     if (Fl::event() == FL_RELEASE) {
  277.         // perform the callback to handle visible range change
  278.         do_callback(this, (void*)0);
  279.     }
  280. }
  281. void CSeqGraphicWidget::x_SliderCB()
  282. {
  283.     m_SeqGraphicPane->SetZoomX(m_SlideZoomX->value());
  284.     if (Fl::event() == FL_RELEASE) {
  285.         // perform the callback to handle visible range change
  286.         do_callback(this, (void*)0);
  287.     }
  288. }
  289. void CSeqGraphicWidget::x_SearchCB()
  290. {
  291.     CFltkCursorGuard WAIT_GUARD;
  292.     m_SearchStr = m_SearchInput->value();
  293.     //
  294.     // try numeric first
  295.     //
  296.     try {
  297.         list<string> toks;
  298.         NStr::Split(m_SearchStr, ", -:", toks);
  299.         if (toks.size() <= 2) {
  300.             TSeqPos pos = NStr::StringToInt(toks.front());
  301.             TSeqPos pos_end = pos + 100;
  302.             if (toks.size() == 2) {
  303.                 pos_end = NStr::StringToInt(toks.back());
  304.             } else if (pos >= 100) {
  305.                 pos -= 100;
  306.             }
  307.             m_SeqGraphicPane->ZoomOnRange(TSeqRange(pos, pos_end));
  308.             redraw();
  309.         }
  310.         return;
  311.     }
  312.     catch (...) {
  313.     }
  314.     //
  315.     // fall back to feature label search
  316.     //
  317.     m_SearchCount =
  318.         m_SeqGraphicPane->SearchFeature(m_SearchStr,
  319.                                         m_SearchChoice->text(),
  320.                                         m_RangeChoice->value() == eVisible);
  321.     m_PrevButton->deactivate();
  322.     if (m_SearchCount > 1) 
  323.         m_NextButton->activate();
  324.     else 
  325.         m_NextButton->deactivate();
  326.     
  327.     x_UpdateSearchMsg( 0 );
  328. }
  329. void CSeqGraphicWidget::x_PrevCB()
  330. {
  331.     int pos = m_SeqGraphicPane->SearchFeaturePrev();
  332.     m_NextButton->activate();
  333.     if (pos > 0) 
  334.         m_PrevButton->activate();
  335.     else 
  336.         m_PrevButton->deactivate();
  337.     
  338.     x_UpdateSearchMsg(pos);
  339. }
  340. void CSeqGraphicWidget::x_NextCB()
  341. {
  342.     int pos = m_SeqGraphicPane->SearchFeatureNext();
  343.     m_PrevButton->activate();
  344.     if (pos < m_SearchCount - 1) {
  345.         m_NextButton->activate();
  346.     } else {
  347.         m_NextButton->deactivate();
  348.     }
  349.     x_UpdateSearchMsg(pos);
  350. }
  351.     
  352. void CSeqGraphicWidget::x_UpdateSearchMsg(int pos)
  353. {
  354.     string msg = m_SearchStr + ": " + (m_SearchCount == 0 ? "Nothing found" : 
  355.             "Found: " + NStr::UIntToString(pos+1) + "/" +
  356.             NStr::UIntToString(m_SearchCount) +
  357.             " feature(s)");
  358.     
  359.     m_SearchInput->value( msg.c_str() );
  360. }
  361. void CSeqGraphicWidget::SetZoomX(float value)
  362. {
  363.     m_SeqGraphicPane->SetZoomX(value);
  364. }
  365. void CSeqGraphicWidget::ZoomOnRange(const TSeqRange& range)
  366. {
  367.     m_SeqGraphicPane->ZoomOnRange(range);
  368. }
  369. TSeqRange CSeqGraphicWidget::GetVisibleRange() const
  370. {
  371.     return m_SeqGraphicPane->GetVisibleRange();
  372. }
  373. bool CSeqGraphicWidget::VisibleRangeChanged() const
  374. {
  375.     return m_SeqGraphicPane->VisibleRangeChanged();
  376. }
  377. void CSeqGraphicWidget::ResetVisibleRangeChanged()
  378. {
  379.     m_SeqGraphicPane->ResetVisibleRangeChanged();
  380. }
  381. void CSeqGraphicWidget::SetDataSource(CSeqGraphicDataSource* ds)
  382. {
  383.     m_SeqGraphicPane->SetDataSource(ds);
  384. }
  385. void CSeqGraphicWidget::Print(const CPrintOptions& opts)
  386. {
  387.     _TRACE("CSeqGraphicWidget::Print()");
  388.     m_SeqGraphicPane->Print(opts);
  389. }
  390. // Set/Clear selection
  391. void CSeqGraphicWidget::SelectObject(const CObject* obj)
  392. {
  393.     m_SeqGraphicPane->SelectObject(obj);
  394. }
  395. void CSeqGraphicWidget::SelectSeqLoc(const CSeq_loc* loc)
  396. {
  397.     m_SeqGraphicPane->SelectSeqLoc(loc);
  398. }
  399. void CSeqGraphicWidget::ClearSelection()
  400. {
  401.     m_SeqGraphicPane->ClearSelection();
  402. }
  403.     
  404. // retrieve selected objects from this widget
  405. const TConstObjects& CSeqGraphicWidget::GetSelectedObjects(void) const
  406. {
  407.     return m_SeqGraphicPane->GetSelectedObjects();
  408. }
  409. // retrieve selected seq-locs from this object
  410. // this is only for selections of raw sequence, not for seq-locs
  411. // arising from features, for example.
  412. vector< CRef<CSeq_loc> >
  413. CSeqGraphicWidget::GetSelectedSeqLocs(void) const
  414. {
  415.     vector< CRef<CSeq_loc> > locs;
  416.     const CSeqGraphicPane::TRangeColl& ranges = 
  417.                 m_SeqGraphicPane->GetSelectedSeqRanges();
  418.     ITERATE (CSeqGraphicPane::TRangeColl, iter, ranges) {
  419.         CRef<CSeq_loc> loc(new CSeq_loc());
  420.         loc->SetInt().SetFrom(iter->GetFrom());
  421.         loc->SetInt().SetTo  (iter->GetTo());
  422.         loc->SetInt().SetId().Assign
  423.             (*m_SeqGraphicPane->GetDataSource()->GetBioseqHandle().GetSeqId());
  424.         locs.push_back(loc);
  425.     }
  426.     return locs;
  427. }
  428. void CSeqGraphicWidget::SetConfig(CRef<CSeqGraphicConfig> config)
  429. {
  430.     m_SeqGraphicPane->SetConfig(config);
  431. }
  432. void CSeqGraphicWidget::UpdateConfig()
  433. {
  434.     m_SeqGraphicPane->UpdateConfig();
  435.     redraw();
  436. }
  437. void CSeqGraphicWidget::redraw()
  438. {
  439.     m_SeqGraphicPane->redraw();
  440.     Fl_Group::redraw();
  441. }
  442. END_NCBI_SCOPE
  443. /*
  444.  * ===========================================================================
  445.  * $Log: seqgraphic_widget.cpp,v $
  446.  * Revision 1000.2  2004/06/01 21:12:59  gouriano
  447.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  448.  *
  449.  * Revision 1.13  2004/05/21 22:27:55  gorelenk
  450.  * Added PCH ncbi_pch.hpp
  451.  *
  452.  * Revision 1.12  2004/04/16 14:53:04  dicuccio
  453.  * Pass objects using TConstObjects, not TObjSelections.  Added ISelection
  454.  * interfaces.
  455.  *
  456.  * Revision 1.11  2004/03/12 15:57:32  lebedev
  457.  * Implemented CCommandTarget interface, so the widget
  458.  * can use command maps
  459.  *
  460.  * Revision 1.10  2004/03/11 17:53:06  dicuccio
  461.  * Deprecated typedefs TPosition, TDimension, TIndex, TColor.  Use TSeqRange instead of TRange
  462.  *
  463.  * Revision 1.9  2004/02/13 18:11:32  lebedev
  464.  * Use SeqGraphic config for enabling/disabling viewing options
  465.  *
  466.  * Revision 1.8  2004/02/10 13:15:34  lebedev
  467.  * ISelHandlerHost interface implemented for selections on sequence pane
  468.  *
  469.  * Revision 1.7  2004/01/27 16:14:43  lebedev
  470.  * Methods for working with selections added
  471.  *
  472.  * Revision 1.6  2004/01/20 20:35:31  rsmith
  473.  * Add UpdateConfig method to notify classes when the configuration object has changed.
  474.  *
  475.  * Revision 1.5  2004/01/20 14:07:38  rsmith
  476.  * use feat_config_list.hpp not feat_config.
  477.  *
  478.  * Revision 1.4  2004/01/14 20:31:35  rsmith
  479.  * make feature type menu hierarchical.
  480.  *
  481.  * Revision 1.3  2004/01/06 20:53:05  dicuccio
  482.  * Added CFltkCursorGuard to the search function
  483.  *
  484.  * Revision 1.2  2004/01/05 19:14:18  dicuccio
  485.  * Added ability to jump to sequence location in search bar
  486.  *
  487.  * Revision 1.1  2003/12/22 12:59:01  lebedev
  488.  * Files renamed
  489.  *
  490.  * Revision 1.27  2003/11/20 19:58:57  friedman
  491.  * Changed the zoom slider and the horizontal scrollbar and their callbacks 
  492.  * to invoke the view callback on release only
  493.  *
  494.  * Revision 1.26  2003/11/19 20:37:46  friedman
  495.  * API to detect and reset visible range change
  496.  *
  497.  * Revision 1.25  2003/11/18 20:35:32  rsmith
  498.  * Perculate redraw down to lower levels. Allow config object to live at the plugin level.
  499.  *
  500.  * Revision 1.24  2003/11/13 17:32:51  friedman
  501.  * Fixed compiltion error. GetVisibleRange needs a return statement
  502.  *
  503.  * Revision 1.23  2003/11/13 15:31:53  lebedev
  504.  * Methods to get visible sequence range added
  505.  *
  506.  * Revision 1.22  2003/11/06 20:15:15  dicuccio
  507.  * Added USING_SCOPE(objects) to implementation file
  508.  *
  509.  * Revision 1.21  2003/10/30 13:21:59  lebedev
  510.  * Display of master sequence under selected CDSs and Proteins added
  511.  *
  512.  * Revision 1.20  2003/10/28 15:29:07  lebedev
  513.  * Use new configuration library
  514.  *
  515.  * Revision 1.19  2003/10/24 13:21:53  lebedev
  516.  * ZoomOnRange method added
  517.  *
  518.  * Revision 1.18  2003/10/10 17:21:22  dicuccio
  519.  * Changed box type to thin down frame
  520.  *
  521.  * Revision 1.17  2003/10/09 16:27:09  lebedev
  522.  * Widget redesign: Use independent IRenderable panels for display
  523.  *
  524.  * Revision 1.16  2003/08/18 16:18:33  lebedev
  525.  * New methods to show/hide features added
  526.  *
  527.  * Revision 1.15  2003/08/18 13:44:42  lebedev
  528.  * Changed SearchBar to be the same width as widget
  529.  *
  530.  * Revision 1.14  2003/08/15 19:37:45  dicuccio
  531.  * Reformatting changes for the search bar
  532.  *
  533.  * Revision 1.13  2003/08/14 18:39:47  lebedev
  534.  * Search of features in the widget added.
  535.  * Display panels are fully configurable now. Use feature type and subtype
  536.  * combination to identify and configure features in the display. Some code
  537.  * cleanup.
  538.  *
  539.  * Revision 1.12  2003/07/31 17:06:47  dicuccio
  540.  * Fixed resizable issues
  541.  *
  542.  * Revision 1.11  2003/07/23 19:13:41  dicuccio
  543.  * Added API to retrieve the value of a configured parameter
  544.  *
  545.  * Revision 1.10  2003/07/22 13:40:22  lebedev
  546.  * Highlign master sequence in the alignment display
  547.  * Anchor master sequence. In Lens 10x mode show viewing range on the
  548.  * sequence bar. Improved (faster) drawing of STSs and Repeat regions.
  549.  *
  550.  * Revision 1.9  2003/07/21 19:38:23  dicuccio
  551.  * Removed commented-out code: the explicit deletes in the dtor aren't necessary
  552.  * (Fl_Group takes care of these).
  553.  *
  554.  * Revision 1.8  2003/07/21 19:36:42  dicuccio
  555.  * Externalized selections.  Make sure to call the correct base class when
  556.  * passing to the base class.  Moved some initialization into intializer lists.
  557.  *
  558.  * Revision 1.7  2003/06/20 14:55:21  dicuccio
  559.  * Minor clean-ups.  Changed derivation of the graphical widget from Fl_Gl_Window
  560.  * to CGlCanvas2d
  561.  *
  562.  * Revision 1.6  2003/06/10 12:01:58  lebedev
  563.  * Rendering engine separated from FLTK into it's own class
  564.  *
  565.  * Revision 1.5  2003/06/05 11:22:32  lebedev
  566.  * Prepare to separate display renderer from the widget itself
  567.  *
  568.  * Revision 1.4  2003/06/03 16:20:11  lebedev
  569.  * FLTK calls removed from feature rendering engine. Minor clean-up.
  570.  *
  571.  * Revision 1.3  2003/05/23 10:56:21  lebedev
  572.  * New rendering engine, hit test engine, many other changes
  573.  *
  574.  * Revision 1.2  2003/05/19 16:53:55  dicuccio
  575.  * Better memory management.  Minor rearrangement of #includes
  576.  *
  577.  * Revision 1.1  2003/05/16 16:46:20  lebedev
  578.  * Initial revision
  579.  *
  580.  * ===========================================================================
  581.  */