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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: align_mark_handler.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/04/12 18:15:40  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_ALNMULTI___ALIGN_MARK_HANDLER__HPP
  10. #define GUI_WIDGETS_ALNMULTI___ALIGN_MARK_HANDLER__HPP
  11. /*  $Id: align_mark_handler.hpp,v 1000.3 2004/04/12 18:15:40 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.  * CAlignMarkHandler - class implementing support for Marks in alignments.
  40.  * IAlignMarkHandlerHost - context in which CAlignMarkHandler operates.
  41.  */
  42. #include <corelib/ncbistl.hpp>
  43. #include <corelib/ncbistd.hpp>
  44. #include <util/range_coll.hpp>
  45. #include <gui/opengl/glpane.hpp>
  46. #include <gui/utils/gui_event.hpp>
  47. #include <gui/widgets/gl/ievent_handler.hpp>
  48. #include <objects/seqloc/Seq_loc.hpp>
  49. #include <gui/widgets/aln_multiple/alnmulti_ds.hpp>
  50. #include <gui/widgets/aln_multiple/list_mvc.hpp>
  51. BEGIN_NCBI_SCOPE
  52. // Mark is collection of ranges representing selection on a sequence
  53. // CRangeCollection<TSeqPos> is used to repreesent marks
  54. ////////////////////////////////////////////////////////////////////////////////
  55. /// interface IAlignMarkHandlerHost
  56. // This interface represent context in which CAlignMarkHandler operates.
  57. // This context provides the following things:
  58. // - A way to obtain ISelListModel interface in order to check which sequences are
  59. // currently selected. 
  60. // - Functions for conversions Pixels <-> Line numbers <-> Alignment Row Indexes
  61. // - Function converting horz. screen coordinate in the position in alignment.
  62. // - Function forsing redrawing of the context.
  63. class IAlignMarkHandlerHost
  64. {
  65. public:
  66.     typedef IAlnMultiDataSource::TNumrow    TNumrow;
  67.     typedef CRangeCollection<TSeqPos>   TRangeColl;
  68.     typedef map<TNumrow, TRangeColl>    TRowToMarkMap;    
  69.     typedef ISelListModel<TNumrow>  TSelListModel;
  70. public:
  71.     virtual ~IAlignMarkHandlerHost()  {};
  72.     
  73.     virtual const IAlnMultiDataSource* MHH_GetAlnDS() const = 0;
  74.     virtual const TSelListModel*    MHH_GetSelListModel() const = 0;
  75.     virtual TNumrow    MHH_GetRowByLine(int Index) const = 0;
  76.     virtual int MHH_GetLineByRowNum(TNumrow Row) const = 0;
  77.     virtual int MHH_GetLineByWindowY(int Y) const = 0;
  78.     virtual int MHH_GetLinePosY(int Index) const = 0;
  79.     virtual int MHH_GetLineHeight(int Index) const = 0;    
  80.     virtual TModelUnit  MHH_GetSeqPosByX(int X) const = 0;
  81.     virtual void    MHH_Redraw() = 0;
  82. };
  83. ////////////////////////////////////////////////////////////////////////////////
  84. /// CAlignMarkHandler manages handling and editing of marks on alignments.
  85. ///
  86. /// It holds a collection of marks corresponding to sequences of the alignment
  87. /// and processes FLTK events in order to provide interactive editing of marks.
  88. /// CAlignMarkHandler renders marks in the provided CGlPane instance (which needs
  89. /// to be properly setup). Each mark is represented as collection of intervals
  90. /// stored in CRangeCollection container.
  91. class CAlignMarkHandler : public IEventHandler
  92. {
  93. public:
  94.     typedef IAlnMultiDataSource::TNumrow    TNumrow;
  95.     typedef IAlignMarkHandlerHost::TRangeColl   TRangeColl;
  96.     typedef IAlignMarkHandlerHost::TSelListModel    TSelListModel; 
  97.     typedef map<TNumrow, TRangeColl>    TRowToMarkMap;
  98.     CAlignMarkHandler();
  99.     void    SetHost(IAlignMarkHandlerHost* pHost);
  100.     /// IEventHandler implementation.
  101.     virtual int handle(CGUIEvent& event, CGlPane& Pane);
  102.     void    Render(CGlPane& Pane);  // renders marks  
  103.     // opeartions with Mark (don't automaticaly update display)
  104.     void    MarkSelectedRows(const TRangeColl& C, bool bMark);
  105.     void    UnMarkAll();
  106.     void    UnMarkSelected();
  107.     const   TRowToMarkMap&  GetMarks() const;
  108. protected:
  109.     // FLTK event handlers - translate event to signals
  110.     int x_OnMousePush(CGUIEvent& event);
  111.     int x_OnMouseDrag(CGUIEvent& event);
  112.     int x_OnMouseRelease(CGUIEvent& event);
  113.     int x_OnMouseMove(CGUIEvent& event);
  114.     int x_OnKeyDown(CGUIEvent& event);
  115.     int x_OnKeyUp(CGUIEvent& event);
  116.     enum    EState {
  117.         eIdle,
  118.         eReady,
  119.         eResize    
  120.     };
  121.     
  122.     
  123.     // signal handlers - functions doing the real job
  124.     void    x_OnStartSel();
  125.     void    x_OnChangeSelRange();
  126.     void    x_OnEndSelRange(EState new_state);
  127.     void    x_OnResetAll();
  128.     
  129.     
  130. protected:
  131.     // helper class representing range being edited
  132.     struct SMarkDelta    {
  133.         enum    EExtState   {   
  134.             eNoExt,
  135.             eExtRangeStart,
  136.             eExtRangeEnd,
  137.         };
  138.         TSeqRange   m_HitRange; // preexisted range that was hit by the mouse
  139.         TSeqRange   m_Range;    // current range
  140.         EExtState   m_StartState; //initial extension state
  141.         EExtState   m_State; //current extension state
  142.         SMarkDelta()    : m_StartState(eNoExt), m_State(eNoExt)   {}
  143.         SMarkDelta(const TSeqRange& HitR, const TSeqRange& R, EExtState StartS, EExtState S) 
  144.            : m_HitRange(HitR), m_Range(R), m_StartState(StartS), m_State(S)   {}
  145.     };
  146.     
  147.     // helper functions
  148.     bool        x_ModifiersOk()    const;
  149.     TModelUnit  x_MouseToSeqPos();
  150.     TSeqPos     x_ClipPosByRange(TSeqPos Pos);
  151.     bool        x_HitRangeBorder() const;
  152.     
  153.     void    x_InitDeltaMap();
  154.     void    x_HitTest(TNumrow Row, const TRangeColl& C, int X, TSeqRange& Range, bool& bHitStart) const;
  155.     bool    x_HitSelectedLine();
  156.     void    x_UpdateDelta(TSeqRange& R, SMarkDelta::EExtState& State, TSeqPos Pos);
  157.     void    x_UpdateSelection(TSeqPos NewPos);
  158.     void    x_UpdateMarks();
  159.     void    x_UpdateState(bool b_key);
  160.     bool    x_OpKeyPressed()    const;
  161.     void    x_OnSelectCursor();
  162.     const IAlignMarkHandlerHost*    x_GetHost() const {   return m_pHost; }
  163.     IAlignMarkHandlerHost*    x_GetHost() {   return m_pHost; }
  164. protected:    
  165.     typedef map<TNumrow, SMarkDelta>    TRowToDeltaMap;
  166.     TRowToMarkMap   m_mpRowToMark; // Marks
  167.     TRowToDeltaMap  m_mpRowToDelta; // Ranges being edited
  168.     IAlignMarkHandlerHost*  m_pHost;
  169.     CGlPane*    m_pPane;
  170.     bool        m_bHitResizable;
  171.     EState      m_State;   // operation type
  172.     Fl_Cursor   m_Cursor;
  173.     TSeqPos     m_PrevPos;
  174.     
  175.     CGlColor    m_FillColor;
  176.     CGlColor    m_FrameColor;
  177. };
  178. END_NCBI_SCOPE
  179. /*
  180.  * ===========================================================================
  181.  * $Log: align_mark_handler.hpp,v $
  182.  * Revision 1000.3  2004/04/12 18:15:40  gouriano
  183.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.13
  184.  *
  185.  * Revision 1.13  2004/03/17 20:16:56  yazhuk
  186.  * Replaced  #include <..fltk_utils.hpp> with <...gui_event.hpp>
  187.  *
  188.  * Revision 1.12  2004/03/11 17:24:13  dicuccio
  189.  * Use TSeqRange instead of TRange
  190.  *
  191.  * Revision 1.11  2003/12/18 21:12:36  yazhuk
  192.  * Updated code to supported template ISelListModel
  193.  *
  194.  * Revision 1.10  2003/12/10 17:12:09  yazhuk
  195.  * Added colors as data members.
  196.  *
  197.  * Revision 1.9  2003/12/01 16:42:59  yazhuk
  198.  * Refactored event handling - introduced CGUIEvent
  199.  *
  200.  * Revision 1.8  2003/11/17 21:12:00  yazhuk
  201.  * Updated include path for ievent_handler.hpp
  202.  *
  203.  * Revision 1.7  2003/11/06 20:01:09  dicuccio
  204.  * Removed USING_SCOPE(objects)
  205.  *
  206.  * Revision 1.6  2003/10/29 23:23:06  yazhuk
  207.  * Replaced CAlnMultiDataSource with IAlignMultiDataSource
  208.  *
  209.  * Revision 1.5  2003/10/20 15:45:54  yazhuk
  210.  * Inherited from IEventHandler
  211.  *
  212.  * Revision 1.4  2003/10/15 21:22:47  yazhuk
  213.  * Migrated from using CAlnVec to accessing data via "generic" interface in CAlignDataSource.
  214.  *
  215.  * Revision 1.3  2003/10/08 14:12:58  dicuccio
  216.  * Moved CGlPane into opengl
  217.  *
  218.  * Revision 1.2  2003/09/29 13:45:39  yazhuk
  219.  * Added GetMarks()
  220.  *
  221.  * Revision 1.1  2003/09/23 21:18:37  yazhuk
  222.  * Initial revision
  223.  *
  224.  * ===========================================================================
  225.  */
  226. #endif  // GUI_WIDGETS_ALNMULTI___ALIGN_MARK_HANDLER__HPP