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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: feat_table.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 21:00:30  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.34
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: feat_table.cpp,v 1000.3 2004/06/01 21:00: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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    CFeatTable -- extends CListPanel to provide feature-specific options.
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "feat_table.hpp"
  41. #include <gui/utils/fltk_utils.hpp>
  42. #include <gui/objutils/utils.hpp>
  43. #include <objmgr/feat_ci.hpp>
  44. #include <objects/seqloc/Seq_bond.hpp>
  45. #include <objects/seqloc/Seq_interval.hpp>
  46. #include <objects/seqloc/Seq_loc.hpp>
  47. #include <objects/seqloc/Seq_loc_equiv.hpp>
  48. #include <objects/seqloc/Seq_point.hpp>
  49. #include <objmgr/util/feature.hpp>
  50. #include <objmgr/util/sequence.hpp>
  51. #include <FL/fl_draw.H>
  52. BEGIN_NCBI_SCOPE
  53. CFeatTable::CFeatTable(int x, int y, int w, int h, const char* label)
  54.     : CTablePanel<CMappedFeat>(x, y, w, h, label)
  55. {
  56.     //
  57.     // set up the actual columns for our internal data
  58.     //
  59.     SetColumn(eTitle,     "Title",     eString,  FL_ALIGN_LEFT,  0.5f);
  60.     SetColumn(eType,      "Type",      eString,  FL_ALIGN_LEFT,  0.15f);
  61.     SetColumn(eFrom,      "From",      eNumeric, FL_ALIGN_RIGHT, 0.1f);
  62.     SetColumn(eTo,        "To",        eNumeric, FL_ALIGN_RIGHT, 0.1f);
  63.     //SetColumn(eIntervals, "Intervals", eString,  FL_ALIGN_LEFT,  0.5f);
  64.     SetColumn(eStrand,    "Strand",    eString,  FL_ALIGN_LEFT,  0.1f);
  65.     // also set up the column types in our set of filters
  66.     m_Filters.SetColType(eTitle,     CFilter::eString);
  67.     m_Filters.SetColType(eType,      CFilter::eString);
  68.     m_Filters.SetColType(eFrom,      CFilter::eNumeric);
  69.     m_Filters.SetColType(eTo,        CFilter::eNumeric);
  70.     //m_Filters.SetColType(eIntervals, CFilter::eString);
  71.     m_Filters.SetColType(eStrand,    CFilter::eString);
  72.     // set the default visible range method
  73.     m_VisibleRangeMethod = eScrollTo;
  74.     /**
  75.     // set the default virtual columns
  76.     // this defines the order in which all the columns appear
  77.     m_VirtCols.push_back(eTitle);
  78.     m_VirtCols.push_back(eType);
  79.     m_VirtCols.push_back(eFrom);
  80.     m_VirtCols.push_back(eTo);
  81.     **/
  82. }
  83. CFeatTable::~CFeatTable()
  84. {
  85. }
  86. void CFeatTable::Update(const CBioseq_Handle& handle)
  87. {
  88.     Clear();
  89.     //
  90.     // here, we just iterate all features and sort out the types ourselves
  91.     //
  92.     CLayoutFeat::TFeatList feats;
  93.     CSeqUtils::GetFeatures(handle, TSeqRange(0, 0),
  94.                            CSeqFeatData::e_not_set, feats);
  95.     int row = 0;
  96.     m_TotalFeats = 0;
  97.     m_FilteredFeats = 0;
  98.     m_InvFeats.clear();
  99.     vector<TSeqRange> intervals;
  100.     Reserve(feats.size(), eMaxCols);
  101.     ITERATE (CLayoutFeat::TFeatList, feat_iter, feats) {
  102.         const CLayoutFeat& feat = **feat_iter;
  103.         const CSeq_loc& loc  = feat.GetLocation();
  104.         // record the range of this feature
  105.         CRange<TSeqPos> range = loc.GetTotalRange();
  106.         // Check if in visible range for the entirely 
  107.         //  contained and intersection methods
  108.         if (!x_InVisibleRange(range)) {
  109.             continue;
  110.         }
  111.         SetCell(row, eFrom, NStr::IntToString(range.GetFrom()));
  112.         SetCell(row, eTo,   NStr::IntToString(range.GetTo()));
  113.         SetCell(row, eType).erase();
  114.         SetCell(row, eTitle).erase();
  115.         feature::GetLabel(feat.GetFeature(),
  116.                           &SetCell(row, eType), feature::eType);
  117.         feature::GetLabel(feat.GetFeature(),
  118.                           &SetCell(row, eTitle), feature::eContent,
  119.                           &handle.GetScope());
  120.         switch (sequence::GetStrand(loc)) {
  121.         case eNa_strand_unknown:
  122.             SetCell(row, eStrand, "?");
  123.             break;
  124.         case eNa_strand_plus:
  125.             SetCell(row, eStrand, "+");
  126.             break;
  127.         case eNa_strand_minus:
  128.             SetCell(row, eStrand, "-");
  129.             break;
  130.         case eNa_strand_both:
  131.             SetCell(row, eStrand, "+-");
  132.             break;
  133.         case eNa_strand_both_rev:
  134.             SetCell(row, eStrand, "+- (rev)");
  135.             break;
  136.         case eNa_strand_other:
  137.             SetCell(row, eStrand, "other");
  138.             break;
  139.         }
  140.         /**
  141.         // extract a list of intervals from this feature
  142.         intervals = feat.GetIntervals();
  143.         string str;
  144.         ITERATE (vector<TSeqRange>, r_iter, intervals) {
  145.             if ( !str.empty() ) {
  146.                 str += ", ";
  147.             }
  148.             str += NStr::IntToString(r_iter->GetFrom());
  149.             str += "..";
  150.             str += NStr::IntToString(r_iter->GetTo());
  151.         }
  152.         SetCell(row, eIntervals) = str;
  153.         **/
  154.         // filter this row
  155.         ++m_TotalFeats;
  156.         if (!m_Filters.Filter(GetRow(row))) {
  157.             continue;
  158.         }
  159.         ++m_FilteredFeats;
  160.         SetData(row) = feat.GetMappedFeature();
  161.         CConstRef<CSeq_feat> ref(&feat.GetMappedFeature().GetOriginalFeature());
  162.         m_InvFeats[ref] = row;
  163.         ++row;
  164.     }
  165.     // Check if Visible Range Scroll To method is set
  166.     if (m_VisibleRangeMethod == eScrollTo) {
  167.         x_ScrollToVisibleRange();
  168.     }
  169.     redraw();
  170. }
  171. void CFeatTable::ClearSelections()
  172. {
  173.     select_all_rows(0);
  174. }
  175. void CFeatTable::SelectFeature(const CSeq_feat& feat)
  176. {
  177.     TInvFeatMap::iterator iter = m_InvFeats.find(CConstRef<CSeq_feat>(&feat));
  178.     if (iter == m_InvFeats.end()) {
  179.         return;
  180.     }
  181.     int idx = iter->second;
  182.     select_row(idx);
  183. }
  184. void CFeatTable::SetVisibleRange(const CSeq_loc& loc)
  185. {
  186.     m_VisibleRange = loc.GetTotalRange();
  187. }
  188. int CFeatTable::handle(int event)
  189. {
  190.     switch (event) {
  191.     case FL_PUSH:
  192.         // we ignore events bound to our internal popup state
  193.         // this removes an artifact with selection mode - it protects our
  194.         // selections when we popup our context menu
  195.         if (CFltkEvent::GetProcessedEvent() != CFltkEvent::ePopupState) {
  196.             break;
  197.         }
  198.         //ShowColSelectDlg();
  199.         return 1;
  200.     default:
  201.         break;
  202.     }
  203.     return CTablePanel< CMappedFeat >::handle(event);
  204. }
  205. bool CFeatTable::x_InVisibleRange(TSeqRange range) 
  206. {
  207.     if (m_VisibleRange.Empty()) {
  208.         return true;
  209.     }
  210.     switch (m_VisibleRangeMethod) {
  211.         case eEntirelyContained:
  212.             if (range.GetFrom() < m_VisibleRange.GetFrom() ||
  213.                     range.GetTo()   > m_VisibleRange.GetTo()) {
  214.                 return false;
  215.             }
  216.             break;
  217.         case eIntersection:
  218.             if (range.GetTo() < m_VisibleRange.GetFrom() ||
  219.                     range.GetFrom() > m_VisibleRange.GetTo()) {
  220.                 return false;
  221.             }
  222.             break;
  223.     }
  224.     return true;
  225. }
  226. void CFeatTable::x_ScrollToVisibleRange()
  227. {
  228.     
  229.     if (m_VisibleRange.Empty()) {
  230.         return;
  231.     }
  232.     size_t table_from = 
  233.         NStr::StringToInt(GetCell(row_position(), eFrom));
  234.     if (table_from < m_VisibleRange.GetFrom()) {
  235.         x_ScrollDownToVisibleRange();
  236.     } else if (table_from > m_VisibleRange.GetFrom()) {
  237.         x_ScrollUpToVisibleRange();
  238.     }
  239. }
  240. void CFeatTable::x_ScrollDownToVisibleRange()
  241. {
  242.     for (size_t i = row_position() + 1;  i < GetRows();  i++) {
  243.         size_t table_from = NStr::StringToInt(GetCell(i, eFrom));
  244.         if (table_from >= m_VisibleRange.GetFrom()) {
  245.             row_position(i);
  246.             return;
  247.         }
  248.     } 
  249.     // set to last row
  250.     row_position(GetRows() - 1);
  251. }
  252. void CFeatTable::x_ScrollUpToVisibleRange()
  253. {
  254.     for (int i = row_position() - 1; i >= 0; i--) {
  255.         size_t table_from = NStr::StringToInt(GetCell(i, eFrom));
  256.         if (table_from < m_VisibleRange.GetFrom()) {
  257.             row_position(i + 1);
  258.             return;
  259.         }
  260.     } 
  261.     // set to first row
  262.     row_position(0);
  263. }
  264. /**
  265. void CFeatTable::get_style(Flv_Style& s, int row, int col)
  266. {
  267.     // do our base class stuff
  268.     CListPanel< CMappedFeat >::get_style(s, row, col);
  269.     if ( row >= 0  &&  (row / 5) % 2 == 1  &&  !row_selected(row)) {
  270.         s.background(fl_rgb_color(220, 220, 220));
  271.     }
  272. }
  273. **/
  274. END_NCBI_SCOPE
  275. /*
  276.  * ===========================================================================
  277.  * $Log: feat_table.cpp,v $
  278.  * Revision 1000.3  2004/06/01 21:00:30  gouriano
  279.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.34
  280.  *
  281.  * Revision 1.34  2004/05/21 22:27:49  gorelenk
  282.  * Added PCH ncbi_pch.hpp
  283.  *
  284.  * Revision 1.33  2004/05/07 15:35:37  dicuccio
  285.  * Fixed unsigned/signed comparison
  286.  *
  287.  * Revision 1.32  2004/05/03 13:30:49  dicuccio
  288.  * gui/utils --> gui/objutils where needed
  289.  *
  290.  * Revision 1.31  2004/03/11 17:47:22  dicuccio
  291.  * Use TSeqRange instead of TRange
  292.  *
  293.  * Revision 1.30  2004/01/20 18:17:52  dicuccio
  294.  * Changed to match new API in CTablePanel
  295.  *
  296.  * Revision 1.29  2004/01/06 20:16:19  dicuccio
  297.  * Dropped intervals list (temporarily) - it crowds the view
  298.  *
  299.  * Revision 1.28  2003/12/30 15:03:54  dicuccio
  300.  * Added ability to pass selections into feature table
  301.  *
  302.  * Revision 1.27  2003/12/22 19:32:23  dicuccio
  303.  * Lots of code clean-up.  Changed to match new APIs in IView.  Added first pass
  304.  * at processing selections (not entirely working)
  305.  *
  306.  * Revision 1.26  2003/12/22 18:15:07  friedman
  307.  * Added various visible range methods and the selection of a method
  308.  * through the preference menu selection and dialog.
  309.  *
  310.  * Revision 1.25  2003/12/04 18:14:47  dicuccio
  311.  * Changed to match API change in CTablePanel
  312.  *
  313.  * Revision 1.24  2003/11/19 20:45:28  friedman
  314.  * Added handling a visible range change event
  315.  *
  316.  * Revision 1.23  2003/09/29 15:41:09  dicuccio
  317.  * Deprecated gui/scope.hpp.  Merged gui/core/types.hpp into gui/types.hpp.  Made
  318.  * all menu bars flat (used FL_FLAT_BOX)
  319.  *
  320.  * Revision 1.22  2003/09/04 14:54:23  dicuccio
  321.  * Use IDocument instead of CDocument.  Changed APIs to match changes in IView
  322.  *
  323.  * Revision 1.21  2003/08/18 14:45:50  dicuccio
  324.  * Changed nales: CFeature -> CLayoutFeat; CAlignment -> CLayoutAlign; CGraph ->
  325.  * CLayoutGraph; CProtProduct -> CLayoutProtProd.
  326.  *
  327.  * Revision 1.20  2003/07/31 17:04:34  dicuccio
  328.  * Changed type stored by feature table view - use CMappedFeat instead of CFeatue
  329.  * (less memory consumption)
  330.  *
  331.  * Revision 1.19  2003/07/28 11:51:49  dicuccio
  332.  * Rewrote CTablePanel<> to be more flexible and better contained.  Added standard
  333.  * multicolumn list dialog.  Deprecated use of COutputDlg.
  334.  *
  335.  * Revision 1.18  2003/07/25 13:44:48  dicuccio
  336.  * Replaced Flv_Table with Fl_Table
  337.  *
  338.  * Revision 1.17  2003/07/11 12:38:45  dicuccio
  339.  * Altered feature table to use smarter feature retrieval
  340.  *
  341.  * Revision 1.16  2003/06/02 16:06:24  dicuccio
  342.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  343.  *     - src/objects/asn2asn --> arc/app/asn2asn
  344.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  345.  *     - src/objects/objmgr --> src/objmgr
  346.  *     - src/objects/util --> src/objmgr/util
  347.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  348.  *     - src/objects/flat --> src/objtools/flat
  349.  *     - src/objects/validator --> src/objtools/validator
  350.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  351.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  352.  * replaces the three libmmdb? libs.
  353.  *
  354.  * Revision 1.15  2003/05/19 13:46:51  dicuccio
  355.  * Moved gui/core/plugin/ --> gui/plugin/.  Merged core libraries into
  356.  * libgui_core.so
  357.  *
  358.  * Revision 1.14  2003/05/16 18:50:34  dicuccio
  359.  * Added smarter retrieval of features
  360.  *
  361.  * Revision 1.13  2003/04/19 14:20:00  ucko
  362.  * remaining occurrences of iterate -> ITERATE
  363.  *
  364.  * Revision 1.12  2003/03/21 17:13:59  dicuccio
  365.  * Moved fltk_utils --> gui/utils
  366.  *
  367.  * Revision 1.11  2003/03/11 15:23:30  kuznets
  368.  * iterate -> ITERATE
  369.  *
  370.  * Revision 1.10  2003/03/03 14:58:56  dicuccio
  371.  * Changed to use visible range from the base class.  Added an explicit setter for
  372.  * the visible range
  373.  *
  374.  * Revision 1.9  2003/02/20 19:50:00  dicuccio
  375.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  376.  * over to use new plugin architecture.
  377.  *
  378.  * Revision 1.8  2003/02/10 18:54:59  dicuccio
  379.  * Fixed compilation issues relating to changes in CFeat_CI API
  380.  *
  381.  * Revision 1.7  2003/01/17 21:08:58  dicuccio
  382.  * Fill in feature strand value
  383.  *
  384.  * Revision 1.6  2003/01/13 13:10:09  dicuccio
  385.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace ncbi.
  386.  * Moved all FLUID-generated code into namespace ncbi.
  387.  *
  388.  * Revision 1.5  2003/01/09 14:50:42  dicuccio
  389.  * Use 'const CBioseq_Handle&' instead of 'CBioseq_Handle&'
  390.  *
  391.  * Revision 1.4  2003/01/08 14:58:47  dicuccio
  392.  * Major overhaul.  Added column selection dialog to base class - moved out of
  393.  * this class.  Added ability to sort columns based on menu selections.  Added
  394.  * ability to filter features based on a wide range of criteria.
  395.  *
  396.  * Revision 1.3  2003/01/03 17:27:44  dicuccio
  397.  * Added ability to select columns for viewing and sorting
  398.  *
  399.  * Revision 1.2  2002/12/30 20:51:10  dicuccio
  400.  * WTweaks for compiling on Windows
  401.  *
  402.  * Revision 1.1  2002/12/30 18:49:41  dicuccio
  403.  * Initial revision
  404.  *
  405.  * ===========================================================================
  406.  */