oracular (3) Command.3U.gz

Provided by: ivtools-dev_2.0.11d.a1-3build6_amd64 bug

NAME

       Command - base class for command objects

SYNOPSIS

       #include <Unidraw/Commands/command.h>

DESCRIPTION

       Command  is  an  abstract  base class for objects that define operations on components and other objects.
       Commands are similar to messages in traditional object-oriented systems in that  components  can  receive
       and  respond  to  them.  Commands can also be executed in isolation to perform arbitrary computation, and
       they can reverse the effects of such execution to support undo.

       Some commands (termed purely interpretive commands) are interpreted by components but never  executed  in
       isolation, some are executed but never interpreted (non-interpretive commands), and some are used in both
       ways.  Some commands may be directly accessible to the user through menus, while others are  internal  to
       the application.  In general, an undoable operation should be carried out by a command object.

PUBLIC OPERATIONS

       virtual void Execute()
       virtual void Unexecute()
       virtual boolean Reversible()
              Execute performs computation to carry out the command's semantics.  Unexecute performs computation
              to reverse the effects of a previous  Execute,  based  on  whatever  internal  state  the  command
              maintains.   A  command  is  responsible  for  maintaining  enough  state  to  reverse one Execute
              operation; repeated Unexecute operations will not undo the effects of more than one Execute.

              By default, Execute examines the current selection maintained in the command's editor (see below).
              Execute  will  do  nothing  if  the nothing is selected and the command's clipboard (see below) is
              empty or non-existent.  Otherwise, if something is selected and the command's  clipboard  is  non-
              existent,  then  Execute creates a clipboard containing the selected component subjects.  Finally,
              Execute will tell each component on  the  command's  clipboard  to  interpret  this.   Conversely,
              Unexecute tells each component on the clipboard (if any) to Uninterpret this this.  Thus, commands
              are purely interpretive by default.

              It may not be meaningful or appropriate, however, for some commands to reverse their effect.   For
              example,  it is probably not feasible to undo a command that generates an external representation.
              The Reversible operation returns whether or not the command is unexecutable  and  uninterpretable.
              If  the  command  is  irreversible,  then  it  is  ignored  during  the undo process.  By default,
              Reversible examines the command's clipboard; if the command doesn't have one, then the command  is
              reversible  if  the user has at least one component view selected.  If the command has a non-empty
              clipboard, then it is deemed reversible.  Subclasses may redefine Reversible to base the command's
              reversibility on their own criteria.

       virtual void Store(Component*, Data* = nil)
       virtual Data* Recall(Component*)
              Since  a  command  can affect more than one component, commands must let components that interpret
              them store undo  information  somewhere.   The  commands  must  also  let  components  recall  the
              information  during  uninterpretation.   Store lets a component store a Data object in the command
              itself as part of the component's interpretation process.  The component can  later  retrieve  the
              data  with  the  Recall  operation.   Store and Recall require a Component argument to distinguish
              requests from potentially many components.

       virtual void Log()
              A convenience function for calling the equivalent function on the global unidraw object.

       virtual void SetControlInfo(ControlInfo*)
       virtual void SetEditor(Editor*)
       virtual void SetClipboard(Clipboard*)

       virtual ControlInfo* GetControlInfo()
       virtual Editor* GetEditor()
       virtual Clipboard* GetClipboard()
              Operations for setting and getting constructor-specified state stored in  the  command.   Commands
              use  a  ControlInfo object to store information from which to build a user interface for executing
              the command.  Commands keep a pointer to the Editor instance they potentially affect.  Finally,  a
              command  uses  a clipboard to store the components it affects or affected.  A clipboard containing
              the components to be affected can be supplied in the  constructor,  but  more  often  the  command
              itself  creates  and  primes  a  clipboard  based on the editor's selected components.  The Set...
              operations do not delete the object being replaced.

       virtual void First(Iterator&)
       virtual void Last(Iterator&)
       virtual void Next(Iterator&)
       virtual void Prev(Iterator&)
       virtual boolean Done(Iterator)
              Operations for iterating over the command's children, if any.   These  operations  do  nothing  by
              default. Commands that compose other commands should redefine these operations to permit traversal
              of their children.  First and Last initialize an iterator to point to the beginning and end of the
              list  of  children,  respectively.   Next increments the iterator to point to the following child,
              while Prev decrements the iterator to point to the preceding child.  Done returns whether  or  not
              the iterator points beyond the first or last child in the list.

       virtual Component* Copy()
              Return  a copy of the command.  Subclasses should redefine this operation to return an instance of
              their type.

       virtual void Read(istream&)
       virtual void Write(ostream&)
              Read and write the command's contents to a stream to support catalog operations.  Read  and  write
              typically  call  first  the  corresponding operations defined by their parent class, and then they
              read or write their class-specific state.  Note that you must ensure that the objects are read  in
              the same order they are written.

       virtual ClassId GetClassId()
       virtual boolean IsA(ClassId)
              GetClassId returns the unique class identifier for the Command subclass, while IsA returns whether
              the instance is of a class or subclass corresponding  to  the  given  identifier.   IsA  typically
              checks  the  given  identifier against the instance's own (as defined by its GetClassId operation)
              and, failing that, calls  its  parent  classes'  IsA  operation.   All  subclasses  must  redefine
              GetClassId  and IsA to ensure that their identifiers are unique and that instances are written and
              read properly.

       virtual ClassId GetSubstId(const char*& delim)
              A Command subclasses can redefine GetSubstId to specify a command  that  can  substitute  for  it.
              This lets applications that do not define a particular command subclass still read in a substitute
              that is compatible with the subclass.  The substitute  class  should  be  one  of  the  predefined
              commands  in  the  Unidraw  library.   This  guarantees  that all applications can instantiate the
              substitute.

              GetSubstId returns the class identifier for the substitute.  When an another Unidraw application's
              catalog  reads this object, it can create an instance of the substitute (which it is guaranteed to
              define) instead of the original (which it may not define).

              The original should read and write a superset of the substitute's data.  The catalog will read  to
              the  end  of the substitute's data and then advance the stream to the point following the sequence
              of characters specified by delim, saving the extra  characters  between  the  two  points  in  the
              stream.   When  the substitute object is saved subsequently, the original class identifier will be
              written along with the substitute's  data  plus  the  extra  characters  saved  previously.   Thus
              information  needn't  be  lost  as  a  result  of  being  read  and  written by an unsophisticated
              application.

