/***************************************************************************
 *   Copyright (C) 2008 by Peter Dahlberg   *
 *   pdahlberg@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.                                   *
 *                                                                         *
 *   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.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#ifndef GRAPHICSELLIPSEITEM_H
#define GRAPHICSELLIPSEITEM_H

#include <QGraphicsEllipseItem>
#include <QObject>
class ProbeChargeWidget;
class QPainterPath;
class QGraphicsPathItem;

/**
	@author Peter Dahlberg <pdahlberg@gmail.com>
*/

class GraphicsEllipseItem : public QObject , public QGraphicsEllipseItem {
	Q_OBJECT
	public:
		GraphicsEllipseItem();
		QWidget* getDockWidget() const;

		~GraphicsEllipseItem();
		QList<QPointF> * getCurrProbePath();
		QList<double> *getElapsedTimeList();

		double getCharge() const;
		double getStartSpeedX() const;
		double getStartSpeedY() const;

		//! Gibt die Masse zur&uuml;ck
		/*!
			\param speed alles != c/10 relativistisch
		*/
		double getMasse(double speed = 0);
		
		QPainterPath getFlightPath() const;
		double getRealSimulTime() const;
		bool isAdaptiveStepControlEnabled() const;
		double getAdaptiveStepLength() const;
		QList< double >* getSpeedListX() const;
		QList< double >* getSpeedListY() const;

		QList<QVariant> getSaveDataList();
		void setSaveDataList(QList<QVariant> list);


	protected:
		void mousePressEvent ( QGraphicsSceneMouseEvent *event );
		void timerEvent ( QTimerEvent * event );

	private:
		QList<QPointF> *currProbePath;
		///Liste Der Geschwindigkeitsanteile in x-richtung
		QList<double> *speedListX;
		///Liste Der Geschwindigkeitsanteile in y-richtung
		QList<double> *speedListY;
		///Bisher vergangene Zeit an einen bestimmten Schritt
		QList<double> *elapsedTimeList;
		///Masse der Probeladung in kg
		double masse;
		///Ladung der Probleadung in As
		double charge;
		///Zugeordnetes Probe Charge Widget
		ProbeChargeWidget* myProbeChargeWidget;
		///Startgeschwindigkeit des teilchens in x-Richtung
		double startSpeedX;
		///Startgeschwindigkeit des teilchens in y-Richtung
		double startSpeedY;
		///automatische Zeitschrittanpassung an/aus
		bool adaptiveStepControlEnabled;
		///angenaeherte Schrittlaenge in px
		double adaptiveStepLength;

		QPointF myScenePos;

		///Pfad der Flugbahn
		QPainterPath flightPath;

		void setupVars();

	public slots:
		//! Berechnet die Bewegung der Probeladung
		/*!
			\param steps Anzahl der auszuf&uuml;renden Schriite
		*/
		void calculateProbePath (QPointF startPoint = QPointF(0,0));

		void setMasse ( const double& theValue );
	
		void setCharge ( const double& theValue );

		void setStartSpeedX ( double theValue );
		void setStartSpeedY ( double theValue );
   		void setScenePosY(double newPosY);
    		void setScenePosX(double newPosX);
		void handleSceneChange(const QList<QRectF> & /*region*/);

		void setFlightPath ( const QPainterPath& theValue );
		void resetProbe();
		void setAdaptiveStepControl ( bool theValue );
		void setAdaptiveStepLength ( double theValue );
		void updateScenePosLabels();


	signals:
		void startSpeedXChanged(double speed);
		void startSpeedYChanged(double speed);
		void masseChanged(double masse);
		void chargeChanged(double Charge);
		void ScenePosChanged(QPointF newpos);
		void ScenePosXChanged(double newX);
		void ScenePosYChanged(double newY);
		void adaptiveStepControlChanged(bool truefalse);
		void adaptiveStepLengthChanged(double length);

		void ScenePosXChangedPixel(QString newX);
		void ScenePosYChangedPixel(QString newY);
		void ScenePosXChangedMeter(QString newX);
		void ScenePosYChangedMeter(QString newY);
	

		
	
	
	
	
};

#endif
