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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alninfo_table.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 20:58:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: alninfo_table.cpp,v 1000.2 2004/06/01 20:58:51 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.  *    CAlnInfoTable -- text (tabular) view of alignment, intended for internal
  38.  *                     NCBI use
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include "alninfo_table.hpp"
  42. #include <objects/seqloc/Seq_id.hpp>
  43. #include <objmgr/util/sequence.hpp>
  44. #include <FL/fl_draw.H>
  45. BEGIN_NCBI_SCOPE
  46. USING_SCOPE(objects);
  47. CAlnInfoTable::CAlnInfoTable(int x, int y, int w, int h, const char* label)
  48.     : CTablePanelBase(x, y, w, h, label),
  49.       m_Mode(eSegments)
  50. {
  51.     row_header(true);
  52.     col_header(true);
  53. }
  54. void CAlnInfoTable::Update(CAlnVec& aln_mgr)
  55. {
  56.     m_AlnMgr.Reset(&aln_mgr);
  57.     redraw();
  58.     // make sure the table is set correctly
  59.     SetCols(m_AlnMgr->GetNumSegs());
  60.     SetRows(m_AlnMgr->GetNumRows());
  61.     x_SetColWidths();
  62. }
  63. void CAlnInfoTable::resize(int x, int y, int w, int h)
  64. {
  65.     CTablePanelBase::resize(x, y, w, h);
  66.     x_SetColWidths();
  67. }
  68. void CAlnInfoTable::x_SetColWidths()
  69. {
  70.     const int title_width = 90;
  71.     int width = (int)(float(w() - title_width) / float (GetCols()));
  72.     width = max(70, width);
  73.     for (size_t i = 0;  i < GetCols();  ++i) {
  74.         col_width(i, width);
  75.     }
  76.     row_header_width(title_width);
  77.     //col_width(title_width, -1);
  78.     //col_width(title_width, -2);
  79. }
  80. int CAlnInfoTable::handle(int event)
  81. {
  82.     switch (event) {
  83.     case FL_PUSH:
  84.         {{
  85.              /** FIXME
  86.              int row = get_row(Fl::event_x(), Fl::event_y());
  87.              int col = get_col(Fl::event_x(), Fl::event_y());
  88.              if (col < 0  &&  row >= 0  &&  Fl::event_clicks()) {
  89.                  m_AlnMgr->SetAnchor(row);
  90.                  GetCols(m_AlnMgr->GetNumSegs());
  91.                  x_SetColWidths();
  92.                  redraw();
  93.                  return 1;
  94.              }
  95.              **/
  96.          }}
  97.         break;
  98.     }
  99.     return CTablePanelBase::handle(event);
  100. }
  101. void CAlnInfoTable::draw_cell(TableContext ctx,
  102.                               int row, int col,
  103.                               int x, int y, int w, int h)
  104. {
  105.     if ( !m_AlnMgr ) {
  106.         return;
  107.     }
  108.     switch (ctx) {
  109.     case CONTEXT_STARTPAGE:
  110. fl_font(labelfont(), labelsize());
  111.         break;
  112.     case CONTEXT_ROW_HEADER:
  113.         fl_push_clip(x, y, w, h);
  114.         {{
  115.             fl_draw_box(GetRowHeaderBox(), x, y, w, h, row_header_color());
  116.             if (row < GetRows()) {
  117.                 fl_color(labelcolor());
  118.                 const CSeq_id& best_id =
  119.                     sequence::GetId(m_AlnMgr->GetBioseqHandle(row),
  120.                                     sequence::eGetId_Best);
  121.                 string str;
  122.                 best_id.GetLabel(&str);
  123.                 fl_draw(str.c_str(),
  124.                         x, y, w, h, FL_ALIGN_CENTER);
  125.             }
  126.          }}
  127.         fl_pop_clip();
  128.         break;
  129.     case CONTEXT_COL_HEADER:
  130.         fl_push_clip(x, y, w, h);
  131.         {{
  132.             fl_draw_box(GetColHeaderBox(), x, y, w, h, col_header_color());
  133.             if (col < GetCols()) {
  134.                 fl_color(labelcolor());
  135.                 string str = NStr::IntToString(m_AlnMgr->GetLen(col));
  136.                 fl_draw(str.c_str(),
  137.                         x, y, w, h, FL_ALIGN_CENTER);
  138.             }
  139.          }}
  140.         fl_pop_clip();
  141.         break;
  142.     case CONTEXT_CELL:
  143.         fl_push_clip(x, y, w, h);
  144.         {{
  145.     // BG COLOR
  146.     fl_color(row_selected(row) ?
  147.                      selection_color() : FL_BACKGROUND2_COLOR);
  148.     fl_rectf(x, y, w, h);
  149.     // TEXT
  150.             if (row < GetRows()  &&  col < GetCols()) {
  151.                 string str;
  152.                 // actual column data
  153.                 if (m_AlnMgr->GetStart(row, col) == -1) {
  154.                     str = "---";
  155.                 } else {
  156.                     switch (m_Mode) {
  157.                     case eSegments:
  158.                         // here we show the sequence offset for this segment
  159.                         str = NStr::IntToString(m_AlnMgr->GetStart(row, col));
  160.                         break;
  161.                     case eSequence:
  162.                         // here we show the actual sequence for this segment
  163.                         m_AlnMgr->GetSegSeqString(str, row, col);
  164.                         break;
  165.                     case eScores:
  166.                         // here we show the score for the alignment
  167.                         break;
  168.                     }
  169.                 }
  170.         fl_color(labelcolor());
  171.                 fl_draw(str.c_str(),
  172.                         x + Fl::box_dx(FL_BORDER_FRAME),
  173.                         y + Fl::box_dy(FL_BORDER_FRAME),
  174.                         w - Fl::box_dw(FL_BORDER_FRAME),
  175.                         h - Fl::box_dh(FL_BORDER_FRAME),
  176.                         FL_ALIGN_LEFT);
  177.             }
  178.     // BORDER
  179.     fl_draw_box(FL_BORDER_FRAME, x, y, w, h, FL_LIGHT2);
  180.          }}
  181.         fl_pop_clip();
  182.         break;
  183.     case CONTEXT_ENDPAGE:
  184.         fl_push_clip(this->x(), this->y(), this->w(), this->h());
  185.         {{
  186.             fl_draw_box(box(),
  187.                         this->x(), this->y(), this->w(), this->h(),
  188.                         color());
  189.         }}
  190.         fl_pop_clip();
  191.         break;
  192.     default:
  193.         break;
  194.     }
  195. }
  196. void CAlnInfoTable::SetMode(EMode mode)
  197. {
  198.     m_Mode = mode;
  199.     redraw();
  200. }
  201. END_NCBI_SCOPE
  202. /*
  203.  * ===========================================================================
  204.  * $Log: alninfo_table.cpp,v $
  205.  * Revision 1000.2  2004/06/01 20:58:51  gouriano
  206.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  207.  *
  208.  * Revision 1.10  2004/05/21 22:27:48  gorelenk
  209.  * Added PCH ncbi_pch.hpp
  210.  *
  211.  * Revision 1.9  2004/05/03 17:52:14  dicuccio
  212.  * Fix compiler warning about signed/unsigned comparison
  213.  *
  214.  * Revision 1.8  2004/03/05 17:37:11  dicuccio
  215.  * Use sequence::GetId() instead of CSeq_id::GetStringDescr()
  216.  *
  217.  * Revision 1.7  2004/01/20 18:17:52  dicuccio
  218.  * Changed to match new API in CTablePanel
  219.  *
  220.  * Revision 1.6  2003/09/24 18:25:36  dicuccio
  221.  * Inherit from CTablePanelBase.  Cleaned up rendering code.
  222.  *
  223.  * Revision 1.5  2003/09/04 14:52:47  dicuccio
  224.  * Code clean-up.  Table noew (mostly) works
  225.  *
  226.  * Revision 1.4  2003/07/25 13:44:48  dicuccio
  227.  * Replaced Flv_Table with Fl_Table
  228.  *
  229.  * Revision 1.3  2003/03/25 19:43:01  dicuccio
  230.  * Use a minimum widgt for each column.  Indicate anchored row via color
  231.  *
  232.  * Revision 1.2  2003/03/04 14:31:20  dicuccio
  233.  * Added USING_SCOPE(objects) to appease MSVC
  234.  *
  235.  * Revision 1.1  2003/03/03 18:29:55  dicuccio
  236.  * Initial revision
  237.  *
  238.  * ===========================================================================
  239.  */