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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: gui_event.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:51:12  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_CORE___GUI_EVENT__HPP
  10. #define GUI_CORE___GUI_EVENT__HPP
  11. /*  $Id: gui_event.hpp,v 1000.2 2004/06/01 19:51:12 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. #include <corelib/ncbiobj.hpp>
  41. #include <gui/gui.hpp>
  42. #include <map>
  43. #include <vector>
  44. #include <set>
  45. /** @addtogroup GUI_UTILS
  46.  *
  47.  * @{
  48.  */
  49. BEGIN_NCBI_SCOPE
  50. class NCBI_GUIUTILS_EXPORT CFltkEvent
  51. {
  52. public:
  53.     // enumerated flags for events
  54.     enum FEventFlags {
  55.         fLeftMouse          = 0x0001,
  56.         fMiddleMouse        = 0x0002,
  57.         fRightMouse         = 0x0004,
  58.         fShift              = 0x0008,
  59.         fCtrl               = 0x0010,
  60.         fAlt                = 0x0020,
  61.         fMeta               = 0x0040,
  62.         fDoubleClick        = 0x0080,
  63.         fShiftLeftMouse     = (fShift | fLeftMouse),
  64.         fShiftMiddleMouse   = (fShift | fMiddleMouse),
  65.         fShiftRightMouse    = (fShift | fRightMouse),
  66.         fCtrlLeftMouse      = (fCtrl | fLeftMouse),
  67.         fCtrlMiddleMouse    = (fCtrl | fMiddleMouse),
  68.         fCtrlRightMouse     = (fCtrl | fRightMouse),
  69.         fAltLeftMouse       = (fAlt | fLeftMouse),
  70.         fAltMiddleMouse     = (fAlt | fMiddleMouse),
  71.         fAltRightMouse      = (fAlt | fRightMouse),
  72.         fMetaLeftMouse      = (fMeta | fLeftMouse),
  73.         fMetaMiddleMouse    = (fMeta | fMiddleMouse),
  74.         fMetaRightMouse     = (fMeta | fRightMouse)
  75.     };
  76.     typedef int TEvent;    // bitmask of FEvent
  77.     // enumerated states for processed events
  78.     enum EEvent {
  79.         eNoState,
  80.         eSelectState,
  81.         eMultiSelectState,
  82.         ePopupState,
  83.         eRotateState,
  84.         eZoomState,
  85.         ePanState
  86.     };
  87.     // Access the current event state.
  88.     // This is a composed and processed listing of the current states as
  89.     // reported by FLTK.  This function is provided as a convenience for
  90.     // standardizing forms of interaction as well as for better use in switch()
  91.     // statements.
  92.     static TEvent GetEvent         (void);
  93.     static EEvent GetProcessedEvent(void);
  94.     // Accessors to remap the current event states.
  95.     // These are guaranteed (internally) to be unique and consistent.  True is
  96.     // returned if the state was successfully set.
  97.     static void   SetState(EEvent, TEvent);
  98.     static TEvent GetState(EEvent);
  99.     // Set up a standard set of OS-dependent mouse bindings.
  100.     // Here we hide some of the complexity of dealing with OSs that support
  101.     // odd-numbered buttons (i.e., MacOS = 1, Windows = 2, Unix = 3 button
  102.     // mice).
  103.     static void SetOSDefaults(void);
  104. private:
  105.     // cache of user-remappable event states
  106.     typedef map<TEvent, EEvent> TEventMap;
  107.     static TEventMap sm_EventMap;
  108. };
  109. /// CGUIEvent provides mapping of FLTK events to Semantic Events.
  110. ///
  111. /// Goals: 
  112. /// 1. To isolate programs from the complexities of platform-dependent bindings of 
  113. /// mouse and keyboard events to Actions.
  114. /// 2. To simplify event handling in programs by mapping multiple FLTK events to
  115. /// a single Semantic Event (for instance 'Ctrl'+C and 'Ctrl'+'Ins' - > eCopy)
  116. /// 3. To provide uniform and consistent mapping of Events to Actions controlled
  117. /// in one place.
  118. /// 4. To provide workarounds for some deficiencies of FLTK event handling system.
  119. ///
  120. /// CGUIEvent support two type of Semantic Events - mouse events and shortcuts. 
  121. /// Both types of events may emit Signals depending on the current state of modifiers
  122. /// , however, there is a significant difference in a way mapping is declared.
  123. ///
  124. /// States for mouse events are explicintly declared and registered in CGUIEvent using
  125. /// RegisterState() function. Then it is possible to bind a Signal to a particular mouse
  126. /// Event depending on the current State. States for mouse events represent different
  127. /// GUI modes, user enter a mode by pressing a combination of modifier keys and remains
  128. /// in this mode by holding the keys pressed. 
  129. ///
  130. /// Shortcuts also depend on pressed modifiers, but defining Shortcuts does not require
  131. /// registering special states. RegisterShortcut() function takes a combination of 
  132. /// modifiers and an action key. If action key is pressed while specified combination of
  133. /// modifiers is being hold - CGUIEvent generates a Signal corresponding to shortcut.
  134. /// Handling shortcuts does not change current state and so do not interfere with handling
  135. /// of mouse events.
  136. class  NCBI_GUIUTILS_EXPORT CGUIEvent
  137. {
  138. public:
  139.     enum EModifierFlags {
  140.         fShift              = 0x0001,
  141.         fCtrl               = 0x0002,
  142.         fAlt                = 0x0004,
  143.         fMeta               = 0x0008,
  144.         fModifiersMask  = fShift | fCtrl | fAlt | fMeta
  145.     };
  146.     enum EMouseEvent {
  147.         eNone,
  148.         eMouseMove,
  149.         eLeftMousePush,
  150.         eLeftMouseDrag,
  151.         eLeftMouseRelease,
  152.         eMiddleMousePush,
  153.         eMiddleMouseDrag,
  154.         eMiddleMouseRelease,
  155.         eRightMousePush,
  156.         eRightMouseDrag,
  157.         eRightMouseRelease
  158.     };
  159.     enum EGUIState {
  160.         // default state
  161.         eDefaultState,
  162.         // selection states
  163.         eSelectState,
  164.         eSelectIncState,
  165.         eSelectExtState,
  166.         eSelectAltState,
  167.         eSelectAllState,
  168.         // mouse-mediated states (in general)
  169.         ePopupState,
  170.         eZoomState,
  171.         ePanState,
  172.         eZoomRectState,
  173.         eMarkState,
  174.         // cut/copy/paste
  175.         eCopyState,
  176.         ePasteState,
  177.         eCutState,
  178.         eUndoState,
  179.         eRedoState,
  180.         // delete events
  181.         eDeleteState,
  182.         
  183.         // Zoom In/Out
  184.         eInsZoomStateIn,
  185.         eInsZoomStateOut,
  186.         
  187.         // Lense zoom state
  188.         eLensZoomState,
  189.     };
  190.     enum EGUISignal {
  191.         eDefaultSignal = 0,
  192.         eSelectSignal,
  193.         ePopupSignal,
  194.         ePush,
  195.         eDrag,
  196.         eRelease,
  197.         eMenuActivateSignal,
  198.         eZoomInSignal,
  199.         eZoomOutSignal,
  200.         eZoomAllSignal
  201.     };
  202. public:
  203.     CGUIEvent();
  204.     void    OnFLTKEvent(int event);
  205.     
  206.     EGUIState    GetGUIState() const;
  207.     EGUISignal   GetGUISignal() const;
  208.     /// return FLTK event identifier
  209.     int     GetFLTKEvent() const; 
  210.     
  211.     /// registers State for mouse event
  212.     void    RegisterState(EGUIState state, int mod_flags, int key);
  213.     /// registers Signal for mouse events
  214.     void    RegisterSignal(EGUISignal signal, EGUIState state, EMouseEvent event);
  215.     /// register keyboard shortcut
  216.     void    RegisterShortcut(EGUISignal signal, int mod_flags, int key);
  217.     /// Registers default states and signals with proper OS-dependen bindings
  218.     void    StandardConfig();
  219.     int     GetAccelByEvent();
  220. protected:
  221.     typedef int     TModTemplate;
  222.     typedef int     TEventTemplate; /// template for mouse events
  223.     typedef int     TShortcutTemplate; /// template for shortcuts
  224.     typedef map<TModTemplate, EGUIState>   TTemplToState;
  225.     typedef map<TEventTemplate, EGUISignal>     TTemplToSignal;
  226.     typedef map<TShortcutTemplate, EGUISignal>  TTemplToShortcut;
  227.     void    x_UpdateEventState();
  228.     void    x_OnKeyPressed();
  229.     void    x_OnKeyReleased();
  230.     
  231.     TModTemplate    x_EncodeModTemplate(int mod_flags, int key) const;    
  232.     TEventTemplate  x_EncodeEventTemplate(EGUIState state, EMouseEvent event) const;    
  233.     
  234.     TModTemplate    x_EncodeShortcutTemplate(int mod_flags, int key) const;    
  235.     
  236. protected:            
  237.     typedef set<int>    TKeySet;
  238.     TKeySet     m_stPressedKeys;
  239.     int             m_LastFLTKEvent;
  240.     int             m_Modifiers;
  241.     EMouseEvent     m_MouseEvent;
  242.     
  243.     TTemplToState   m_TemplToState;
  244.     TTemplToSignal  m_TemplToSignal; // Mouse Event template -> Mouse Event signal
  245.     
  246.     TTemplToShortcut  m_TemplToShortcut; // Shortcut template -> Shortcut signal
  247.     
  248.     EGUIState       m_GUIState;
  249.     EGUISignal      m_GUISignal;
  250.     
  251. };
  252. END_NCBI_SCOPE
  253. /* @} */
  254. /*
  255.  * ===========================================================================
  256.  * $Log: gui_event.hpp,v $
  257.  * Revision 1000.2  2004/06/01 19:51:12  gouriano
  258.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  259.  *
  260.  * Revision 1.6  2004/05/13 17:17:58  yazhuk
  261.  * Added support for accelerators
  262.  *
  263.  * Revision 1.5  2004/05/03 12:41:09  dicuccio
  264.  * Split library into gui_utils and gui_objutils.  Added #include for gui/gui.hpp
  265.  *
  266.  * Revision 1.4  2004/04/16 14:27:17  dicuccio
  267.  * Added doxygen module tag
  268.  *
  269.  * Revision 1.3  2004/04/05 14:39:16  yazhuk
  270.  * Implemented support for Shortcuts
  271.  *
  272.  * Revision 1.2  2004/03/23 13:35:33  dicuccio
  273.  * Added new state (eDeleteState)
  274.  *
  275.  * Revision 1.1  2004/03/17 19:50:38  yazhuk
  276.  * Moved from fltk_utils.hpp
  277.  *
  278.  * ===========================================================================
  279.  */
  280. #endif  // GUI_CORE___GUI_EVENT__HPP