/***************************************************************************
    File                 : ScalePicker.h
    Project              : SciDAVis
    --------------------------------------------------------------------
    Copyright            : (C) 2006 by Ion Vasilief, Tilman Benkert
    Email (use @ for *)  : ion_vasilief*yahoo.fr, thzs*gmx.net
    Description          : Scale picker
                           
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *  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 program; if not, write to the Free Software           *
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor,                    *
 *   Boston, MA  02110-1301  USA                                           *
 *                                                                         *
 ***************************************************************************/
#include <QObject>

class QRect;
class QPoint;
class QwtPlot;
class QwtScaleWidget;
class Graph;
	
/*!\brief Handles user interaction with a QwtScaleWidget.
 *
 * This class is used by Graph to catch events for the scales on its Plot.
 * ScalePicker doesn't take any actions beyond emitting signals, which are then processed by Graph.
 */
class ScalePicker: public QObject
{
    Q_OBJECT
public:
    ScalePicker(QwtPlot *plot);

	//! Returns the bounding rectangle of a scale without the title.
	QRect scaleRect(const QwtScaleWidget *) const;

	//! Returns the bounding rectangle of a scale excluding the title and the tick labels.
	QRect scaleTicksRect(const QwtScaleWidget *scale) const;
	
	//! Returns the bounding rectangle of a scale's title.
	QRect titleRect(const QwtScaleWidget *scale) const;

	/*! Install myself as event filter for all axes of my parent.
	 * For every axis of plot(), add myself to the corresponding QwtScaleWidget.
	 * \sa QwtPlot::axisWidget()
	 */
	void refresh();
	
	//! Return my parent casted to QwtPlot.
	QwtPlot *plot() { return (QwtPlot *)parent(); }
	Graph *graph() { return (Graph *)(parent()->parent()); }

	void deselect();
	
	bool titleSelected(){return d_title_selected;};
    void selectTitle(QwtScaleWidget *scale, bool select = true);
	
	bool labelsSelected(){return d_labels_selected;};
	void selectLabels(QwtScaleWidget *scale, bool select = true);
	
	/*! Returns a pointer to the selected axis in the plot layer. 
	 * The selected axis has selected title or selected tick labels (blue frame around texts).
	 */
	QwtScaleWidget* selectedAxis(){return d_selected_axis;};
	//! Returns a pointer to the active axis in the plot layer.
	QwtScaleWidget* currentAxis(){return d_current_axis;};

signals:
	//! Emitted when the user clicks on one of the monitored axes.
	void clicked();

	/*! Emitted when the user right-clicks on an axis (but not its title).
	 * The argument specifies the axis' QwtScaleDraw::Alignment.
	 */
	void axisRightClicked(int);
	/*! Emitted when the user right-clicks on the title of an axis.
	 * The argument specifies the axis' QwtScaleDraw::Alignment.
	 */
	void axisTitleRightClicked(int);

	/*! Emitted when the user double-clicks on an axis (but not its title).
	 * The argument specifies the axis' QwtScaleDraw::Alignment.
	 */
	void axisDblClicked(int);

	/*! Emitted when the user double-clicks on an the bottom-axis title.
	 * \sa QwtScaleDraw::Alignment
	 */
	void xAxisTitleDblClicked();
	/*! Emitted when the user double-clicks on an the left-axis title.
	 * \sa QwtScaleDraw::Alignment
	 */
	void yAxisTitleDblClicked();
	/*! Emitted when the user double-clicks on an the right-axis title.
	 * \sa QwtScaleDraw::Alignment
	 */
	void rightAxisTitleDblClicked();
	/*! Emitted when the user double-clicks on an the top-axis title.
	 * \sa QwtScaleDraw::Alignment
	 */
	void topAxisTitleDblClicked();
	
private:
    bool eventFilter(QObject *, QEvent *);

	void mouseDblClicked(const QwtScaleWidget *, const QPoint &);
	void mouseClicked(const QwtScaleWidget *scale, const QPoint &pos) ;
	void mouseRightClicked(const QwtScaleWidget *scale, const QPoint &pos);

	bool d_title_selected;
	bool d_labels_selected;
	QwtScaleWidget *d_selected_axis, *d_current_axis;
};
