/*
 * wbitem.h - the item classes for the SVG WB
 * Copyright (C) 2006  Joonas Govenius
 *
 * 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.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 *
 */

#ifndef WBITEM_H
#define WBITEM_H

#include <QGraphicsSvgItem>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QMenu>
#include "iconaction.h"
#include "../sxe/sxesession.h"

class WbScene;
class WbWidget;

/*! \brief The context menu for WbItems
 *  This menu pops up when as the context menu for WbItems and displays
 *  \sa WbItem
 */
class WbItemMenu : public QMenu {
	Q_OBJECT
public:
	/*! \brief Constructor
	 *  Constructs a new empty menu.
	 */
	WbItemMenu(QWidget* parent);
	/*! \brief Destructor
	 *  Deletes all the actiongroups and their actions.
	 */
	~WbItemMenu();
	/*! \brief Add actiongroup to the menu.*/
	void addActionGroup(QActionGroup*);

private slots:
	/*! \brief Destruct self.*/
	void destructSelf();

private:
	/*! \brief The actiongroups that the menu shows.*/
	QList<QActionGroup*> groups_;
};

class WbItem : public QGraphicsSvgItem {
	Q_OBJECT
public:
	/*! \brief Constructor
	 *  Constructs a new whiteboard item that visualized \a node.
	 */
	WbItem(SxeSession* session, QSvgRenderer* renderer, QDomElement node, WbScene* scene, WbWidget* widget);
	/*! \brief Destructor
	 *  Makes sure that the item gets deleted from the underlying <svg/> document
	 */
	~WbItem();

	/*! \brief Returns the xml:id of the node.*/
	QString id();
	/*! \brief Returns the underlying node.*/
	QDomNode node();

	/*! \brief Regenerates the SVG transformation matrix.*/
	void regenerateTransform();

	/*! \brief Adds the item to the scene.
		Generates an 'id' attribute for the node if none exists. */
	void addToScene();
	/*! \brief Removes the item from the scene. */
	void removeFromScene();

	/*! \brief Resets the position of the item according to the SVG and clears any QGraphicsItem transformations.*/
	void resetPos();

	/*! \brief Returns a QTransform based on \a string provided in the SVG 'transform' attribute format.*/
	static QMatrix parseSvgTransform(QString string);
	/*! \brief Returns a QString in the SVG 'transform' attribute format based on \a matrix.*/
	static QString toSvgTransform(const QMatrix &matrix);

protected:
	 /*! \brief Constructs and popsup the default context menu.*/
	 virtual void contextMenuEvent (QGraphicsSceneContextMenuEvent *);
	 /*! \brief Implements the default item interaction behaviour.
	 *  The action depends on the mode of widget_;
	  */
	 virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *);
	 /*! \brief Implements the default item interaction behaviour.
	  *  The action depends on the mode of widget_;
	  */
	 virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *);

private:
	 /*! \brief Construct a context menu with the default items.*/
	 WbItemMenu* constructContextMenu();
	 /*! \brief Return the center of the item in item coordinates.*/
	 QPointF center();

	// The session that the item belongs to
	SxeSession* session_;
	// The WbScene that the item belongs to
	WbScene* scene_;
	// The WbWidget that shows the item
	WbWidget* widget_;
	// The node SVG node that's being visualized
	QDomElement node_;

};

#endif
