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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: view_graphic.cpp,v $
  4.  * PRODUCTION Revision 1000.7  2004/06/01 20:59:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.64
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: view_graphic.cpp,v 1000.7 2004/06/01 20:59:43 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    User-modifiable portion of main graphical sequence viewer class
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "view_graphic.hpp"
  41. #include <gui/core/doc_manager.hpp>
  42. #include <gui/core/idocument.hpp>
  43. #include <gui/core/selection_buffer.hpp>
  44. #include <gui/core/version.hpp>
  45. #include <gui/core/view_exception.hpp>
  46. #include <gui/core/plugin_utils.hpp>
  47. #include <gui/plugin/PluginRequest.hpp>
  48. #include <gui/plugin/PluginCommand.hpp>
  49. #include <gui/plugin/PluginCommandSet.hpp>
  50. #include <gui/plugin/PluginValue.hpp>
  51. #include <util/range.hpp>
  52. #include <objmgr/util/sequence.hpp>
  53. #include <gui/widgets/seq_graphic/seqgraphic_conf.hpp>
  54. #include <gui/widgets/seq_graphic/seqgraphic_ds.hpp>
  55. #include <gui/dialogs/config/theme_config_panel.hpp>
  56. // #include <gui/dialogs/config/theme_config_panel2.hpp>
  57. #include <gui/dialogs/config/theme_mediator.hpp>
  58. #include <gui/dialogs/config/theme_dlg.hpp>
  59. // #include <gui/dialogs/config/config_dlg.hpp>
  60. #include <gui/config/settings.hpp>
  61. BEGIN_NCBI_SCOPE
  62. // We include the generated _.cpp file here.  This avoids a nasty bug in some
  63. // versions of gcc in which inline functions are not intantiated.
  64. #include "view_graphic_.cpp"
  65. void CViewGraphic::GetInfo(CPluginInfo& info)
  66. {
  67.     info.Reset();
  68.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  69.                  string(__DATE__) + " " + string(__TIME__),
  70.                  "CViewGraphic", "Graphical View",
  71.                  "Graphical view of sequence and features", "");
  72.     // command info
  73.     CPluginCommandSet& cmds = info.SetCommands();
  74.     CPluginCommand&    args = cmds.AddViewCommand(eViewCommand_new_view);
  75.     args.AddArgument("loc", "Location to display",
  76.                      CSeq_loc::GetTypeInfo());
  77. }
  78. DEFINE_MENU(ToolBarMenu)
  79.     MENU_ITEM(eCmdPrevExon, "Prev. Exon")
  80.     MENU_ITEM(eCmdNextExon, "Next. Exon")
  81. END_MENU()
  82. BEGIN_CMD_MAP(CViewGraphic, CCommandTarget)
  83.     //ON_COMMAND(eCmdPrevExon, &CViewGraphic::x_OnPrevExon)
  84.     //ON_COMMAND(eCmdNextExon, &CViewGraphic::x_OnNextExon)
  85. END_CMD_MAP()
  86. void CViewGraphic::x_OnPrevExon()
  87. {
  88.     m_SeqWidget->OnPrevExon();
  89. }
  90. void CViewGraphic::x_OnNextExon()
  91. {
  92.     m_SeqWidget->OnNextExon();
  93. }
  94. CViewGraphic::CViewGraphic(const CPluginMessage& msg, const string& pool_name)
  95.     : CView()
  96. {
  97.     m_Window.reset(x_CreateWindow());
  98.     m_ToolBar->SetItems(ToolBarMenu);
  99.     m_ToolBar->SetCmdTarget(this);
  100.     AddChildCmdTarget(m_SeqWidget);
  101.     
  102.     // decode the argument
  103.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  104.     const CPluginArg& arg = args["loc"];
  105.     const CSeq_loc& loc = dynamic_cast<const CSeq_loc&> (arg.AsObject());
  106.     const IDocument* doc = arg.GetDocument();
  107.     // assign to our core components
  108.     x_SetDocument(*doc);
  109.     m_SeqId.Reset(&sequence::GetId(loc));
  110.     // create the configuration object.
  111.     CRef<CPluginConfigCache> thePCC
  112.         (&CDocManager::GetSettings().SetPluginConfig());
  113.     CRef<CSeqGraphicConfig> configSettings(new CSeqGraphicConfig(thePCC));
  114.     x_SetConfig(configSettings);
  115.  
  116.     // create our data source
  117.     m_DataSource.Reset
  118.         (new CSeqGraphicDataSource(m_Document->GetScope(), *m_SeqId));
  119.     m_SeqWidget->SetDataSource(m_DataSource);
  120.     // set our visible range
  121.     CRef<CSeq_loc> seq_loc(new CSeq_loc);
  122.     // get sequence range
  123.     TSeqRange range = loc.GetTotalRange();
  124.     m_SeqWidget->ZoomOnRange(range);
  125.     // Set  seq loc with the range 
  126.     seq_loc->SetInt().SetFrom(range.GetFrom());
  127.     seq_loc->SetInt().SetTo  (range.GetTo());
  128.     seq_loc->SetId(*m_SeqId);
  129.     SetVisibleRange(*seq_loc);
  130.     // create the dynamic menu managers
  131.     m_ViewMenuMgr.reset
  132.         (new CViewMenuMgr(m_MenuBar, "View", m_SeqWidget, pool_name));
  133.     m_ToolMenuMgr.reset
  134.         (new CAlgoMenuMgr(m_MenuBar, "Tools", m_SeqWidget));
  135. }
  136. void CViewGraphic::OnDocumentChanged()
  137. {
  138.     // if our document has changed, we clear our selections because they
  139.     // may no longer be valid
  140.     SetSelBuffer().Clear();
  141.     // set our window title as well
  142.     SetTitle(x_GetTitle(m_DataSource->GetBioseqHandle()));
  143.     m_SeqWidget->redraw();
  144.     //
  145.     // fill our dynamic menus
  146.     //
  147.     x_UpdateDynMenus();
  148. }
  149. void CViewGraphic::OnSelectionChanged(const CSelectionBuffer& buf)
  150. {
  151.     SetSelBuffer().Copy(buf);
  152.     m_SeqWidget->ClearSelection();
  153.     TConstScopedObjects sels = GetSelBuffer().DecomposeToPairs();
  154.     ITERATE (TConstScopedObjects, iter, sels) {
  155.         SConstScopedObject cso = *iter;
  156.         const IDocument* doc = CDocManager::GetDocumentFromScope(*cso.scope);
  157.         const CObject* obj   = cso.object;
  158.         // only accept selections for the current document
  159.         if ( doc != m_Document) {
  160.             continue;
  161.         }
  162.         // select ranges on sequence
  163.         const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(obj);
  164.         if (loc) {
  165.             m_SeqWidget->SelectSeqLoc(loc);
  166.         } else {
  167.             m_SeqWidget->SelectObject(obj);
  168.         }
  169.     }
  170.     //
  171.     // fill our dynamic menus
  172.     //
  173.     x_UpdateDynMenus();
  174. }
  175. void CViewGraphic::OnVisibleRangeChanged(const CSeq_loc& loc)
  176. {
  177.     SetVisibleRange(loc);
  178. }
  179. void CViewGraphic::x_UpdateDynMenus()
  180. {
  181.     // view menu first
  182.     m_ToolMenuMgr->Clear();
  183.     m_ViewMenuMgr->Clear();
  184.     if ( !GetSelBuffer() ) {
  185.         SetSelBuffer().AddSelection(GetDocument(), *m_SeqId);
  186.     }
  187.     m_ViewMenuMgr->AddActiveViews(GetDocument());
  188.     m_ViewMenuMgr->AddNewViews();
  189.     m_ToolMenuMgr->AddAlgoMenu();
  190.     // m_PopupMenu was "eating" mouse move events. The tooltips never come up in the widget.
  191.     //m_PopupMenu->copy(m_MenuBar->menu());
  192. }
  193. const string& CViewGraphic::GetTitle(void) const
  194. {
  195.     static string s_str("Graphical View");
  196.     return s_str;
  197. }
  198. void CViewGraphic::SetVisibleRange(const CSeq_loc& loc)
  199. {
  200.     // call the base class
  201.     CView::SetVisibleRange(loc);
  202.     // do our widget-specific things
  203.     TSeqRange range = loc.GetTotalRange();
  204.     m_SeqWidget->ZoomOnRange(range);
  205.     m_SeqWidget->redraw();
  206.     //x_UpdateDynMenus();
  207. }
  208. void CViewGraphic::SetFeatureFocus(const CSeq_feat& feat)
  209. {
  210. }
  211. void CViewGraphic::x_Print(const CPrintOptions& opts)
  212. {
  213.     m_SeqWidget->Print(opts);
  214. }
  215. void CViewGraphic::x_PanelCallback()
  216. {
  217.     vector< CRef<CSeq_loc> > locs = m_SeqWidget->GetSelectedSeqLocs();
  218.     TConstObjects objs = m_SeqWidget->GetSelectedObjects();
  219.     bool update_menus = false;
  220.     if (locs.size()  ||  objs.size()) {
  221.         // retrieve selections
  222.         // selections come in two forms: sets of layout objects and sets of
  223.         // seq-locs representing selected ranges
  224.         SetSelBuffer().Clear();
  225.         // seq-locs first
  226.         ITERATE(vector< CRef<CSeq_loc> >, loc_iter, locs) {
  227.             SetSelBuffer().AddSelection(GetDocument(), **loc_iter);
  228.         }
  229.         // now, selected layout objects
  230.         ITERATE(TConstObjects, obj_iter, objs) {
  231.             const CObject& obj = obj_iter->GetObject();
  232.             SetSelBuffer().AddSelection(GetDocument(), obj);
  233.         }
  234.         update_menus = true;
  235.     } else if (GetSelBuffer()) {
  236.         SetSelBuffer().Clear();
  237.         update_menus = true;
  238.     }
  239.     // Handle a visible range change
  240.     if (m_SeqWidget->VisibleRangeChanged()) {
  241.         TSeqRange range = m_SeqWidget->GetVisibleRange();
  242.         // Set  seq loc with the range 
  243.         CRef<CSeq_loc> loc(new CSeq_loc);
  244.         loc->SetInt().SetFrom(range.GetFrom());
  245.         loc->SetInt().SetTo  (range.GetTo());
  246. loc->SetId(*m_SeqId);
  247.         SetVisibleRange(*loc);
  248.         // Post a message the the visible range changed
  249.         PostVisibleRangeChanged(GetVisibleRange());
  250.         // Reset the panel's VisibleRangeChanged flag
  251.         m_SeqWidget->ResetVisibleRangeChanged();
  252.         update_menus = true;
  253.     }     
  254.     if (update_menus) {
  255.         x_UpdateDynMenus();
  256.         PostSelectionChanged(GetSelBuffer());
  257.     }
  258. }
  259. void CViewGraphic:: x_OnZoomToSequence()
  260. {
  261.     m_SeqWidget->SetZoomX( 1.0f );
  262. }
  263. void CViewGraphic:: x_OnFitToWindow()
  264. {
  265.     m_SeqWidget->SetZoomX( 0.0f );
  266. }
  267. void CViewGraphic::x_SetConfig(CRef<CSeqGraphicConfig> config)
  268. {
  269.     m_ConfigSettings = config;
  270.     m_SeqWidget->SetConfig(m_ConfigSettings);
  271. }
  272. void CViewGraphic::x_OnPreferences()
  273. {
  274.     // create panel
  275.     //CFeatConfigPanel  preference_panel;
  276.     CThemeConfigPanel   preference_panel;
  277.     // CThemeConfigPanel2   preference_panel;
  278.     // preference_panel.SetLayoutDirection(CThemeConfigPanel2::eLayoutDirection_Vertical);
  279.       
  280.     // create configuration mediator from data set and panel
  281.     // CFeatConfigMediator preference_mediator(*m_ConfigSettings, preference_panel);
  282.     CThemeMediator preference_mediator(*m_ConfigSettings, preference_panel);
  283.     // create and display dialog given the mediator.
  284.     // CConfigDlg preference_dialog(preference_mediator);
  285.     CThemeDlg  preference_dialog(preference_mediator);
  286.     EDialogReturnValue dlg_ret = preference_dialog.ShowModal();
  287.     if (eCancel == dlg_ret) {
  288.         return;
  289.     }
  290.     // when dialog is done, save values to persistent storage (plugin config cache file).
  291.     CDocManager::GetSettings().SavePluginConfig();
  292.     
  293.     // redraw and change settings to show the changes in the preferences.
  294.     m_SeqWidget->UpdateConfig();
  295. }
  296. END_NCBI_SCOPE
  297. /*
  298.  * ===========================================================================
  299.  * $Log: view_graphic.cpp,v $
  300.  * Revision 1000.7  2004/06/01 20:59:43  gouriano
  301.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.64
  302.  *
  303.  * Revision 1.64  2004/05/21 22:27:49  gorelenk
  304.  * Added PCH ncbi_pch.hpp
  305.  *
  306.  * Revision 1.63  2004/04/16 14:45:01  dicuccio
  307.  * Code clean-up.  Use TConstObjects for passing / retrieving selections.  Use seq
  308.  * graphic widget for marshalling selections
  309.  *
  310.  * Revision 1.62  2004/04/07 13:05:10  dicuccio
  311.  * Changed view API - require CPluginMessage instead of CPluginArgSet
  312.  *
  313.  * Revision 1.61  2004/03/12 16:01:39  lebedev
  314.  * Command map added. Ability to move between selected feature exon added.
  315.  *
  316.  * Revision 1.60  2004/03/11 17:46:58  dicuccio
  317.  * Use TSeqRange instead of TRange
  318.  *
  319.  * Revision 1.59  2004/02/17 20:35:28  rsmith
  320.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  321.  *
  322.  * Revision 1.58  2004/02/02 18:48:00  rsmith
  323.  * commented out alternate preference panel
  324.  *
  325.  * Revision 1.57  2004/01/27 16:16:26  lebedev
  326.  * Interfaces for view to view communication implemented
  327.  *
  328.  * Revision 1.56  2004/01/20 20:36:36  rsmith
  329.  * Call the widget's UpdateConfig, not just redraw, after changing the configuration object.
  330.  *
  331.  * Revision 1.55  2004/01/20 14:11:19  rsmith
  332.  * configuration done with a Theme dialog.
  333.  *
  334.  * Revision 1.54  2003/12/30 15:03:21  dicuccio
  335.  * Fixed for change in file locations
  336.  *
  337.  * Revision 1.53  2003/12/29 20:18:05  rsmith
  338.  * (correction to previous commit log) Move config settings initialization higher in the constructor since other members cstrs depend on it.
  339.  *
  340.  * Revision 1.52  2003/12/29 20:09:39  rsmith
  341.  * add feat_config_list include (NOT: See next log.)
  342.  *
  343.  * Revision 1.51  2003/12/22 19:31:36  dicuccio
  344.  * Lots of changes.  Added better handling of messages received from other views.
  345.  * Initial attempt at passing in selections (not entirely working)
  346.  *
  347.  * Revision 1.50  2003/12/22 13:02:18  lebedev
  348.  * Plugin updated to use new datasource
  349.  *
  350.  * Revision 1.49  2003/11/27 20:22:05  ucko
  351.  * Don't try to introduce const in static_cast<>.
  352.  *
  353.  * Revision 1.48  2003/11/26 19:48:40  friedman
  354.  * Added handling rceiving visible range change
  355.  *
  356.  * Revision 1.47  2003/11/24 15:45:44  dicuccio
  357.  * Renamed CVersion to CPluginVersion
  358.  *
  359.  * Revision 1.46  2003/11/19 20:43:59  friedman
  360.  * Added detecting visible range change and posting a message
  361.  *
  362.  * Revision 1.45  2003/11/18 20:44:32  rsmith
  363.  * Add configuration object and preference dialog.
  364.  *
  365.  * Revision 1.44  2003/11/04 17:49:25  dicuccio
  366.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  367.  * CPluginCommand/CPluginReply
  368.  *
  369.  * Revision 1.43  2003/11/04 12:51:28  friedman
  370.  * Added event message pool callbacks for the document all-view message pool.
  371.  *
  372.  * Revision 1.42  2003/10/27 20:03:42  dicuccio
  373.  * Rearranged Update() to be consistent
  374.  *
  375.  * Revision 1.41  2003/10/27 16:15:17  dicuccio
  376.  * Implemented initial zoom state
  377.  *
  378.  * Revision 1.40  2003/10/16 15:51:24  dicuccio
  379.  * Set the title to something meaningful - include the sequence title and
  380.  * accession.  Only update dynamic menus if selections or document have changed.
  381.  * Properly set dynamic menus to include information for the viewed seq-id, not
  382.  * the document's seq-id.
  383.  *
  384.  * Revision 1.39  2003/10/15 13:42:31  dicuccio
  385.  * Cleaned up the title - now reflects the actual sequence being viewed
  386.  *
  387.  * Revision 1.38  2003/10/07 13:47:06  dicuccio
  388.  * Renamed CPluginURL* to CPluginValue*
  389.  *
  390.  * Revision 1.37  2003/09/30 19:53:53  dicuccio
  391.  * Disable popup menu (again!) pending crash fix
  392.  *
  393.  * Revision 1.36  2003/09/30 15:18:45  dicuccio
  394.  * Re-enabled popup menu
  395.  *
  396.  * Revision 1.35  2003/09/24 18:27:35  dicuccio
  397.  * Uncommented recreation of data source on document change
  398.  *
  399.  * Revision 1.34  2003/09/04 14:54:22  dicuccio
  400.  * Use IDocument instead of CDocument.  Changed APIs to match changes in IView
  401.  *
  402.  * Revision 1.33  2003/08/18 16:19:32  lebedev
  403.  * Change viewer to use new methods for showing/hiding features
  404.  *
  405.  * Revision 1.32  2003/07/23 19:13:13  dicuccio
  406.  * Added menu options for fconfiguring the view
  407.  *
  408.  * Revision 1.31  2003/07/21 19:33:47  dicuccio
  409.  * Added handling of selections in GUI - use menus
  410.  *
  411.  * Revision 1.30  2003/06/25 17:03:00  dicuccio
  412.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  413.  * implementation file.  Lots of #include file clean-ups.
  414.  *
  415.  * Revision 1.29  2003/06/20 19:51:27  dicuccio
  416.  * Fixed compiler error on MSVC related to operator&&
  417.  *
  418.  * Revision 1.28  2003/06/20 14:53:52  dicuccio
  419.  * Revised plugin registration - moved GetInfo() into the plugin handler
  420.  *
  421.  * Revision 1.27  2003/05/19 13:44:42  dicuccio
  422.  * Moved gui/core/plugin/ --> gui/plugin.  Merged core libraries into
  423.  * libgui_core.so.  Revamped graphical view to use Vlad Lebedev's new widget.
  424.  *
  425.  * Revision 1.26  2003/04/30 13:21:19  dicuccio
  426.  * Added callback for expanded view.  Make sure that the visible range gets
  427.  * propagated correctly
  428.  *
  429.  * Revision 1.25  2003/04/29 14:54:44  dicuccio
  430.  * Reworked FLUID-generated code: better memory management, more explicit
  431.  * control over the constructor
  432.  *
  433.  * Revision 1.24  2003/04/24 16:41:55  dicuccio
  434.  * Updated to reflect changes in plugin, IDocument API
  435.  *
  436.  * Revision 1.23  2003/03/17 14:54:15  dicuccio
  437.  * Changed base class CView - added member variable for FLTK gui component for
  438.  * child windows, which is now maintained via an auto_ptr<>.  Eliminated
  439.  * Show()/Hide() as a pure virtual requirement.
  440.  *
  441.  * Revision 1.22  2003/03/03 14:55:18  dicuccio
  442.  * Remiplemented using visible range in base class
  443.  *
  444.  * Revision 1.21  2003/02/20 19:49:59  dicuccio
  445.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  446.  * over to use new plugin architecture.
  447.  *
  448.  * Revision 1.20  2003/01/16 14:55:22  dicuccio
  449.  * Added CFeaturePanel::Clear().  Fixed issue with some panels not being
  450.  * properly cleared on update.
  451.  *
  452.  * Revision 1.19  2003/01/15 21:10:40  dicuccio
  453.  * Large updates.  Added support for rendering all feature types.  Separated
  454.  * features into distinct panels based on types.  Added ability to specify
  455.  * linking / packing as menu options.
  456.  *
  457.  * Revision 1.18  2003/01/13 13:10:08  dicuccio
  458.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  459.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  460.  *
  461.  * Revision 1.17  2003/01/09 14:50:41  dicuccio
  462.  * Use 'const CBioseq_Handle&' instead of 'CBioseq_Handle&'
  463.  *
  464.  * Revision 1.16  2002/12/20 19:52:22  dicuccio
  465.  * Cnaged TRange::SetFrom()/TRange::SetTo() --> TRange::Set()
  466.  *
  467.  * Revision 1.15  2002/12/20 19:22:52  dicuccio
  468.  * Lots of changes to the menus.  Standardized the menu syntax across all views.
  469.  * Changed to use new dynamic menu managers.
  470.  *
  471.  * Revision 1.14  2002/12/19 18:18:20  dicuccio
  472.  * Fixed thinko: don't clear the selection buffer unless the underlying document
  473.  * changes.
  474.  *
  475.  * Revision 1.13  2002/12/13 13:18:52  dicuccio
  476.  * Added work-around for inlining problems in some versions of gcc: directly
  477.  * include a FLUID-generated '*_.cpp' file in the corresponding '*.cpp' and
  478.  * remove this file from the build.  Thanks Aaron!
  479.  *
  480.  * Revision 1.12  2002/12/12 15:23:49  dicuccio
  481.  * Changed SetSelBuffer() -> non-const GetSelBuffer().
  482.  *
  483.  * Revision 1.11  2002/12/09 20:37:14  dicuccio
  484.  * Switch to using CSeq_id::GetStringDescr()
  485.  *
  486.  * Revision 1.10  2002/12/09 15:41:30  dicuccio
  487.  * When changing the selection past the end of the controlled sequence, must
  488.  * preserve the size of the selection (no shrinking)
  489.  *
  490.  * Revision 1.9  2002/11/29 16:09:37  dicuccio
  491.  * Use USING_SCOPE instead of BEGIN/END_SCOPE for out-of-scope classes.  Fixed
  492.  * function overload resolution issues in Windows.
  493.  *
  494.  * Revision 1.8  2002/11/29 15:35:30  dicuccio
  495.  * Modified to use gui/utils.  Moved utils.[h,c]pp into gui/utils.  Split
  496.  * utils.[h,c]pp into four files - feature.[h,c]pp and utils.[h,c]pp.
  497.  *
  498.  * Revision 1.7  2002/11/27 17:38:06  lebedev
  499.  * Switched to Sequence Icon View Widget
  500.  *
  501.  * Revision 1.6  2002/11/26 17:15:25  lebedev
  502.  * Switched to SeqInfo widget in graphics viewer
  503.  *
  504.  * Revision 1.5  2002/11/22 18:05:34  dicuccio
  505.  * Fixed memory leak - must remember to delete main window.
  506.  *
  507.  * Revision 1.4  2002/11/19 17:11:13  dicuccio
  508.  * Standardized creation of title.
  509.  *
  510.  * Revision 1.3  2002/11/09 20:57:08  dicuccio
  511.  * Performance improvements:  Implemented smarter widget update (use update
  512.  * flags to specify update conditions); use a more intuitive (and flexible)
  513.  * mechanism to obtain features from the object manager.
  514.  *
  515.  * Revision 1.2  2002/11/08 02:14:42  dicuccio
  516.  * Minor code clean-ups (reformat text, eliminate dead variables, favor NCBI
  517.  * macros)
  518.  *
  519.  * Revision 1.1  2002/11/07 16:27:27  dicuccio
  520.  * Initial revision
  521.  *
  522.  * ===========================================================================
  523.  */