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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: default_policy.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:53:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_SEQ_GRAPHIC___DEFAULT_POLICY__HPP
  10. #define GUI_WIDGETS_SEQ_GRAPHIC___DEFAULT_POLICY__HPP
  11. /*  $Id: default_policy.hpp,v 1000.2 2004/06/01 19:53:16 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Vlad Lebedev
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <gui/gui.hpp>
  42. #include <gui/widgets/gl/ipolicy.hpp>
  43. #include <gui/objutils/feat_label.hpp>
  44. #include <gui/opengl/glbitmapfont.hpp>
  45. #include <gui/objutils/feature.hpp>
  46. #include <gui/objutils/alignment.hpp>
  47. #include <gui/objutils/pw_alignment.hpp>
  48. #include <gui/objutils/alignment_smear_layout.hpp>
  49. #include <gui/objutils/graph.hpp>
  50. #include <gui/objutils/comment.hpp>
  51. #include <gui/objutils/seq_map.hpp>
  52. #include <gui/objutils/histogram.hpp>
  53. #include <gui/objutils/feat_pack.hpp>
  54. #include <gui/objutils/prot_product.hpp>
  55. #include <gui/objutils/mate_pair.hpp>
  56. #include <gui/objutils/sequence.hpp>
  57. #include <gui/objutils/utils.hpp>
  58. #include <gui/objutils/label.hpp>
  59. #include <gui/opengl/glcolortable.hpp>
  60. #include <gui/widgets/seq_graphic/seqgraphic_conf.hpp>
  61. #include <objmgr/util/feature.hpp>
  62. #include <objects/seq/Seq_annot.hpp>
  63. BEGIN_NCBI_SCOPE
  64. ///////////////////////////////////////////////////////////////////////////////
  65. /// CDefaultPolicy is a default policy for rendering layout objects in 
  66. // feature panel of seq_graphic widget.
  67. ///////////////////////////////////////////////////////////////////////////////
  68. class NCBI_GUIWIDGETS_SEQGRAPHIC_EXPORT CDefaultPolicy : public IPolicy
  69. {
  70. public:
  71.     CDefaultPolicy();
  72.     virtual ~CDefaultPolicy() { };
  73.     // IPolicy interfaces
  74.     virtual TModelUnit GetRowHeight(CGlPane& pane, const CLayoutObject* obj, 
  75.             bool selected) const;
  76.     virtual bool ProcessObject(CGlPane& pane, const CLayoutObject* obj, 
  77.             TModelUnit row, EObj_IterMode mode, bool selected) const;
  78.     virtual void SetHandle(const objects::CBioseq_Handle& handle);
  79.     virtual void SetConfig(CSeqGraphicConfig* config);
  80.     virtual void SetHitPoint(TModelPoint click);
  81.     virtual void SetActiveArea(TAreaVector* p_area);
  82.     virtual void GetTitle(const CLayoutObject* obj, 
  83.                string* title, CLabel::ELabelType) const;
  84. protected:    
  85.     CGlColorTable m_ColorTable;
  86.     TVPUnit       m_MinLabelWidth;  // minimum label that will fit
  87.     
  88.     // fonts
  89.     CGlBitmapFont m_Font_Bitmap9x15;
  90.     CGlBitmapFont m_Font_Helv10;
  91.     CGlBitmapFont m_Font_Helv8;
  92.     enum EProtSeqType {
  93.         eProteinSeq,
  94.         eTranslatedSeq
  95.     };
  96.     TModelPoint  m_LastClick;    
  97.     TAreaVector* m_ActiveAreas;
  98.     // map of named annotations, with their indices
  99.     typedef map<string, int> TNamedAnnots;
  100.     mutable TNamedAnnots m_Annots;
  101.     objects::CBioseq_Handle m_Handle;
  102.     CRef<CSeqGraphicConfig>  m_ConfigSettings;    
  103.     
  104.     // returns offset from the begining of feature, 
  105.     // based on frame for protein translation
  106.     TSeqPos x_GetProtOffset(const CLayoutFeat* feat) const;
  107.     // is it enougth space to sequence letters?
  108.     bool x_IsSeqLettersFit(CGlPane& pane) const;
  109.     
  110.     // center label in model coordinates
  111.     GLfloat x_CenterText(CGlPane& pane, TModelRect rc, GLfloat width) const;
  112.     // selected objects
  113.     virtual bool x_IsObjectClicked(CGlPane& pane, const CLayoutObject* obj,     
  114.             GLfloat row_y, bool selected) const;
  115.             
  116.     virtual bool x_IsFeatLabelClicked(CGlPane& pane, 
  117.             const CLayoutFeatLabel* lbl, GLfloat row_y) const;
  118.     
  119.     TModelUnit x_CalcAlignHeight(const CLayoutAlign* align) const;
  120.     
  121.     // set feature color based on config
  122.     virtual void x_SetFeatureColor(const CLayoutFeat* feat) const;
  123.     
  124.     // Internal incremental pool of CSeq_annots (for higlighting
  125.     // of the named seq. annots.) 
  126.     size_t x_GetSeqAnnotIndex(const objects::CSeq_annot_Handle& annot) const;
  127.     
  128.     // draw functions for particular layout objects
  129.     virtual void x_DrawAlignment(CGlPane& pane, const CLayoutAlign* align, 
  130.                 GLfloat row_y, EObj_IterMode mode, bool selected) const;
  131.          
  132.     virtual void x_DrawAlignmentSmear(CGlPane& pane, const CLayoutAlignSmear* smear, 
  133.                 GLfloat row_y, EObj_IterMode mode, bool selected) const;
  134.          
  135.     virtual void x_DrawFeature(CGlPane& pane, const CLayoutFeat* feat, 
  136.                 GLfloat row_y, EObj_IterMode mode, bool selected) const;
  137.     virtual void x_DrawFeatLabel(CGlPane& pane, const CLayoutFeatLabel* feat, 
  138.                 GLfloat row_y, EObj_IterMode mode, bool selected) const;
  139.          
  140.     virtual void x_DrawProteinProduct(CGlPane& pane, const CLayoutFeat* feat, 
  141.                 GLfloat row_y, EProtSeqType type, bool selected) const;
  142.     virtual void x_DrawSeqGraph(CGlPane& pane, const CLayoutGraph* graph, 
  143.                 GLfloat row_y, EObj_IterMode mode, bool selected) const;
  144.     virtual void x_DrawComments(CGlPane& pane, const CLayoutComment* comm,
  145.                     GLfloat row_y, EObj_IterMode mode, bool selected) const;
  146.     virtual void x_DrawSequence(CGlPane& pane, const CLayoutSequence* seqs,
  147.                     GLfloat row_y, EObj_IterMode mode, bool selected) const;
  148.     virtual void x_DrawSeqSegment(CGlPane& pane, const CLayoutSeqMap* seg,
  149.                     GLfloat row_y, EObj_IterMode mode, bool selected) const;
  150.     virtual void x_DrawFeatPack(CGlPane& pane, const CLayoutFeatPack* pack,
  151.                     GLfloat row_y, EObj_IterMode mode, bool selected) const;
  152.     virtual void x_DrawHistogram(CGlPane& pane, const CLayoutHistogram* hist,
  153.                     GLfloat row_y, EObj_IterMode mode, bool selected) const;
  154.     virtual void x_DrawMatePair(CGlPane& pane, const CLayoutMatePair* pair,
  155.                     GLfloat row_y, EObj_IterMode mode, bool selected) const;
  156.     virtual void x_DrawPWAlign(CGlPane& pane, const CLayoutPWAlign* pw_aln,
  157.                     GLfloat row_y, EObj_IterMode mode, bool selected) const;
  158.     virtual void x_DrawPWAlignElem(CGlPane& pane, const CLayoutPWAlign* pw_aln,
  159.                     GLfloat row_y, EObj_IterMode mode, bool selected, 
  160.                     CSeqGraphicColorConfig::EDisplayElement c_fg, 
  161.                     CSeqGraphicColorConfig::EDisplayElement c_seq,
  162.                     CSeqGraphicColorConfig::EDisplayElement c_mis) const;
  163.     virtual void x_DrawGridLine(CGlPane& pane, const CLayoutObject* obj, 
  164.                                 GLfloat row_y) const;
  165.     void x_Color(CSeqGraphicColorConfig::EDisplayElement e) const;
  166.     
  167.     void x_GetHTMLActiveAreas(CGlPane& pane, const CLayoutObject* obj, 
  168.                 GLfloat row_y, bool selected) const;
  169.     void x_AddGetHTMLActiveElement(string title, string tooltip, CGlPane& pane,
  170.                 const CLayoutObject* obj, GLfloat row_y, bool selected) const;
  171.     
  172.     // Row height calculations
  173.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  174.                 const CLayoutFeat* feat, bool selected) const;
  175.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  176.                 const CLayoutAlign* align, bool selected) const;
  177.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  178.                 const CLayoutAlignSmear* align, bool selected) const;
  179.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  180.                 const CLayoutFeatLabel* label, bool selected) const;
  181.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  182.                 const CLayoutProtProd* prot, bool selected) const;
  183.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  184.                 const CLayoutGraph* graph, bool selected) const;
  185.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  186.                 const CLayoutComment* comm, bool selected) const;
  187.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  188.                 const CLayoutSeqMap* seg, bool selected) const;
  189.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  190.                 const CLayoutFeatPack* pack, bool selected) const;
  191.     virtual TModelUnit x_GetRowHeight(CGlPane& pane, 
  192.                 const CLayoutHistogram* hist, bool selected) const;
  193.     virtual TModelUnit x_GetRowHeight(CGlPane& pane,
  194.                 const CLayoutSequence* seqs, bool selected) const;
  195.     virtual TModelUnit x_GetRowHeight(CGlPane& pane,
  196.                 const CLayoutMatePair* pair, bool selected) const;
  197.     virtual TModelUnit x_GetRowHeight(CGlPane& pane,
  198.                 const CLayoutPWAlign* pw_align, bool selected) const;
  199.     virtual void x_DrawSelection(CGlPane& pane,
  200.             TModelUnit x1, TModelUnit y1, TModelUnit x2, TModelUnit y2) const;
  201.     virtual void x_DrawQuad(CGlPane& pane,
  202.             TModelUnit x1, TModelUnit y1, TModelUnit x2, TModelUnit y2) const;
  203.     // Getting titles
  204.     virtual void x_GetTitle(const CLayoutFeat* feat, string* title, 
  205.                 CLabel::ELabelType type = CLabel::eDefault) const;
  206.     virtual void x_GetTitle(const CLayoutAlign* align, string* title,
  207.                 CLabel::ELabelType type = CLabel::eDefault) const;
  208.     virtual void x_GetTitle(const CLayoutGraph* graph, string* title,
  209.                 CLabel::ELabelType type = CLabel::eDefault) const;
  210.     virtual void x_GetTitle(const CLayoutFeatPack* pack, string* title,
  211.                 CLabel::ELabelType type = CLabel::eDefault) const;
  212.     virtual void x_GetTitle(const CLayoutHistogram* hist, string* title,
  213.                 CLabel::ELabelType type = CLabel::eDefault) const;
  214.     virtual void x_GetTitle(const CLayoutSeqMap* seg, string* title,
  215.                 CLabel::ELabelType type = CLabel::eDefault) const;
  216.     virtual void x_GetTitle(const CLayoutSequence* seqs, string* title,
  217.                 CLabel::ELabelType type = CLabel::eDefault) const;
  218.     virtual void x_GetTitle(const CLayoutMatePair* pair, string* title,
  219.                 CLabel::ELabelType type = CLabel::eDefault) const;
  220.     virtual void x_GetTitle(const CLayoutPWAlign* pw_align, string* title,
  221.                 CLabel::ELabelType type = CLabel::eDefault) const;
  222.     
  223.     // retrieve a set of labels for a given feature
  224.     void x_GetLabels(const objects::CSeq_feat& feat,
  225.                      objects::CScope& scope,
  226.                      string* label_type,
  227.                      string* label_content,
  228.                      string* label_both) const;
  229.     // x_PreparePlot and x_DrawPlot are for drawing
  230.     // three different kind of graphs: Byte, Real and Integer
  231.     //
  232.     // FixMe: Code below will be changed soon to use GetOffSetX and GetOffSetY
  233.     // methods of CGlPane
  234.     template <class T>
  235.     void x_DrawPlot(CGlPane& pane, const T& vec, int min_v, int max_v,
  236.                     TSeqRange range, GLfloat row_y, TModelUnit size) const
  237.     {
  238.         TModelUnit offsetX = pane.GetOffsetX();
  239.         TModelUnit offsetY = pane.GetOffsetY();
  240.         GLfloat delta  = max_v - min_v;        
  241.         GLfloat step   = (range.GetTo() - range.GetFrom()) / vec.size();
  242.         GLfloat yy     = row_y + 20 - offsetY;
  243.         
  244.         for (size_t j = 1;  j <= vec.size();  ++j) {
  245.             int curr_y = int( vec[j] );
  246.             int prev_y = int( vec[j-1] );
  247.             GLfloat yy1 = yy - 10 * (prev_y - min_v) / delta - 1.0f;
  248.             GLfloat yy2 = yy - 10 * (curr_y - min_v) / delta - 1.0f;
  249.         
  250.             GLfloat xx1 = range.GetFrom() + (step * (j-1));
  251.             GLfloat xx2 = range.GetFrom() + (step * j);
  252.             
  253.             glVertex2f(xx1 - offsetX, yy1);
  254.             glVertex2f(xx2 - offsetX, yy2);
  255.         }
  256.     }
  257.     
  258.     template <class T>
  259.     void x_PreparePlot(CGlPane& pane, const T& vec,
  260.                        TSeqRange range, GLfloat row_y, TModelUnit size) const
  261.     {
  262.         int min_v = int(vec.GetMin());    
  263.         int max_v = int(vec.GetMax());
  264.     
  265.         if (vec.CanGetValues()) {
  266.             x_DrawPlot(pane, vec.GetValues(), min_v, max_v, range, row_y, size);
  267.         }
  268.     }
  269. };
  270. END_NCBI_SCOPE
  271. /*
  272.  * ===========================================================================
  273.  * $Log: default_policy.hpp,v $
  274.  * Revision 1000.2  2004/06/01 19:53:16  gouriano
  275.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  276.  *
  277.  * Revision 1.18  2004/05/14 16:00:28  lebedev
  278.  * Respect color defines for Mate Pairs error codes. Draw pair wise alignment strand
  279.  * indicators as arrows. Use CLabel::eTooltipDetailed mode for tooltips.
  280.  *
  281.  * Revision 1.17  2004/05/03 12:46:32  dicuccio
  282.  * gui/utils ->gui/objutils where needed
  283.  *
  284.  * Revision 1.16  2004/04/21 16:35:40  lebedev
  285.  * Support for pair-wise alignments added. Rendering of Mate Pairs changed.
  286.  * Return multiple HTML Active areas for Mate Pair objects.
  287.  *
  288.  * Revision 1.15  2004/04/16 14:34:36  dicuccio
  289.  * Use raw pointer for SetConfig() instead of CRef<>
  290.  *
  291.  * Revision 1.14  2004/04/14 11:25:50  lebedev
  292.  * Added rendering of Mate Pairs.
  293.  *
  294.  * Revision 1.13  2004/04/07 12:43:02  dicuccio
  295.  * Use CSeq_annot_Handle to get real name of annotation
  296.  *
  297.  * Revision 1.12  2004/04/06 13:30:47  dicuccio
  298.  * Formatting changes.  Removed dead code.
  299.  *
  300.  * Revision 1.11  2004/03/31 16:09:01  lebedev
  301.  * Methods to get HTML active areas added.
  302.  *
  303.  * Revision 1.10  2004/03/30 13:58:39  lebedev
  304.  * Use elements colors from configuration instead of setting colors directly.
  305.  *
  306.  * Revision 1.9  2004/03/26 15:46:03  lebedev
  307.  * Rendering of SeqGraphs fixed
  308.  *
  309.  * Revision 1.8  2004/03/23 12:33:56  lebedev
  310.  * Made sequence and histograms bars a layout objects in the object panel.
  311.  * Made segment map a number of layout objects. Get rid of fixed size rows in the object panel.
  312.  *
  313.  * Revision 1.7  2004/03/22 16:50:19  rsmith
  314.  * add x_DrawAlignmentSmear and x_GetRowHeight for alignment smears.
  315.  *
  316.  * Revision 1.6  2004/03/11 17:23:38  dicuccio
  317.  * Use TSeqRange instead of TRange.  Deprecated TIndex / TPosition / TDimension
  318.  *
  319.  * Revision 1.5  2004/02/24 14:47:15  lebedev
  320.  * Support for new types of layout objects added
  321.  *
  322.  * Revision 1.4  2004/01/16 13:37:57  lebedev
  323.  * Tooltips added
  324.  *
  325.  * Revision 1.3  2004/01/05 17:49:06  dicuccio
  326.  * Added x_GetLabels()
  327.  *
  328.  * Revision 1.2  2003/12/30 14:54:59  dicuccio
  329.  * Standardized export specifiers
  330.  *
  331.  * Revision 1.1  2003/12/16 18:58:59  lebedev
  332.  * Initial revision
  333.  *
  334.  * ===========================================================================
  335.  */
  336. #endif  // GUI_WIDGETS_SEQ_GRAPHIC___DEFAULT_POLICY__HPP