PROTECTED OPERATIONS

       Command(ControlInfo*, Clipboard* = nil)
       Command(Editor* = nil, Clipboard* = nil)
              The constructors are protected to prevent instatiation of the abstract base class.  You can supply
              a  ControlInfo  or Editor and an optional clipboard.  Only commands that will be accessible to the
              user need a ControlInfo object.  All commands should be given an editor  object  before  they  are
              used.

       void InitCopy(Command*)
       ControlInfo* CopyControlInfo()
       Clipboard* CopyClipboard()
       Clipboard* DeepCopyClipboard()
              Convenience  functions  for use by subclasses in their Copy operation.  InitCopy gives this a copy
              of the given command's editor, clipboard, and interpretation data stored by  the  components  that
              interpreted  it,  if  any.  CopyControlInfo  and  CopyClipboard  return  copies  of  the command's
              ControlInfo and Clipboard objects, respectively, if they are non-nil.   Both  CopyControlInfo  and
              CopyClipboard  simply check for a nil argument before calling the corresponding Copy operations on
              the objects.  DeepCopyClipboard checks  for  a  nil  clipboard  before  calling  DeepCopy  on  the
              command's clipboard and returning the result.

       GraphicComp* GetGraphicComp()
              A convenience function that returns the GraphicComp in the editor that the command affects.

SEE ALSO

       Catalog(3U),   Clipboard(3U),   ControlInfo(3U),  Data(3U),  Editor(3U),  GraphicComp(3U),  Iterator(3U),
       Unidraw(3U), classes(3U), globals(3U), istream(3C++), ostream(3C++)