/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkEvent.h

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
/**
 * @class   vtkEvent
 * @brief   a complete specification of a VTK event including all modifiers
 *
 * vtkEvent is a class that fully describes a VTK event. It is used by the
 * widgets to help specify the mapping between VTK events and widget events.
*/

#ifndef vtkEvent_h
#define vtkEvent_h

#include "vtkInteractionWidgetsModule.h" // For export macro
#include "vtkObject.h"

class vtkRenderWindowInteractor;

class VTKINTERACTIONWIDGETS_EXPORT vtkEvent : public vtkObject
{
public:
  /**
   * The object factory constructor.
   */
  static vtkEvent *New();

  //@{
  /**
   * Standard macros.
   */
  vtkTypeMacro(vtkEvent,vtkObject);
  void PrintSelf(ostream& os, vtkIndent indent) override;
  //@}

  /**
   * Ways to specify modifiers to VTK events. These can be logical OR'd to
   * produce combinations of modifiers.
   */
  enum EventModifiers {
    AnyModifier = -1,
    NoModifier = 0,
    ShiftModifier = 1,
    ControlModifier = 2,
    AltModifier = 4
  };

  //@{
  /**
   * Set the modifier for the event.
   */
  vtkSetMacro(EventId,unsigned long);
  vtkGetMacro(EventId,unsigned long);
  //@}

  //@{
  /**
   * Set the modifier for the event.
   */
  vtkSetMacro(Modifier,int);
  vtkGetMacro(Modifier,int);
  //@}

  //@{
  /**
   * Set the KeyCode for the event.
   */
  vtkSetMacro(KeyCode,char);
  vtkGetMacro(KeyCode,char);
  //@}

  //@{
  /**
   * Set the repease count for the event.
   */
  vtkSetMacro(RepeatCount,int);
  vtkGetMacro(RepeatCount,int);
  //@}

  //@{
  /**
   * Set the complex key symbol (compound key strokes) for the event.
   */
  vtkSetStringMacro(KeySym);
  vtkGetStringMacro(KeySym);
  //@}

  /**
   * Convenience method computes the event modifier from an interactor.
   */
  static int GetModifier(vtkRenderWindowInteractor*);

  /**
   * Used to compare whether two events are equal. Takes into account
   * the EventId as well as the various modifiers.
   */
  bool operator==(vtkEvent*);
  bool operator==(unsigned long VTKEvent);  //event with no modifiers

protected:
  vtkEvent();
  ~vtkEvent() override;

  unsigned long EventId;
  int           Modifier;
  char          KeyCode;
  int           RepeatCount;
  char*         KeySym;

private:
  vtkEvent(const vtkEvent&) = delete;
  void operator=(const vtkEvent&) = delete;

};

#endif
