commands.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:14k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * commands.h
  3.  *
  4.  * User command processing classes.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: commands.h,v $
  30.  * Revision 1.11  1999/03/10 03:49:51  robertj
  31.  * More documentation adjustments.
  32.  *
  33.  * Revision 1.10  1999/03/09 08:01:48  robertj
  34.  * Changed comments for doc++ support (more to come).
  35.  *
  36.  * Revision 1.9  1999/02/16 08:08:45  robertj
  37.  * MSVC 6.0 compatibility changes.
  38.  *
  39.  * Revision 1.8  1998/10/15 05:41:32  robertj
  40.  * New memory leak check code.
  41.  *
  42.  * Revision 1.7  1998/09/23 06:23:11  robertj
  43.  * Added open source copyright license.
  44.  *
  45.  * Revision 1.6  1997/07/08 13:02:07  robertj
  46.  * DLL support.
  47.  *
  48.  * Revision 1.5  1996/08/17 10:00:30  robertj
  49.  * Changes for Windows DLL support.
  50.  *
  51.  * Revision 1.4  1995/10/14 14:54:37  robertj
  52.  * Fixed bug in command value callback.
  53.  *
  54.  * Revision 1.3  1995/06/17 11:12:25  robertj
  55.  * Documentation update.
  56.  *
  57.  * Revision 1.2  1995/03/14 12:41:11  robertj
  58.  * Updated documentation to use HTML codes.
  59.  *
  60.  * Revision 1.1  1995/02/21  11:24:57  robertj
  61.  * Initial revision
  62.  *
  63.  */
  64. #ifndef _PCOMMANDS
  65. #define _PCOMMANDS
  66. #ifdef __GNUC__
  67. #pragma interface
  68. #endif
  69. ///////////////////////////////////////////////////////////////////////////////
  70. // PCommandSink
  71. /**This class represents a command sink. This works in conjunction with the
  72.    Ref{PCommandSource} and Ref{PCommandManager} classes to implement
  73.    dynamically bound commands on Ref{PTopLevelWindow} or Ref{PMDIDocWindow}
  74.    classes.
  75.    The user does not directly create descendents of this abstract class. These
  76.    are created by a series of macros that are used in the declaration of the
  77.    users Ref{PTopLevelWindow} or Ref{PMDIDocWindow} class descendent.
  78.    To create a command sink, use one of the following macros:
  79.       Ref{PDECLARE_COMMAND_X} 
  80.       Ref{PDECLARE_COMMAND_XE} 
  81.       Ref{PDECLARE_COMMAND_XS} 
  82.       Ref{PDECLARE_COMMAND_XES} 
  83.       Ref{PDECLARE_COMMAND} 
  84.       Ref{PDECLARE_COMMAND_ENABLE} 
  85.       Ref{PDECLARE_COMMAND_VALUE} 
  86.       Ref{PDECLARE_COMMAND_FULL} 
  87.  */
  88. class PCommandSink : public PObject
  89. {
  90.   PCLASSINFO(PCommandSink, PObject);
  91.   public:
  92.    /**This constructor is used for instances created by the declaration macros
  93.        within the window class. There is actually no instance data it is merely
  94.        a place holder for the virtual function call.
  95.      */
  96.     PCommandSink() { }
  97.    /**Execute the command. The overridden version of this function will
  98.        execute the member function on the #wind# parameter. The
  99.        override and code to do this is generated by the command declaration
  100.        macros.
  101.      */
  102.     virtual void Execute(
  103.       PTitledWindow * wind  /// Window instance to receive the command.
  104.     ) const  = 0;
  105.    /**Determine the commands enable state. The overridden version of this
  106.        function will execute the member function on the #wind#
  107.        parameter. The override and code to do this is generated by the command
  108.        declaration macros.
  109.      */
  110.     virtual BOOL Enabled(
  111.       PTitledWindow * wind  /// Window instance to receive the command.
  112.     ) const;
  113.    /**Determine the commands value state. The overridden version of this
  114.        function will execute the member function on the #wind#
  115.        parameter. The override and code to do this is generated by the command
  116.        declaration macros.
  117.      */
  118.     virtual PINDEX Value(
  119.       PTitledWindow * wind  /// Window instance to receive the command.
  120.     ) const;
  121.   protected:
  122.    /**Register the command name which is attached to the specific window
  123.        class. This allows the same command, eg "save", to have a different
  124.        implementation depending on the class of the window, eg when several
  125.        different types of MDI child window are used.
  126.      */
  127.     PCommandSink(
  128.       const char * className,
  129.      /**Name of the window class that the command sink descendent was
  130.          declared within.
  131.        */
  132.       const char * commandName /// Arbitrary name of the command.
  133.     );
  134. };
  135. #define PDECLARE_COMMAND_START(name, cls, func) 
  136.   class func##_PCommand : public PCommandSink { 
  137.     public: 
  138.       func##_PCommand() 
  139.         { PNEW func##_PCommand(cls::Class(), name); } 
  140.       func##_PCommand(const char * className, const char * commandName) 
  141.         : PCommandSink(className, commandName) { } 
  142.       virtual void Execute(PTitledWindow * wind) const 
  143.         { ((cls*)wind)->func(); } 
  144. #define PDECLARE_COMMAND_END(func) 
  145.   } func##_PCommandInstance; 
  146.   friend class func##_PCommand
  147. /**Declare a command.
  148.   This macro declares a descendent class of Ref{PCommandSink} which is
  149.   attached to a Ref{PTopLevelWindow} or Ref{PMDIDocWindow} instance.
  150.   This version only allows the command to be executed. It is assumed that the
  151.   command is always enabled and has a value state of zero.
  152.   
  153.   This version also assumes the member function #func# is declared
  154.   elsewhere.
  155. */
  156. #define PDECLARE_COMMAND_X(name, cls, func) 
  157.   PDECLARE_COMMAND_START(name, cls, func) 
  158.   PDECLARE_COMMAND_END(func)
  159. /**Declare a command.
  160.   This macro declares a descendent class of Ref{PCommandSink} which is
  161.   attached to a Ref{PTopLevelWindow} or Ref{PMDIDocWindow} instance.
  162.   This version allows the command to be executed and use a function to
  163.   detemine if it is currently enabled. It is assumed that the command always
  164.   has a value state of zero.
  165.   
  166.   This version also assumes the member functions #func# and
  167.   #enab# are declared elsewhere.
  168. */
  169. #define PDECLARE_COMMAND_XE(name, cls, func, enab) 
  170.   PDECLARE_COMMAND_START(name, cls, func) 
  171.     virtual BOOL Enabled(PTitledWindow * wind) const 
  172.       { return ((cls*)wind)->enab(); } 
  173.   PDECLARE_COMMAND_END(func)
  174. /**Declare a command.
  175.   This macro declares a descendent class of Ref{PCommandSink} which is
  176.   attached to a Ref{PTopLevelWindow} or Ref{PMDIDocWindow} instance.
  177.   This version allows the command to be executed and use a function to
  178.   detemine its current value state. It is assumed that the command is always
  179.   enabled.
  180.   
  181.   This version also assumes the member functions #func# and
  182.   #val# are declared elsewhere.
  183. */
  184. #define PDECLARE_COMMAND_XS(name, cls, func, val) 
  185.   PDECLARE_COMMAND_START(name, cls, func) 
  186.     virtual PINDEX Value(PTitledWindow * wind) const 
  187.       { return ((cls*)wind)->val(); } 
  188.   PDECLARE_COMMAND_END(func)
  189. /**Declare a command.
  190.   This macro declares a descendent class of Ref{PCommandSink} which is
  191.   attached to a Ref{PTopLevelWindow} or Ref{PMDIDocWindow} instance.
  192.   This version allows the command to be executed, use a function to detemine if
  193.   it is enabled and use a function to detemine its current value state.
  194.   
  195.   This version also assumes the member functions #func#,
  196.   #enab# and #val# are declared elsewhere.
  197. */
  198. #define PDECLARE_COMMAND_XES(name, cls, func, enab, val) 
  199.   PDECLARE_COMMAND_START(name, cls, func) 
  200.     virtual BOOL Enabled(PTitledWindow * wind) const 
  201.       { return ((cls*)wind)->enab(); } 
  202.     virtual PINDEX Value(PTitledWindow * wind) const 
  203.       { return ((cls*)wind)->val(); } 
  204.   PDECLARE_COMMAND_END(func)
  205. /**Declare a command.
  206.   This macro declares a descendent class of Ref{PCommandSink} which is
  207.   attached to a Ref{PTopLevelWindow} or Ref{PMDIDocWindow} instance.
  208.   This version only allows the command to be executed. It is assumed that the
  209.   command is always enabled and has a value state of zero.
  210.   
  211.   This version also declares the member function #func#.
  212. */
  213. #define PDECLARE_COMMAND(name, cls, func) 
  214.   virtual void func(); 
  215.   PDECLARE_COMMAND_X(name, cls, func) 
  216. /**Declare a command.
  217.   This macro declares a descendent class of Ref{PCommandSink} which is
  218.   attached to a Ref{PTopLevelWindow} or Ref{PMDIDocWindow} instance.
  219.   This version allows the command to be executed, and use a function to
  220.   detemine if it is currently enabled. It is assumed that the command always
  221.   has a value state of zero.
  222.   This version also declares the member functions #func# and
  223.   #enab#.
  224. */
  225. #define PDECLARE_COMMAND_ENABLE(name, cls, func, enab) 
  226.   virtual void func(); 
  227.   virtual BOOL enab(); 
  228.   PDECLARE_COMMAND_XE(name, cls, func, enab)
  229. /**Declare a command.
  230.   This macro declares a descendent class of Ref{PCommandSink} which is
  231.   attached to a Ref{PTopLevelWindow} or Ref{PMDIDocWindow} instance.
  232.   This version allows the command to be executed and use a function to
  233.   detemine its current value state. It is assumed that the command is always
  234.   enabled.
  235.   
  236.   This version also declares the member functions #func# and
  237.   #val#.
  238. */
  239. #define PDECLARE_COMMAND_VALUE(name, cls, func, val) 
  240.   virtual void func(); 
  241.   virtual PINDEX val(); 
  242.   PDECLARE_COMMAND_XS(name, cls, func, val)
  243. /**Declare a command.
  244.   This macro declares a descendent class of Ref{PCommandSink} which is
  245.   attached to a Ref{PTopLevelWindow} or Ref{PMDIDocWindow} instance.
  246.   This version allows the command to be executed, use a function to detemine if
  247.   it is enabled and use a function to detemine its current value state.
  248.   
  249.   This version also declares the member functions #func#,
  250.   #enab# and #val#.
  251. */
  252. #define PDECLARE_COMMAND_FULL(name, cls, func, enab, val) 
  253.   virtual void func(); 
  254.   virtual BOOL enab(); 
  255.   virtual PINDEX val(); 
  256.   PDECLARE_COMMAND_XES(name, cls, func, enab, val)
  257. ///////////////////////////////////////////////////////////////////////////////
  258. // PCommandSource
  259. /**This class represents a command source. This works in conjunction with the
  260.    Ref{PCommandSink} and Ref{PCommandManager} classes to implement
  261.    dynamically bound commands on Ref{PTopLevelWindow} or Ref{PMDIDocWindow}
  262.    classes.
  263.    The user does not directly create descendents of this class. Instances of
  264.    this class are created by the Ref{PCREATE_COMMAND} macro. These are
  265.    instances of the Ref{PNotifier} class and may be attached to
  266.    Ref{PMenuItem} or Ref{PControl} instances via the
  267.    Ref{PControl::SetNotifier()} function in the same way as other callback
  268.    functions.
  269.  */
  270. class PCommandSource : public PNotifierFunction
  271. {
  272.   PCLASSINFO(PCommandSource, PNotifierFunction);
  273.   public:
  274.    /**Create a command source notifier that will connect a Ref{PCommandSink}
  275.        using the same command name string.
  276.      */
  277.     PCommandSource(
  278.       const char * commandName    /// Name of the command to call.
  279.     );
  280.    /**Notifier class callback function. This will connect to the
  281.        Ref{PCommandSink} of the same command name by using the information in
  282.        the Ref{PCommandManager} instance contained in the Ref{PApplication}
  283.        descendent instance.
  284.        The appropriate callback function, execute, enable or value is called
  285.        according to the value of the #extra# field.
  286.      */
  287.     virtual void Call(
  288.       PObject & notifier,   /// Object executing the notification.
  289.       INT extra             /// Extra information about the notification.
  290.     ) const;
  291.   protected:
  292.     /** Name of the command to execute. */
  293.     PString name;
  294. };
  295. /**Create command instance.
  296.   This macro creates an instance of the Ref{PCommandSource} smart pointer.
  297.   This may be passed to any command source, eg menu item, which accepts a
  298.   Ref{PNotifier} instance.
  299. */
  300. #define PCREATE_COMMAND(name) PNotifier(new PCommandSource(name))
  301. ///////////////////////////////////////////////////////////////////////////////
  302. // PCommandManager
  303. /**This class represents a manager for command sources and sinks. This works in
  304.    conjunction with the Ref{PCommandSink} and Ref{PCommandSource} classes
  305.    to implement dynamically bound commands on Ref{PTopLevelWindow} or
  306.    Ref{PMDIDocWindow} classes.
  307.    The Ref{PApplication} class contains a single instance of this class. This
  308.    will contain all of the registered command sinks. When a command source
  309.    executes a command, this database is consulted to locate the command sink
  310.    that will actually execute the command functions.
  311.  */
  312. class PCommandManager : public PObject
  313. {
  314.   PCLASSINFO(PCommandManager, PObject);
  315.   public:
  316.     /** Register the command sink. */
  317.     void Register(
  318.       const char * className,
  319.      /**Name of the Ref{PTitledWindow} class the Ref{PCommandSink} is
  320.          declared in.
  321.        */
  322.       const char * commandName,  /// Name of the command.
  323.       PCommandSink * sink
  324.     );
  325.    /**Locate the command sink that was registered with the specified
  326.        attributes.
  327.      */
  328.     PCommandSink * Find(
  329.       const PString & className,
  330.      /**Name of the Ref{PTitledWindow} class the Ref{PCommandSink} is
  331.          declared in.
  332.        */
  333.       const PString & commandName  /// Name of the command.
  334.     );
  335.   private:
  336.     PDICTIONARY(CommandsByName, PString, PCommandSink);
  337.     PDICTIONARY(CommandsByClass, PString, CommandsByName);
  338.     CommandsByClass commands;
  339. };
  340. #endif  /// _PCOMMANDS
  341. // End Of File ///////////////////////////////////////////////////////////////