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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: command.hpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:50:57  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_UTILS___COMMAND__HPP
  10. #define GUI_UTILS___COMMAND__HPP
  11. /*  $Id: command.hpp,v 1000.4 2004/06/01 19:50:57 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.  */
  39. /// @file command.hpp
  40. /// GUI command routing and handling framework.
  41. ///
  42. /// This frameworks extends FLTK capabilities of handling menu commands by
  43. /// providing a generic command routing mechanism based on command maps.
  44. /// The following are parts of the framework:
  45. /// CCommandTarget class - represents a class capable of handling commands
  46. /// using command maps. 
  47. /// Command map - structure mapping command IDs to handler funtion pointers.
  48. /// IMenu - interface for CCommandTraget compatible menus.
  49.  
  50. #include <corelib/ncbistl.hpp>
  51. #include <corelib/ncbistd.hpp>
  52. #include <gui/gui.hpp>
  53. #include <FL/Fl_Menu_.H>
  54. /** @addtogroup GUI_UTILS
  55.  *
  56.  * @{
  57.  */
  58. BEGIN_NCBI_SCOPE
  59. /// Command ID type
  60. typedef int TCmdID;
  61. /// Definitions for generic commands.
  62. ///
  63. /// Subsytems of GUI should define they own command enumerations, preferable
  64. /// with non-overlapping ranges.
  65. enum EBaseCommands   {
  66.     eCmdInvalid = -1, /// not a valid command
  67.     eCmdNone = 0, /// empty command
  68.     eCmdZoomIn,    
  69.     eCmdZoomOut,
  70.     eCmdZoomAll,
  71.     eCmdZoomInX,
  72.     eCmdZoomOutX,
  73.     eCmdZoomAllX,
  74.     eCmdZoomInY,
  75.     eCmdZoomOutY,
  76.     eCmdZoomAllY,
  77.     eCmdZoomSel, /// Zoom to Selection
  78.     eCmdZoomSeq, /// Zoom to Sequence
  79.     eCmdZoomObjects,
  80.     eCmdZoomSelObjects,
  81.     // insert new command here    
  82.     eBaseCmdLast
  83. };
  84. ////////////////////////////////////////////////////////////////////////////////
  85. /// ICmdUI - interface for updating command GUI elements such as menu itms and
  86. /// tool bar buttons.
  87. class ICmdUI
  88. {
  89. public:
  90.     virtual ~ICmdUI()    {}
  91.     virtual TCmdID  GetCommand() const = 0;
  92.     virtual void    Enable(bool en) = 0;
  93.     virtual void    SetCheck(bool set) = 0;
  94.     virtual void    SetRadio(bool set) = 0;
  95.     virtual void    SetLabel(const string& label) = 0;
  96. };
  97. class CCommandTarget;
  98. /// pointer to a command handler
  99. typedef     void (CCommandTarget::*FCmdHandler) (void);
  100. /// pointer to a command handler
  101. typedef     void (CCommandTarget::*FCmdHandler_ID) (TCmdID);
  102. /// pointer to a command update handler
  103. typedef     void (CCommandTarget::*FUpdateCmdHandler) (ICmdUI*);
  104. /// Command map entry.
  105. ///
  106. /// Used as building block for creating command maps mapping command IDs to handlers.
  107. struct SCmdMapEntry
  108. {
  109.     enum    EHandlerType    {
  110.         eInvalid = 0, 
  111.         eCmd,       // for FCmdHandler or FCmdHandler_ID
  112.         eUpdateCmd  // for FUpdateCmdHandler
  113.     };
  114.     TCmdID          m_CmdID; /// Command ID 
  115.     TCmdID          m_LastCmdID; /// Last Command ID, used to specify ranges
  116.     EHandlerType    m_HandlerType;
  117.     FCmdHandler     m_Handler; /// pointer to command handler mapped to the Command ID
  118. };
  119. /// Command Map.
  120. ///
  121. /// Command Map is used for mapping command IDs to pointers on member functions
  122. /// of CCommandTarget derived classes.  
  123. struct SCmdMap
  124. {
  125.     const SCmdMap*        m_BaseMap; /// pointer to command map of the base class
  126.     const SCmdMapEntry*   m_Entries; /// pointer to array of map entries   
  127. };
  128. // MACRO for declaring and defining command maps
  129. /// Declares Command Map facilities for CCommandTarget-derived class.
  130. /// This macro should be used in the scope of class declaration.
  131. #define DECLARE_CMD_MAP() 
  132. private: 
  133. static const SCmdMapEntry sm_CmdMapEntries[]; 
  134. protected: 
  135. static const SCmdMap    sm_CmdMap; 
  136. virtual const SCmdMap*  GetCommandMap() const; 
  137. /// Begins definition of Command Map for CCommandTarget-derived class.
  138. /// The first parameter is a name of class owning map, the second - 
  139. /// name of the base class (that should also be CCommandTarget-derived).
  140. /// This macro can be followed by multiple ON_COMMAND() macros and 
  141. /// finaly - by the END_CMD_MAP() macro.
  142. #define BEGIN_CMD_MAP(thisClass, baseClass) 
  143. const SCmdMap* thisClass::GetCommandMap() const 
  144. { return &thisClass::sm_CmdMap; } 
  145. const SCmdMap thisClass::sm_CmdMap = 
  146.     { &baseClass::sm_CmdMap, &thisClass::sm_CmdMapEntries[0] }; 
  147. const SCmdMapEntry thisClass::sm_CmdMapEntries[] = 
  148.     { 
  149. /// Ends definition of Command Map.
  150. #define END_CMD_MAP() 
  151. {0, 0, SCmdMapEntry::eInvalid, 0} 
  152. }; 
  153. /// Adds a Command Map entry mapping given command id to given command handler.
  154. #define ON_COMMAND(id, handler) 
  155.     { id, id, SCmdMapEntry::eCmd, (FCmdHandler) handler },
  156. /// Adds a Command Map entry mapping given command range to given command handler.
  157. #define ON_COMMAND_RANGE(id, id_last, handler) 
  158.     { id, id_last, SCmdMapEntry::eCmd, (FCmdHandler) ((FCmdHandler_ID) handler) },
  159. /// Adds a Command Map entry mapping given command id to given command update handler.
  160. #define ON_UPDATE_COMMAND_UI(id, handler) 
  161.     { id, id, SCmdMapEntry::eUpdateCmd, (FCmdHandler) ((FUpdateCmdHandler) handler) },
  162. #define ON_UPDATE_COMMAND_UI_RANGE(id, id_last, handler) 
  163.     { id, id_last, SCmdMapEntry::eUpdateCmd, (FCmdHandler) ((FUpdateCmdHandler) handler) },
  164. ////////////////////////////////////////////////////////////////////////////////
  165. /// Class CCommandTarget - the base class for all classes handling commands.
  166. /// This class provides virtual functions that can be overridden in derived classes.
  167. /// However, in most cases this is not necessary. Derived classes can customize 
  168. /// command handling by defining a Command Map.
  169. class NCBI_GUIUTILS_EXPORT CCommandTarget
  170. {
  171. public:
  172.     virtual ~CCommandTarget() { }
  173.     /// Callback to be used by FLTK menu mechanism.
  174.     static void     OnFlMenuCommand(Fl_Menu_* menu, void* user_data);
  175.     virtual bool    OnCommand(const TCmdID cmd);
  176.     virtual bool    OnUpdateCommand(const TCmdID cmd, ICmdUI* pCmdUI);
  177.     virtual bool    AddChildCmdTarget(CCommandTarget* target);
  178.     virtual bool    RemoveChildCmdTarget(CCommandTarget* target);
  179. protected:
  180.     /// Default command handler.
  181.     /// Tries to processes given command and returns "true" if command has been
  182.     /// processed. Can be overriden in derived classes. Default implementation 
  183.     /// uses command map to locate appropriate command handler by given command
  184.     /// ID and calls the handler. If handler cannot be found - function returns
  185.     /// "false".
  186.     virtual bool    x_HandleCommand(const TCmdID cmd);
  187.     virtual bool    x_UpdateCommand(const TCmdID cmd, ICmdUI* pCmdUI);
  188.     /// Passes command to children, returns "true" if command has been handled
  189.     /// by one of the children.
  190.     virtual bool    x_ChildrenHandleCommand(const TCmdID cmd);
  191.     virtual bool    x_ChildrenUpdateCommand(const TCmdID cmd, ICmdUI* pCmdUI);
  192.     DECLARE_CMD_MAP();
  193. protected:
  194.     typedef list<CCommandTarget*>   TChildTargets;
  195.     TChildTargets   m_ChildTargets;
  196. };
  197. /// Default callback for use FLTK menus
  198. #define CMD_TARGET_FL_CALLBACK() 
  199.     (Fl_Callback*) CCommandTarget::OnFlMenuCommand 
  200. ////////////////////////////////////////////////////////////////////////////////
  201. // Interface IMenu
  202. /// Interface for CCommandTarget-aware menus.
  203. class NCBI_GUIUTILS_EXPORT IMenu
  204. {
  205. public:
  206.     virtual ~IMenu()    {};
  207.     virtual void    SetCmdTarget(CCommandTarget* target) = 0;
  208.     virtual CCommandTarget*    GetCmdTarget() = 0;
  209. };
  210. END_NCBI_SCOPE
  211. /* @} */
  212. /*
  213.  * ===========================================================================
  214.  * $Log: command.hpp,v $
  215.  * Revision 1000.4  2004/06/01 19:50:57  gouriano
  216.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  217.  *
  218.  * Revision 1.10  2004/05/03 19:40:39  yazhuk
  219.  * Extended command handling to support command updates
  220.  *
  221.  * Revision 1.9  2004/05/03 12:41:09  dicuccio
  222.  * Split library into gui_utils and gui_objutils.  Added #include for gui/gui.hpp
  223.  *
  224.  * Revision 1.8  2004/04/16 14:27:17  dicuccio
  225.  * Added doxygen module tag
  226.  *
  227.  * Revision 1.7  2004/02/12 21:48:19  yazhuk
  228.  * Added new and reordered existing commands
  229.  *
  230.  * Revision 1.6  2004/01/21 12:34:21  dicuccio
  231.  * Added virtual dtor
  232.  *
  233.  * Revision 1.5  2004/01/15 20:07:15  yazhuk
  234.  * Moved most menu-related code to gui/widgets/gl/menu.hpp, changed IMenu
  235.  *
  236.  * Revision 1.4  2004/01/08 19:35:56  yazhuk
  237.  * Added to CCommandTarget support for child targets. Added MENU_SEPARATOR macro.
  238.  * Added comments.
  239.  *
  240.  * revision 1.3  2003/11/17 22:51:23  yazhuk
  241.  * Added new Zoom commands
  242.  *
  243.  * revision 1.2  2003/10/15 21:11:54  yazhuk
  244.  * Added eBaseCmdLast to EBaseCommands
  245.  *
  246.  * revision 1.1  2003/10/03 16:01:23  yazhuk
  247.  * Initial revision
  248.  *
  249.  * ===========================================================================
  250.  */
  251. #endif  // GUI_UTILS___COMMAND__HPP