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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: linear_sel_handler.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 18:16:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef __GUI_WIDGETS_ALNMULTI___LINEAR_SEL_HANDLER__HPP
  10. #define __GUI_WIDGETS_ALNMULTI___LINEAR_SEL_HANDLER__HPP
  11. /*  $Id: linear_sel_handler.hpp,v 1000.1 2004/04/12 18:16:31 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.  *
  40.  */
  41. #include <corelib/ncbistl.hpp>
  42. #include <gui/opengl/glbitmapfont.hpp>
  43. #include <gui/opengl/glpane.hpp>
  44. #include <gui/widgets/gl/ievent_handler.hpp>
  45. #include <util/range_coll.hpp>
  46. BEGIN_NCBI_SCOPE
  47. ////////////////////////////////////////////////////////////////////////////////
  48. /// class ISelHandlerHost
  49. class NCBI_GUIWIDGETS_GL_EXPORT ISelHandlerHost
  50. {
  51. public:
  52.     virtual ~ISelHandlerHost();
  53.     virtual void SHH_Redraw() = 0;
  54.     virtual TModelUnit  SHH_GetModelByWindow(int z, EOrientation orient) = 0;
  55.     virtual TVPUnit     SHH_GetWindowByModel(TModelUnit z, EOrientation orient) = 0;
  56. };
  57. ////////////////////////////////////////////////////////////////////////////////
  58. /// Class CLinearSelHandler represents in GUI a one-dimnesional multi-segment
  59. /// selection. CLinearSelHandler renders the selection in a given CGlPane and
  60. /// allows to interactively modify the selection.
  61. ///
  62. /// CLinearSelHandler implements IEventHandler what makes it compatible with
  63. /// IEventHandler-supproting widgets.
  64. /// CLinearSelHandler provides API for programmatical manipulation of the 
  65. //  selection.
  66. class   NCBI_GUIWIDGETS_GL_EXPORT   CLinearSelHandler : public IEventHandler
  67. {
  68. public:
  69.     typedef CRangeCollection<TSeqPos>   TRangeColl;
  70.     enum    ERenderingOption
  71.     {
  72.         eActiveState,
  73.         ePassiveState
  74.     };
  75.     
  76.     enum EColorType {
  77.         eSelection,
  78.         ePasssiveSelection,
  79.         eSymbol
  80.     };
  81. public:    
  82.     CLinearSelHandler(EOrientation orient = eHorz);
  83.     virtual ~CLinearSelHandler();
  84.     void    SetHost(ISelHandlerHost* pHost);
  85.     
  86.     void    Render(CGlPane& Pane, ERenderingOption option = eActiveState);
  87.     /// IEventHandler implementation.
  88.     virtual int     handle(CGUIEvent& event, CGlPane& Pane);    
  89.     // colors
  90.     void    SetColor(EColorType type, const CGlColor& color);
  91.     
  92.     // commands
  93.     TSeqRange  GetSelectionLimits()    const;
  94.     const   TRangeColl&   GetSelection() const;    
  95.     void    SetSelection(const TRangeColl& C, bool bRedraw);
  96.     void    ResetSelection(bool bRedraw);     
  97. protected:
  98.     // user event handlers - translate event to signals
  99.     int x_OnMousePush(CGUIEvent& event, CGlPane& Pane);
  100.     int x_OnMouseDrag(CGUIEvent& event, CGlPane& Pane);
  101.     int x_OnMouseRelease(CGUIEvent& event, CGlPane& Pane);
  102.     int x_OnMouseMove(CGUIEvent& event, CGlPane& Pane);
  103.     int x_OnKeyDown(CGUIEvent& event);
  104.     int x_OnKeyUp(CGUIEvent& event);
  105.     // signal handlers - invoked by event handlers
  106.     void    x_OnStartSel(CGUIEvent& event);
  107.     void    x_OnChangeSelRange();
  108.     void    x_OnEndSelRange();
  109.     void    x_OnResetAll();
  110.     void    x_OnOpChange(CGUIEvent& event);
  111.     void    x_OnSelectCursor();
  112.     void    x_SetCursor();
  113. protected:
  114.     enum    EExtState   {   
  115.         eNoExt,
  116.         eExtRangeStart,
  117.         eExtRangeEnd
  118.     };
  119.     enum    EOpType {
  120.         eNoOp,
  121.         eAdd,
  122.         eRemove,
  123.         eChange    
  124.     };
  125.     EOpType     x_GetOpTypeByEvent(CGUIEvent& event)    const;
  126.     TModelUnit  x_MouseToSeqPos();
  127.     TSeqPos     x_ClipPosByRange(TSeqPos Pos);
  128.     void    x_HitTest(TSeqRange& Range, bool& bHitStart);
  129.     void    x_AddToSelection(const TSeqRange& Range);
  130.     void    x_RemoveFromSelection(const TSeqRange& Range);
  131. private:
  132.     EOrientation    m_Orientation;
  133.     TRangeColl  m_Selection;
  134.     TSeqRange      m_CurrRange; // range being modified
  135.     EExtState   m_ExtState; // current range extension state
  136.     EOpType     m_OpType;   // operation type
  137.     bool        m_bResizeCursor;
  138.     ISelHandlerHost* m_pHost;
  139.     CGlColor    m_SelColor;
  140.     CGlColor    m_PassiveSelColor;
  141.     CGlColor    m_SymbolColor;
  142.     CGlBitmapFont   m_Font;
  143.     CGlPane*    m_pPane;
  144. };
  145. END_NCBI_SCOPE
  146. /*
  147.  * ===========================================================================
  148.  * $Log: linear_sel_handler.hpp,v $
  149.  * Revision 1000.1  2004/04/12 18:16:31  gouriano
  150.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.3
  151.  *
  152.  * Revision 1.3  2004/03/11 17:23:04  dicuccio
  153.  * Use TSeqRange instead of TRange
  154.  *
  155.  * Revision 1.2  2004/02/09 13:48:51  lebedev
  156.  * Added  methods for customizing selection colors
  157.  *
  158.  * Revision 1.1  2003/12/01 16:33:00  yazhuk
  159.  * Former alnmulti_sel_handler.hpp moved to gui/widgets/gl
  160.  *
  161.  * Revision 1.7  2003/11/17 21:15:39  yazhuk
  162.  * Updated include for ievent_handler.hpp
  163.  *
  164.  * Revision 1.6  2003/10/20 15:45:44  yazhuk
  165.  * Inherited from IEventHandler
  166.  *
  167.  * Revision 1.5  2003/10/08 14:12:58  dicuccio
  168.  * Moved CGlPane into opengl
  169.  *
  170.  * Revision 1.4  2003/09/23 21:07:56  yazhuk
  171.  * Added #include <corelib/ncbistl.hpp>, removed x_ModifiersOk()
  172.  * and x_ClipPosByRange() declarations
  173.  *
  174.  * Revision 1.3  2003/09/10 20:48:45  yazhuk
  175.  * Introduced data members for colors and  font. Added SHH_GetSeqPosByX() function
  176.  *
  177.  * Revision 1.2  2003/09/08 20:43:14  yazhuk
  178.  * Changed interface for working with Selection
  179.  *
  180.  * Revision 1.1  2003/09/08 16:34:21  yazhuk
  181.  * Initial revision
  182.  *
  183.  *
  184.  * ===========================================================================
  185.  */
  186. #endif  // __GUI_WIDGETS_ALNMULTI___LINEAR_SEL_HANDLER__HPP