/***************************************************************************
    qgsmaptooladvanceddigitizing.h  - map tool with event in map coordinates
    ----------------------
    begin                : October 2014
    copyright            : (C) Denis Rouzaud
    email                : denis.rouzaud@gmail.com
 ***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

/**
 * @brief The QgsMapToolAdvancedDigitizing class is a QgsMapTool which gives event directly in map coordinates and allows filtering its events.
 * Events from QgsMapTool are caught and their QMouseEvent are transformed into QgsMapMouseEvent (with map coordinates).
 * Events are then forwarded to corresponding virtual methods which can be reimplemented in subclasses.
 * An event filter can be set on the map tool to filter and modify the events in map coordinates (@see QgsMapToolMapEventFilter).
 * @note at the moment, the event filter is used by the CAD tools (@see QgsCadDocWidget).
 * @note the event filter definition is not exposed in python API to avoid any unexpected behavior.
 */
class QgsMapToolAdvancedDigitizing : QgsMapToolEdit
{
%TypeHeaderCode
#include "qgsmaptooladvanceddigitizing.h"
%End
  public:
    //! Different capture modes
    enum CaptureMode
    {
      CaptureNone,    //!< Do not capture
      CapturePoint,   //!< Capture points
      CaptureSegment, //!< Capture a segment (i.e. 2 points)
      CaptureLine,    //!< Capture lines
      CapturePolygon  //!< Capture polygons
    };

    /**
     * Creates an advanced digitizing maptool
     * @param canvas         The map canvas on which the tool works
     * @param cadDockWidget  The cad dock widget which will be used to adjust mouse events
     */
    explicit QgsMapToolAdvancedDigitizing( QgsMapCanvas* canvas, QgsAdvancedDigitizingDockWidget* cadDockWidget );

    ~QgsMapToolAdvancedDigitizing();

    //! catch the mouse press event, filters it, transforms it to map coordinates and send it to virtual method
    virtual void canvasPressEvent( QgsMapMouseEvent* e );
    //! catch the mouse release event, filters it, transforms it to map coordinates and send it to virtual method
    virtual void canvasReleaseEvent( QgsMapMouseEvent* e );
    //! catch the mouse move event, filters it, transforms it to map coordinates and send it to virtual method
    virtual void canvasMoveEvent( QgsMapMouseEvent* e );

    /**
     * The capture mode
     *
     * @return Capture mode
     */
    CaptureMode mode() const;

    /**
     * Set capture mode. This should correspond to the layer on which the digitizing
     * happens.
     *
     * @param mode Capture Mode
     */
    void setMode( CaptureMode mode );

    /**
     * Registers this maptool with the cad dock widget
     */
    virtual void activate();

    /**
     * Unregisters this maptool from the cad dock widget
     */
    virtual void deactivate();

    QgsAdvancedDigitizingDockWidget* cadDockWidget() const;

  protected:
    /**
     * Override this method when subclassing this class.
     * This will receive adapted events from the cad system whenever a
     * canvasPressEvent is triggered and it's not hidden by the cad's
     * construction mode.
     *
     * @param e Mouse events prepared by the cad system
     */
    virtual void cadCanvasPressEvent( QgsMapMouseEvent* e );


    /**
     * Override this method when subclassing this class.
     * This will receive adapted events from the cad system whenever a
     * canvasReleaseEvent is triggered and it's not hidden by the cad's
     * construction mode.
     *
     * @param e Mouse events prepared by the cad system
     */
    virtual void cadCanvasReleaseEvent( QgsMapMouseEvent* e );


    /**
     * Override this method when subclassing this class.
     * This will receive adapted events from the cad system whenever a
     * canvasMoveEvent is triggered and it's not hidden by the cad's
     * construction mode.
     *
     * @param e Mouse events prepared by the cad system
     */
    virtual void cadCanvasMoveEvent( QgsMapMouseEvent* e );
};