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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: compact_policy.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:12:27  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: compact_policy.cpp,v 1000.2 2004/06/01 21:12:27 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.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistd.hpp>
  41. #include <gui/widgets/seq_graphic/compact_policy.hpp>
  42. #include <objmgr/util/sequence.hpp>
  43. BEGIN_NCBI_SCOPE
  44. USING_SCOPE(objects);
  45. TModelUnit kCompactSpacerSize     = 3.0f; // 3 pixels befween layout objects
  46. CCompactPolicy::CCompactPolicy()
  47. {
  48. }
  49. //
  50. // draw a given feature in a given mode
  51. //
  52. void 
  53. CCompactPolicy::x_DrawFeature(CGlPane& pane, const CLayoutFeat* feat, 
  54.                     GLfloat row_y, EObj_IterMode mode, bool selected) const
  55. {
  56.     const TModelRect& rcV = pane.GetVisibleRect();
  57.     const TModelRect& rcM = pane.GetModelLimitsRect();
  58.     
  59.     TModelUnit offsetX = pane.GetOffsetX();
  60.     TModelUnit offsetY = pane.GetOffsetY();
  61.     
  62.     TSeqPos from = feat->GetLocation().GetTotalRange().GetFrom();
  63.     TSeqPos to   = feat->GetLocation().GetTotalRange().GetTo();
  64.     
  65.     const CSeqFeatData& data = feat->GetFeature().GetData();
  66.     TModelRect frc;
  67.     frc.SetLeft(from);
  68.     frc.SetRight(to);    
  69.     TModelRect inrc = frc.IntersectWith(rcV);
  70.     GLfloat scaleX  = pane.GetScaleX();
  71.     bool has_seq = x_IsSeqLettersFit(pane)  &&  
  72.                    data.Which() == CSeqFeatData::e_Cdregion;
  73.     
  74.     GLfloat th = m_Font_Helv10.TextHeight();
  75.     GLfloat title_y  = row_y + th + 1;
  76.     GLfloat line_y1  = selected ? title_y + 3 : row_y + 3;
  77.     GLfloat line_y2  = selected && has_seq ? line_y1 + th + 2 : line_y1 + 5;
  78.     
  79.     GLfloat line_ym  = selected && has_seq ? line_y1 + (th + 2) / 2
  80.                                            : line_y1 + (3 + 2) / 2;
  81.                                            
  82.     GLfloat strand_y = line_y1 + (has_seq ? th : th - 3);
  83.     GLfloat off      = rcM.Top() > 0 ? th - 1 : 0;
  84.     bool neg_strand = (sequence::GetStrand(feat->GetLocation()) 
  85.                         == eNa_strand_minus);
  86.     switch (mode) {
  87.     default:
  88.         break;
  89.     case eDrawObjectLines:
  90.         if (true/*kShowIntrons*/) {  // ^ line
  91.             GLfloat prev_to_x = 0.0f;
  92.             bool first_pass = true;
  93.             x_SetFeatureColor(feat);
  94.             ITERATE (vector<TSeqRange>, iter, feat->GetIntervals()) {
  95.                 const TSeqRange& curr = *iter;
  96.                 TModelUnit from_x, to_x;
  97.                 if (neg_strand) {
  98.                     from_x = curr.GetTo()+1;
  99.                     to_x   = curr.GetFrom();
  100.                 } else {
  101.                     from_x = curr.GetFrom();
  102.                     to_x   = curr.GetTo()+1;
  103.                 }
  104.                 if (!first_pass) {
  105.                     GLfloat middle_x = prev_to_x + (from_x - prev_to_x) / 2.0f;
  106.                     glVertex2f(prev_to_x - offsetX, line_ym - offsetY);
  107.                     glVertex2f(middle_x - offsetX,  line_y1 - offsetY);
  108.                     glVertex2f(middle_x - offsetX,  line_y1 - offsetY);
  109.                     glVertex2f(from_x - offsetX,    line_ym - offsetY);
  110.                 }
  111.                 prev_to_x  = to_x;
  112.                 first_pass = false;
  113.             }
  114.         } else {  // straight line
  115.             glVertex2f(from - offsetX, line_ym - offsetY);
  116.             glVertex2f(to - offsetX,   line_ym - offsetY);
  117.         }
  118.         // Draw selection
  119.         if (selected) {
  120.             x_Color(CSeqGraphicColorConfig::eSelection_Feature);
  121.             x_DrawSelection(pane, from, line_y1, to, line_y2);
  122.         }
  123.         break;
  124.     case eDrawObjectQuads:
  125.         // Highlight named Seq Annotations
  126.         if (feat->GetMappedFeature().GetAnnot().IsNamed()) {
  127.             CSeq_annot_Handle annot = feat->GetMappedFeature().GetAnnot();
  128.             size_t idx = x_GetSeqAnnotIndex(annot);
  129.             
  130.             TModelUnit h = x_GetRowHeight(pane, feat, selected);
  131.             CGlColor color = m_ColorTable.GetColor(idx);
  132.             glColor4f(color.GetRed(), color.GetGreen(), color.GetBlue(), 0.1f);
  133.             
  134.             // add small overhang of 5 pixels (left and right)
  135.             TModelUnit over = pane.UnProjectWidth(5);
  136.             
  137.             glVertex2f(from - offsetX - over, row_y - offsetY);
  138.             glVertex2f(from - offsetX - over, row_y+h - offsetY);
  139.             glVertex2f(to - offsetX+1+over, row_y+h - offsetY);
  140.             glVertex2f(to - offsetX+1+over, row_y - offsetY);
  141.         }
  142.         x_SetFeatureColor(feat);
  143.         
  144.         // quad for each interval (exon)
  145.         ITERATE (vector<TSeqRange>, iter, feat->GetIntervals()) {
  146.             const TSeqRange& curr = *iter;
  147.             TModelUnit f = curr.GetFrom();
  148.             TModelUnit t = curr.GetTo()+1;// + (neg_strand ? 0.0f : 1.0f);
  149.             
  150.             if (pane.ProjectX(t) - pane.ProjectX(f) <= 1.0f) {
  151.                 t = f + pane.UnProjectWidth(1);
  152.             }
  153.             glVertex2f(f - offsetX, line_y1 - offsetY);
  154.             glVertex2f(f - offsetX, line_y2 - offsetY);
  155.             glVertex2f(t - offsetX, line_y2 - offsetY);
  156.             glVertex2f(t - offsetX, line_y1 - offsetY);
  157.         }
  158.         
  159.         break;
  160.     case eDrawObjectLabel:
  161.         if (!selected) break;
  162.         
  163.         // do not even try to draw labels if less than 1 letter width
  164.         if (inrc.Width() <= pane.UnProjectWidth(m_MinLabelWidth)) {
  165.             break;
  166.         }
  167.         string fl_both;
  168.         string fl_type;
  169.         string fl_content;
  170.         string fl_out;
  171.         x_GetLabels(feat->GetFeature(), m_Handle.GetScope(),
  172.                     &fl_type, &fl_content, &fl_both);
  173.         GLfloat widthP     = inrc.Width() / scaleX; // width in pixels
  174.         GLfloat lw_type    = m_Font_Helv10.TextWidth(fl_type.c_str() );
  175.         if ( lw_type * 3 < widthP) { // 3 widths of eType label width
  176.             fl_out = m_Font_Helv10.Truncate(fl_both.c_str(), widthP);
  177.         } else {
  178.             fl_out = m_Font_Helv10.Truncate(fl_content.c_str(), widthP);
  179.         }
  180.         
  181.         if (selected) {
  182.             x_Color(CSeqGraphicColorConfig::eSelLabel_Feature);
  183.         } else {
  184.             x_Color(CSeqGraphicColorConfig::eLabel_Feature);
  185.         }
  186.         x_Color(CSeqGraphicColorConfig::eSelection_Feature);
  187.         GLfloat xM = x_CenterText(pane, inrc, 
  188.                      m_Font_Helv10.TextWidth(fl_out.c_str()));
  189.         m_Font_Helv10.TextOut(xM - offsetX, title_y - off - offsetY, fl_out.c_str());
  190.         // draw strand indicator
  191.         xM = x_CenterText(pane, inrc, m_Font_Helv10.TextWidth("<"));
  192.         glColor3f(0.0f, 0.0f, 0.0f);  // Black
  193.         
  194.         m_Font_Helv10.TextOut(xM - offsetX, strand_y - off - offsetY, 
  195.                             neg_strand ? "<" : ">");
  196.         break;
  197.     }
  198. }
  199. // draw proteint product and label only when selected
  200. void CCompactPolicy::x_DrawProteinProduct(CGlPane& pane, const CLayoutFeat* feat, 
  201.                     GLfloat row_y, EProtSeqType type, bool selected) const
  202. {
  203.     // draw protein product for selected features only
  204.     if (selected) {
  205.         CDefaultPolicy::x_DrawProteinProduct(pane, feat, row_y, type, selected);
  206.     }
  207. }
  208. TModelUnit CCompactPolicy::x_GetRowHeight(CGlPane& pane, 
  209.                 const CLayoutFeat* feat, bool selected) const
  210. {
  211.     const CSeqFeatData& data = feat->GetFeature().GetData();
  212.     bool seq_fit             = x_IsSeqLettersFit(pane);
  213.     
  214.     if (selected  &&  data.Which() == CSeqFeatData::e_Cdregion &&  seq_fit) {
  215.         return 30.0f; // two and a half rows for selected CDSs
  216.     } else if (selected) {
  217.         return 24.0f; // two rows for selected feature
  218.     } else {
  219.         return 12.0f; // one row for all other cases
  220.     }
  221. }
  222. TModelUnit CCompactPolicy::x_GetRowHeight(CGlPane& pane, 
  223.                 const CLayoutProtProd* prot, bool selected) const
  224. {
  225.     if (selected  &&  x_IsSeqLettersFit(pane) ) {
  226.         return 30.0f; // one and a half row for selected protein
  227.     } else if (selected) {
  228.         return 24.0f; // two rows for selected feature
  229.     } else {
  230.         return 9.0f + kCompactSpacerSize;
  231.     }
  232. }
  233. TModelUnit CCompactPolicy::x_GetRowHeight(CGlPane& pane, 
  234.                     const CLayoutHistogram* hist, bool selected) const
  235. {
  236.     return 12.0f + kCompactSpacerSize; // 10 pixels for histogram in this policy
  237. }
  238. TModelUnit CCompactPolicy::x_GetRowHeight(CGlPane& pane,
  239.                     const CLayoutFeatLabel* label, bool selected) const
  240. {
  241.     return 9.0f + kCompactSpacerSize;  // one row for labels in the compact policy
  242. }
  243. END_NCBI_SCOPE
  244. /*
  245.  * ===========================================================================
  246.  * $Log: compact_policy.cpp,v $
  247.  * Revision 1000.2  2004/06/01 21:12:27  gouriano
  248.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  249.  *
  250.  * Revision 1.12  2004/05/21 22:27:55  gorelenk
  251.  * Added PCH ncbi_pch.hpp
  252.  *
  253.  * Revision 1.11  2004/04/14 11:25:02  lebedev
  254.  * Use x_DrawSelection from the base class
  255.  *
  256.  * Revision 1.10  2004/04/07 13:09:40  dicuccio
  257.  * Use CSeq_annot_Handle for proper annotation anme comparison
  258.  *
  259.  * Revision 1.9  2004/03/30 13:58:37  lebedev
  260.  * Use elements colors from configuration instead of setting colors directly.
  261.  *
  262.  * Revision 1.8  2004/03/23 12:33:55  lebedev
  263.  * Made sequence and histograms bars a layout objects in the object panel.
  264.  * Made segment map a number of layout objects. Get rid of fixed size rows in the object panel.
  265.  *
  266.  * Revision 1.7  2004/03/11 17:53:06  dicuccio
  267.  * Deprecated typedefs TPosition, TDimension, TIndex, TColor.  Use TSeqRange instead of TRange
  268.  *
  269.  * Revision 1.6  2004/01/29 14:09:35  dicuccio
  270.  * Drop erroneous constructor call - was creating anonymous object instead of calling base class
  271.  *
  272.  * Revision 1.5  2004/01/16 13:40:14  lebedev
  273.  * Tooltips added
  274.  *
  275.  * Revision 1.4  2004/01/05 21:25:05  dicuccio
  276.  * Code clean-up.  Corrected issue with protein product features not appearing in
  277.  * the correct color; standardized use of x_SetFeatureColor()
  278.  *
  279.  * Revision 1.3  2004/01/05 17:53:15  dicuccio
  280.  * Use x_GetLabels()
  281.  *
  282.  * Revision 1.2  2003/12/22 12:55:49  lebedev
  283.  * Old files removed
  284.  *
  285.  * Revision 1.1  2003/12/16 18:57:43  lebedev
  286.  * Initial revision
  287.  * ===========================================================================
  288.  */