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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmulti_model.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:51:36  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_ALNMULTI___ALNMULTI_MODEL__HPP
  10. #define GUI_WIDGETS_ALNMULTI___ALNMULTI_MODEL__HPP
  11. /*  $Id: alnmulti_model.hpp,v 1000.1 2004/06/01 19:51:36 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:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *   CAlnMultiModel - representation of alignment for rendering.
  40.  */
  41. #include <corelib/ncbiobj.hpp>
  42. #include <util/range_coll.hpp>
  43. #include <gui/opengl/glviewport.hpp>
  44. #include <gui/widgets/aln_multiple/sel_list_model_impl.hpp>
  45. #include <gui/widgets/aln_multiple/alnmulti_ds.hpp>
  46. #include <gui/widgets/aln_multiple/alnmulti_base_pane.hpp>
  47. BEGIN_NCBI_SCOPE
  48. class IAlnMultiDataSource;
  49. typedef CSelListModelImpl<IAlnMultiDataSource::TNumrow> TNumrowModelImpl;
  50. ////////////////////////////////////////////////////////////////////////////////
  51. /// class CAlnMultiModel - represents visual model of alignment used by Renderer
  52. /// to draw alignment in a widget or to generate alignment image in CGI.
  53. ///
  54. /// Model presents alignment as set of graphical areas corresponding to alignment
  55. /// rows. Each ares is represented by an instance if IAlignRow-derived class and
  56. /// has attributes such as "visible" and "selected". Order of areas on screen (lines)
  57. /// may be different from order of rows in alignment.
  58. /// Model holds data necessary for rendering such as IAlignRow-derived objects
  59. /// represnting rows, row attaributes and indixes facilitating operations with
  60. /// model (line <-> row, row_num <-> row).
  61. class NCBI_GUIWIDGETS_ALNMULTIPLE_EXPORT CAlnMultiModel
  62.     : public IAlnMultiRendererContext, // context for Renderer
  63.       public TNumrowModelImpl   // ISelListModel implementation
  64. {
  65. public:
  66.     typedef int TLine;
  67.     typedef list<objects::CSeq_loc*>    TPSeqLocList;
  68.     typedef CRangeCollection<TSeqPos>   TRangeColl;
  69. public:
  70.     CAlnMultiModel();
  71.     virtual ~CAlnMultiModel();
  72.     virtual void SetDataSource(IAlnMultiDataSource* p_ds);
  73.     virtual void    SetStyleCatalog(const CRowStyleCatalog* catalog);
  74.     virtual const CWidgetDisplayStyle*      GetDisplayStyle() const;
  75.     CGlPane& GetAlignPort();
  76.     
  77.     IAlignRow*  GetRow(TNumrow  row);
  78.     const IAlignRow*  GetRow(TNumrow  row) const;
  79.     bool        IsRowVisible(TNumrow  row) const;
  80.     bool        IsRowSelected(TNumrow  row) const;
  81.     
  82.     /// returns a combination of IAlignRow::EState flags
  83.     int   GetRowState(TNumrow row)    const;
  84.     
  85.     inline void    GetSelectedRows(vector<TNumrow>& rows);
  86.     virtual void    CreateRows(void); /// create
  87.     virtual void    ClearRows(void);
  88.     void    SetPortLimits(void); 
  89.         
  90.     /// changes Master (Anchor) an perform necessary updates
  91.     virtual void    SetMasterRow(TNumrow new_row);
  92.     
  93.     /// enables auto sorting but does not perform any updates
  94.     virtual void    EnableAutoSorting(bool b_en);
  95.     /// enables auto sorting of rows, sorts rows using x_SortRows() and 
  96.     /// performs necessary updates
  97.     virtual void    UpdateSortOrder(void);    
  98.     /// disables auto sorting, reorders rows in alignment so that rows from
  99.     /// the given vector appear in the specified order in the position specified by "pos"
  100.     virtual void    SetRowOrder(const vector<TNumrow>& rows, int pos = 0);
  101.     
  102.     /// makes specified rows visible/hidden, if b_invert_others == "true"
  103.     /// then visibility of all rows not in "rows" will be changed to ! b_visible
  104.     void    SetVisible(const vector<TNumrow>& rows, bool b_visible, 
  105.                        bool b_invert_others = false);
  106.     void    ShowAll();
  107.     /// updates model after row height changed    
  108.     virtual void    UpdateOnRowHChanged(void);
  109.     
  110.     /// @name IAlnMultiRendererContext implementation 
  111.     /// @{
  112.     virtual const CGlPane& GetAlignPort() const;
  113.     virtual bool        IsRendererFocused();
  114.     virtual TNumrow     GetLinesCount();
  115.     virtual int     GetFocusedItemIndex() const;
  116.     virtual bool    IsItemSelected(int index) const;
  117.     
  118.     virtual IAlignRow*  GetMasterRow();
  119.     virtual IAlignRow*  GetRowByLine(TLine line);    
  120.     virtual int         GetLineByRowNum(TNumrow row) const;
  121.     virtual int         GetLineByModelY(int Y) const;
  122.     virtual int         GetLinePosY(TLine line) const;
  123.     virtual int         GetLineHeight(TLine line) const;    
  124.     /// @}        
  125.     
  126. protected:  
  127.     // SRowRecord is a record representing a single alignment row
  128.     struct  SRowRecord
  129.     {
  130.         IAlignRow*  m_pRow; // row object
  131.         TLine       m_Line; // visual line index
  132.         int         m_State; // row state, combination of IAlignRow::EState flags
  133.     public:
  134.         SRowRecord() 
  135.             : m_pRow(NULL), m_Line(-1), m_State(0) {}
  136.         SRowRecord(IAlignRow* p_row, TLine line) 
  137.             : m_pRow(p_row), m_Line(line), m_State(0) {}
  138.         SRowRecord(const SRowRecord& proto) 
  139.             : m_pRow(proto.m_pRow), m_Line(proto.m_Line), m_State(0)    {}
  140.         inline void     SetState(int mask, bool b_set = true);
  141.         inline  int     GetState(int mask) const;
  142.         inline  bool    IsVisible() const;
  143.         inline  bool    IsSelected() const;
  144.         static bool    PRecLineLess(const SRowRecord* rec1, 
  145.                                     const SRowRecord* rec2);
  146.     };
  147. protected:
  148.    inline SRowRecord&     x_GetRecordByRow(TNumrow row);
  149.    inline const SRowRecord&     x_GetRecordByRow(TNumrow row) const;
  150.     
  151.     // factory method for creation IAlignRow instances
  152.     virtual IAlignRow*  x_CreateRow(TNumrow row)  = 0;
  153.     virtual void    x_UpdateOnDataChanged();
  154.     /// This is a sorting callback automatically invoked by CAlnMultiModel when
  155.     /// necessary. Override this function in derived classes - default 
  156.     /// implementation doesn't do anything. 
  157.     /// x_SortRows() should rearrange eleemnts of m_vVisibleRows and return "true" 
  158.     /// if any changes have been made - this will force necessary updates.
  159.     virtual bool    x_SortRows(void); 
  160.     /// performs sorting by invoking x_SortRows() and updates line numbers
  161.     virtual void    x_DoUpdateRowsOrder(void);
  162.     /// recalculates vertical coordinates of row objects
  163.     virtual void    x_DoUpdateRowPositions(void);
  164.     
  165.     void    x_DoUpdateRowLines(void); /// updates line numbers in SRowRecords
  166.    
  167.     /// @TNumrowModelImpl extension
  168.     /// @{
  169.     virtual void    x_SelectItem(TIndex index, bool b_sel);
  170.     virtual bool    x_IsItemSelected(TIndex index) const;
  171.     virtual TIndex  x_GetItemsCount()   const;
  172.     virtual TItem   x_GetItem(TIndex index)    const;
  173.     virtual void    x_SetEntries(const TEntryVector& v_entries);
  174.     virtual TIndex  x_GetItemIndex(const TItem& item);
  175.     
  176.     virtual void    x_InsertItem(TIndex index, const TItemEntry& entry);
  177.     virtual void    x_CompleteInsertion(); 
  178.     virtual void    x_MarkItemForErase(TIndex index);
  179.     virtual void    x_EraseMarkedItems(void);
  180.     virtual void    x_ClearItems(void);
  181.     /// @}
  182.   
  183.     IAlignRow*  x_GetRowByLine(int Index);
  184.     const IAlignRow*  x_GetRowByLine(int Index)   const;
  185. protected:
  186.     typedef vector<SRowRecord*>     TRowRecVector;
  187.     typedef vector<SRowRecord*>     TRowToRecMap;    
  188.     CWidgetDisplayStyle     m_Style;
  189.     const CRowStyleCatalog* m_pStyleCatalog;
  190.     
  191.     IAlnMultiDataSource* m_pDataSource;
  192.     TRowToRecMap    m_RowToRec; /// map storing records for all rows
  193.     IAlignRow*      m_pMasterRow; /// IAligRow corresponding to Anchor
  194.     TRowRecVector   m_vVisibleRows; /// line number -> SRowRecord* for visible rows
  195.     vector<int>     m_vVisibleRowPos; /// bottom positions for visible rows[line]       
  196.     CGlPane  m_Port; 
  197.     bool    m_bAutoSort; /// enables automating sorting of rows using x_SortRows() callback
  198. };
  199. ////////////////////////////////////////////////////////////////////////////////
  200. /// CAlnMultiModel inline functions
  201. inline IAlignRow*  CAlnMultiModel::GetRow(TNumrow  row)
  202. {
  203.     _ASSERT(row >= 0  &&  (size_t) row < m_RowToRec.size());
  204.     return m_RowToRec[row]->m_pRow;
  205. }
  206. const inline IAlignRow*  CAlnMultiModel::GetRow(TNumrow  row) const
  207. {
  208.     _ASSERT(row >= 0  &&  (size_t) row < m_RowToRec.size());
  209.     return m_RowToRec[row]->m_pRow;
  210. }
  211. inline bool     CAlnMultiModel::IsRowVisible(TNumrow  row) const
  212. {
  213.     _ASSERT(row >= 0  &&  (size_t) row < m_RowToRec.size());
  214.     return m_RowToRec[row]->IsVisible();
  215. }
  216. inline bool     CAlnMultiModel::IsRowSelected(TNumrow  row) const
  217. {
  218.     _ASSERT(row >= 0  &&  (size_t) row < m_RowToRec.size());
  219.     return m_RowToRec[row]->IsSelected();
  220. }
  221. inline CAlnMultiModel::SRowRecord&     CAlnMultiModel::x_GetRecordByRow(TNumrow row)
  222. {
  223.     _ASSERT(row >= 0  &&  (size_t) row < m_RowToRec.size());
  224.     return *m_RowToRec[row];
  225. }
  226. inline const CAlnMultiModel::SRowRecord&     CAlnMultiModel::x_GetRecordByRow(TNumrow row) const
  227. {
  228.     _ASSERT(row >= 0  &&  (size_t) row < m_RowToRec.size());
  229.     return *m_RowToRec[row];
  230. inline void CAlnMultiModel::SRowRecord::SetState(int mask, bool b_set) 
  231. {
  232.     if(b_set)   {
  233.         m_State |= mask;
  234.     } else {
  235.         m_State &= ~mask;
  236.     }
  237. }
  238. inline  int    CAlnMultiModel::SRowRecord::GetState(int mask) const
  239. {
  240.     return m_State & mask;
  241. }
  242. inline  bool    CAlnMultiModel::SRowRecord::IsVisible() const
  243. {
  244.     return (m_State & IAlignRow::fItemHidden) == 0;
  245. }
  246. inline  bool    CAlnMultiModel::SRowRecord::IsSelected() const
  247. {
  248.     return (m_State & IAlignRow::fItemSelected) != 0;
  249. }
  250. inline void    CAlnMultiModel::GetSelectedRows(vector<TNumrow>& rows)
  251. {
  252.     SLM_GetSelectedItems(rows);
  253. }
  254. END_NCBI_SCOPE
  255. #endif  // GUI_WIDGETS_ALNMULTI___ALNMULTI_MODEL__HPP
  256. /*
  257.  * ===========================================================================
  258.  * $Log: alnmulti_model.hpp,v $
  259.  * Revision 1000.1  2004/06/01 19:51:36  gouriano
  260.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  261.  *
  262.  * Revision 1.6  2004/04/27 15:34:59  yazhuk
  263.  * Added PRecLineLess() to SRowRecord
  264.  *
  265.  * Revision 1.5  2004/04/06 16:03:21  yazhuk
  266.  * Added GetSelectedRows(), EnableAutoSorting(), SetRowOrder()
  267.  *
  268.  * Revision 1.4  2004/04/02 16:35:29  yazhuk
  269.  * Added GetRow(), IsRowVisible(), IsRowSelected(); comments
  270.  *
  271.  * Revision 1.3  2004/03/18 17:07:27  yazhuk
  272.  * Added "b_invert_others" argument to SetVisible()
  273.  *
  274.  * Revision 1.2  2004/03/17 20:15:07  yazhuk
  275.  * Refactored CAlnMultiModel interface
  276.  *
  277.  * Revision 1.1  2004/03/09 20:59:01  yazhuk
  278.  * Initial revision. Factored out from CAlnMultiWidget.
  279.  *
  280.  * ===========================================================================
  281.  */