/** \ingroup core
 * Widget to display the composer items. Manages the composer tools and the
 * mouse/key events.
 * Creates the composer items according to the current map tools and keeps track
 * of the rubber band item.
 */
class QgsComposerView : QGraphicsView
{
%TypeHeaderCode
#include "qgscomposerview.h"
%End

%ConvertToSubClassCode
  if (sipCpp->inherits("QgsComposerView"))
    sipType = sipType_QgsComposerView;
  else
    sipType = NULL;
%End

  public:

    /** Current tool*/
    enum Tool
    {
      Select,          // Select/Move item
      AddArrow,        // add arrow
      AddHtml,
      AddMap,          // add new map
      AddLegend,       // add vector legend
      AddLabel,        // add label
      AddScalebar,     // add scalebar
      AddPicture,      // add raster/vector picture
      AddRectangle,
      AddEllipse,
      AddTriangle,
      AddTable,        // add attribute table
      AddAttributeTable,
      MoveItemContent, // move content of item (e.g. content of map)
      Pan,
      Zoom
    };

    enum ClipboardMode
    {
      ClipboardModeCut,
      ClipboardModeCopy
    };

    enum PasteMode
    {
      PasteModeCursor,
      PasteModeCenter,
      PasteModeInPlace
    };

    enum ToolStatus
    {
      Inactive,
      Active,
      ActiveUntilMouseRelease
    };

    QgsComposerView( QWidget* parent /TransferThis/ = 0, const char* name = 0, const Qt::WindowFlags& f = 0 );

    /** Add an item group containing the selected items*/
    void groupItems();

    /** Ungroups the selected items*/
    void ungroupItems();

    /** Cuts or copies the selected items*/
    void copyItems( ClipboardMode mode );

    /** Pastes items from clipboard*/
    void pasteItems( PasteMode mode );

    /** Deletes selected items*/
    void deleteSelectedItems();

    /** Selects all items*/
    void selectAll();

    /** Deselects all items*/
    void selectNone();

    /** Inverts current selection*/
    void selectInvert();

    QgsComposerView::Tool currentTool() const;
    void setCurrentTool( QgsComposerView::Tool t );

    /** Sets the composition for the view. If the composition is being set manually and not by a QgsComposer, then this must
     * be set BEFORE adding any items to the composition.
     */
    void setComposition( QgsComposition* c /KeepReference/ );

    /** Returns the composition or 0 in case of error*/
    QgsComposition* composition();

    /** Returns the composer main window*/
    QMainWindow* composerWindow();

    void setPaintingEnabled( bool enabled );
    bool paintingEnabled() const;

    /** Update rulers with current scene rect*/
    void updateRulers();

    void setHorizontalRuler( QgsComposerRuler* r );
    void setVerticalRuler( QgsComposerRuler* r );

    /** Set zoom level, where a zoom level of 1.0 corresponds to 100%*/
    void setZoomLevel( double zoomLevel );

    /** Scales the view in a safe way, by limiting the acceptable range
     * of the scale applied.
     * @param scale factor to scale view by
     * @note added in QGIS 2.16
     */
    void scaleSafe( double scale );

    /** Sets whether a preview effect should be used to alter the view's appearance
     * @param enabled Set to true to enable the preview effect on the view
     * @note added in 2.3
     * @see setPreviewMode
     */
    void setPreviewModeEnabled( bool enabled );
    /** Sets the preview mode which should be used to modify the view's appearance. Preview modes are only used
     * if setPreviewMode is set to true.
     * @param mode PreviewMode to be used to draw the view
     * @note added in 2.3
     * @see setPreviewModeEnabled
     */
    void setPreviewMode( QgsPreviewEffect::PreviewMode mode );

  protected:
    void mousePressEvent( QMouseEvent* );
    void mouseReleaseEvent( QMouseEvent* );
    void mouseMoveEvent( QMouseEvent* );
    void mouseDoubleClickEvent( QMouseEvent* e );

    void keyPressEvent( QKeyEvent * e );
    void keyReleaseEvent( QKeyEvent * e );

    void wheelEvent( QWheelEvent* event );

    void paintEvent( QPaintEvent* event );

    void hideEvent( QHideEvent* e );
    void showEvent( QShowEvent* e );

    void resizeEvent( QResizeEvent* event );
    void scrollContentsBy( int dx, int dy );
  signals:
    /** Is emitted when selected item changed. If 0, no item is selected*/
    void selectedItemChanged( QgsComposerItem* selected );
    /** Is emitted when a composer item has been removed from the scene*/
    void itemRemoved( QgsComposerItem* );
    /** Current action (e.g. adding composer map) has been finished. The purpose of this signal is that
     QgsComposer may set the selection tool again*/
    void actionFinished();
    /** Is emitted when mouse cursor coordinates change*/
    void cursorPosChanged( QPointF );
    /** Is emitted when the view zoom changes*/
    void zoomLevelChanged();

    /** Emitted before composerview is shown*/
    void composerViewShow( QgsComposerView* );
    /** Emitted before composerview is hidden*/
    void composerViewHide( QgsComposerView* );

    /** Emitted when the composition is set for the view*/
    void compositionSet( QgsComposition* );
};