[qet] [855] Optimisation de l'editeur d'element.

[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]


Revision: 855
Author:   xavier
Date:     2010-02-18 01:17:34 +0100 (Thu, 18 Feb 2010)
Log Message:
-----------
Optimisation de l'editeur d'element.
L'organisation interne de l'editeur d'element a ete completement revue.
Auparavant, chaque primitive instanciait son propre widget d'edition et le
gardait durant toute sa duree de vie, entrainant ainsi une consommation memoire
et un temps de chargement importants.
Desormais, l'editeur instancie des son demarrage 9 widgets d'edition qu'il
conserve durant toute sa duree de vie. Il choisit alors lequel afficher en
fonction des primitives selectionnees.

Modified Paths:
--------------
    trunk/sources/editor/arceditor.cpp
    trunk/sources/editor/arceditor.h
    trunk/sources/editor/circleeditor.cpp
    trunk/sources/editor/circleeditor.h
    trunk/sources/editor/customelementgraphicpart.cpp
    trunk/sources/editor/customelementgraphicpart.h
    trunk/sources/editor/customelementpart.cpp
    trunk/sources/editor/customelementpart.h
    trunk/sources/editor/elementitemeditor.cpp
    trunk/sources/editor/elementitemeditor.h
    trunk/sources/editor/ellipseeditor.cpp
    trunk/sources/editor/ellipseeditor.h
    trunk/sources/editor/lineeditor.cpp
    trunk/sources/editor/lineeditor.h
    trunk/sources/editor/partarc.cpp
    trunk/sources/editor/partarc.h
    trunk/sources/editor/partcircle.cpp
    trunk/sources/editor/partcircle.h
    trunk/sources/editor/partellipse.cpp
    trunk/sources/editor/partellipse.h
    trunk/sources/editor/partline.cpp
    trunk/sources/editor/partline.h
    trunk/sources/editor/partpolygon.cpp
    trunk/sources/editor/partpolygon.h
    trunk/sources/editor/partrectangle.cpp
    trunk/sources/editor/partrectangle.h
    trunk/sources/editor/partterminal.cpp
    trunk/sources/editor/partterminal.h
    trunk/sources/editor/parttext.cpp
    trunk/sources/editor/parttext.h
    trunk/sources/editor/parttextfield.cpp
    trunk/sources/editor/parttextfield.h
    trunk/sources/editor/polygoneditor.cpp
    trunk/sources/editor/polygoneditor.h
    trunk/sources/editor/qetelementeditor.cpp
    trunk/sources/editor/qetelementeditor.h
    trunk/sources/editor/rectangleeditor.cpp
    trunk/sources/editor/rectangleeditor.h
    trunk/sources/editor/styleeditor.cpp
    trunk/sources/editor/styleeditor.h
    trunk/sources/editor/terminaleditor.cpp
    trunk/sources/editor/terminaleditor.h
    trunk/sources/editor/texteditor.cpp
    trunk/sources/editor/texteditor.h
    trunk/sources/editor/textfieldeditor.cpp
    trunk/sources/editor/textfieldeditor.h

Modified: trunk/sources/editor/arceditor.cpp
===================================================================
--- trunk/sources/editor/arceditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/arceditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,6 +16,7 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "arceditor.h"
+#include "styleeditor.h"
 #include "partarc.h"
 
 /**
@@ -24,10 +25,11 @@
 	@param arc L'arc a editer
 	@param parent le Widget parent
 */
-ArcEditor::ArcEditor(QETElementEditor *editor, PartArc *arc, QWidget *parent) : ElementItemEditor(editor, parent) {
-	
-	part = arc;
-	
+ArcEditor::ArcEditor(QETElementEditor *editor, PartArc *arc, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(arc)
+{
+	style_ = new StyleEditor(editor);
 	x = new QLineEdit();
 	y = new QLineEdit();
 	h = new QLineEdit();
@@ -42,7 +44,9 @@
 	h -> setValidator(new QDoubleValidator(h));
 	v -> setValidator(new QDoubleValidator(v));
 	
-	QGridLayout *grid = new QGridLayout(this);
+	QVBoxLayout *v_layout = new QVBoxLayout(this);
+	
+	QGridLayout *grid = new QGridLayout();
 	grid -> addWidget(new QLabel(tr("Centre : ")),            0, 0);
 	grid -> addWidget(new QLabel("x"),                        1, 0);
 	grid -> addWidget(x,                                      1, 1);
@@ -57,6 +61,10 @@
 	grid -> addWidget(start_angle,                            5, 1);
 	grid -> addWidget(new QLabel(tr("Angle :")),              6, 0);
 	grid -> addWidget(angle,                                  6, 1);
+	
+	v_layout -> addWidget(style_);
+	v_layout -> addLayout(grid);
+	
 	updateForm();
 	
 	activeConnections(true);
@@ -67,15 +75,47 @@
 }
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur d'arc acceptera d'editer la primitive new_part s'il s'agit d'un
+	objet de la classe PartArc.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool ArcEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		style_ -> setPart(0);
+		return(true);
+	}
+	if (PartArc *part_arc = dynamic_cast<PartArc *>(new_part)) {
+		part = part_arc;
+		style_ -> setPart(part);
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *ArcEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	Met a jour l'arc a partir a partir des donnees du formulaire
 */
 void ArcEditor::updateArc() {
-	part -> setProperty("x",          x -> text().toDouble());
-	part -> setProperty("y",          y -> text().toDouble());
-	part -> setProperty("diameter_h", h -> text().toDouble());
-	part -> setProperty("diameter_v", v -> text().toDouble());
-	part -> setStartAngle(-start_angle -> value() + 90);
-	part -> setAngle(-angle -> value());
+	if (!part) return;
+	part -> setProperty("x",           x -> text().toDouble());
+	part -> setProperty("y",           y -> text().toDouble());
+	part -> setProperty("diameter_h",  h -> text().toDouble());
+	part -> setProperty("diameter_v",  v -> text().toDouble());
+	part -> setProperty("start_angle", -start_angle -> value() + 90);
+	part -> setProperty("angle",       -angle -> value());
 }
 
 /// Met a jour l'abscisse du centre de l'arc et cree un objet d'annulation
@@ -95,6 +135,7 @@
 	Met a jour le formulaire d'edition
 */
 void ArcEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	x -> setText(part -> property("x").toString());
 	y -> setText(part -> property("y").toString());

Modified: trunk/sources/editor/arceditor.h
===================================================================
--- trunk/sources/editor/arceditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/arceditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -20,6 +20,7 @@
 #include <QtGui>
 #include "elementitemeditor.h"
 class PartArc;
+class StyleEditor;
 /**
 	Cette classe represente le widget d'edition d'un arc dans l'editeur
 	d'element.
@@ -28,18 +29,23 @@
 	Q_OBJECT
 	//constructeurs, destructeur
 	public:
-	ArcEditor(QETElementEditor *, PartArc *, QWidget * = 0);
-	~ArcEditor();
+	ArcEditor(QETElementEditor *, PartArc * = 0, QWidget * = 0);
+	virtual ~ArcEditor();
 	private:
 	ArcEditor(const ArcEditor &);
 	
 	// attributs
 	private:
 	PartArc *part;
+	StyleEditor *style_;
 	QLineEdit *x, *y, *h, *v;
 	QSpinBox *angle, *start_angle;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	public slots:
 	void updateArc();
 	void updateArcX();

Modified: trunk/sources/editor/circleeditor.cpp
===================================================================
--- trunk/sources/editor/circleeditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/circleeditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,6 +16,7 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "circleeditor.h"
+#include "styleeditor.h"
 #include "partcircle.h"
 
 /**
@@ -24,10 +25,12 @@
 	@param circle Le cercle a editer
 	@param parent le Widget parent
 */
-CircleEditor::CircleEditor(QETElementEditor *editor, PartCircle *circle, QWidget *parent) : ElementItemEditor(editor, parent) {
+CircleEditor::CircleEditor(QETElementEditor *editor, PartCircle *circle, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(circle)
+{
+	style_ = new StyleEditor(editor);
 	
-	part = circle;
-	
 	x = new QLineEdit();
 	y = new QLineEdit();
 	r = new QLineEdit();
@@ -36,7 +39,9 @@
 	y -> setValidator(new QDoubleValidator(y));
 	r -> setValidator(new QDoubleValidator(r));
 	
-	QGridLayout *grid = new QGridLayout(this);
+	QVBoxLayout *v_layout = new QVBoxLayout(this);
+	
+	QGridLayout *grid = new QGridLayout();
 	grid -> addWidget(new QLabel(tr("Centre : ")),       0, 0);
 	grid -> addWidget(new QLabel("x"),                   1, 0);
 	grid -> addWidget(x,                                 1, 1);
@@ -45,6 +50,9 @@
 	grid -> addWidget(new QLabel(tr("Diam\350tre : ")),  2, 0);
 	grid -> addWidget(r,                                 2, 1);
 	
+	v_layout -> addWidget(style_);
+	v_layout -> addLayout(grid);
+	
 	activeConnections(true);
 	updateForm();
 }
@@ -54,9 +62,41 @@
 }
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur de cercle acceptera d'editer la primitive new_part s'il s'agit
+	d'un objet de la classe PartCircle.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool CircleEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		style_ -> setPart(0);
+		return(true);
+	}
+	if (PartCircle *part_circle = dynamic_cast<PartCircle *>(new_part)) {
+		part = part_circle;
+		style_ -> setPart(part);
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *CircleEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	met a jour le cercle a partir des donnees du formulaire
 */
 void CircleEditor::updateCircle() {
+	if (!part) return;
 	part -> setProperty("x", x -> text().toDouble());
 	part -> setProperty("y", y -> text().toDouble());
 	part -> setProperty("diameter", r -> text().toDouble());
@@ -75,6 +115,7 @@
 	Met a jour le formulaire d'edition
 */
 void CircleEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	x -> setText(part -> property("x").toString());
 	y -> setText(part -> property("y").toString());

Modified: trunk/sources/editor/circleeditor.h
===================================================================
--- trunk/sources/editor/circleeditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/circleeditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -20,6 +20,7 @@
 #include <QtGui>
 #include "elementitemeditor.h"
 class PartCircle;
+class StyleEditor;
 /**
 	Cette classe represente un editeur de cercle.
 	Elle permet d'editer a travers une interface graphique les
@@ -29,7 +30,7 @@
 	Q_OBJECT
 	// Constructeurs, destructeur
 	public:
-	CircleEditor(QETElementEditor *, PartCircle *, QWidget * = 0);
+	CircleEditor(QETElementEditor *, PartCircle * = 0, QWidget * = 0);
 	virtual ~CircleEditor();
 	private:
 	CircleEditor(const CircleEditor &);
@@ -37,9 +38,14 @@
 	// attributs
 	private:
 	PartCircle *part;
+	StyleEditor *style_;
 	QLineEdit *x, *y, *r;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	public slots:
 	void updateCircle();
 	void updateCircleX();

Modified: trunk/sources/editor/customelementgraphicpart.cpp
===================================================================
--- trunk/sources/editor/customelementgraphicpart.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/customelementgraphicpart.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -83,9 +83,6 @@
 	
 	// recupere l'antialiasing
 	_antialiased = qde.attribute("antialias") == "true";
-	
-	// met a jour l'editeur de style
-	style_editor -> updateForm();
 }
 
 /**
@@ -143,13 +140,6 @@
 }
 
 /**
-	@return Le widget permettant d'editer les styles
-*/
-QWidget *CustomElementGraphicPart::elementInformations() {
-	return(style_editor);
-}
-
-/**
 	Specifie la valeur d'une propriete de style donnee.
 	@param property propriete a modifier. Valeurs acceptees :
 		* line-style : type de trait (@see LineStyle)
@@ -177,9 +167,6 @@
 		setAntialiased(value.toBool());
 		change_made = true;
 	}
-	if (change_made) {
-		style_editor -> updateForm();
-	}
 }
 
 /**

Modified: trunk/sources/editor/customelementgraphicpart.h
===================================================================
--- trunk/sources/editor/customelementgraphicpart.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/customelementgraphicpart.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -69,13 +69,10 @@
 		_color(BlackColor),
 		_antialiased(false)
 	{
-		style_editor = new StyleEditor(elementEditor(), this);
 	};
 	
 	/// Destructeur
 	virtual ~CustomElementGraphicPart() {
-		if (style_editor -> parentWidget()) return; // l'editeur de style sera supprime par son parent
-		delete style_editor;
 	};
 	
 	// attributs
@@ -86,10 +83,6 @@
 	Color _color;
 	bool _antialiased;
 	
-	protected:
-	/// Widget d'edition des styles de cette partie graphique
-	StyleEditor *style_editor;
-	
 	//methodes
 	public:
 	void setLineStyle(LineStyle);
@@ -104,7 +97,6 @@
 	Color color() const;
 	bool antialiased() const;
 	
-	QWidget *elementInformations();
 	void setProperty(const QString &, const QVariant &);
 	QVariant property(const QString &);
 	

Modified: trunk/sources/editor/customelementpart.cpp
===================================================================
--- trunk/sources/editor/customelementpart.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/customelementpart.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -24,6 +24,16 @@
 	return(element_editor);
 }
 
+/**
+	Appelle le slot updateCurrentPartEditor de l'editeur
+	@see QETElementEditor::updateCurrentPartEditor()
+*/
+void CustomElementPart::updateCurrentPartEditor() const {
+	if (element_editor) {
+		element_editor -> updateCurrentPartEditor();
+	}
+}
+
 /// @return l'ElementScene contenant les parties editees par cet editeur
 ElementScene *CustomElementPart::elementScene() const {
 	return(element_editor -> elementScene());

Modified: trunk/sources/editor/customelementpart.h
===================================================================
--- trunk/sources/editor/customelementpart.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/customelementpart.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -59,8 +59,6 @@
 		Enregistre la partie dans un document XML
 	*/
 	virtual const QDomElement toXml(QDomDocument &) const = 0;
-	/// @return un widget suppose decrire et/ou permettre de modifier la partie
-	virtual QWidget *elementInformations() = 0;
 	/**
 		Permet de modifier une des proprietes de la partie
 	*/
@@ -77,11 +75,18 @@
 	virtual bool isUseless() const = 0;
 	/// @return un pointeur vers l'editeur d'element parent
 	virtual QETElementEditor *elementEditor() const;
+	/**
+		Appelle le slot updateCurrentPartEditor de l'editeur
+		@see QETElementEditor::updateCurrentPartEditor()
+	*/
+	virtual void updateCurrentPartEditor() const;
 	/// @return un pointeur vers la scene d'edition parente
 	virtual ElementScene *elementScene() const;
 	/// @return la pile d'annulations a utiliser
 	virtual QUndoStack &undoStack() const;
 	/// @return le nom de la partie
 	virtual QString name() const = 0;
+	/// @return le nom qui sera utilise pour nommer l'element XML lors de l'export
+	virtual QString xmlName() const = 0;
 };
 #endif

Modified: trunk/sources/editor/elementitemeditor.cpp
===================================================================
--- trunk/sources/editor/elementitemeditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/elementitemeditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -47,15 +47,23 @@
 
 /**
 	Ajoute une ChangePartCommand a l'UndoStack. L'ancienne valeur sera
-	automatiquement recuperee.
+	automatiquement recuperee. A noter que cette methode ne fait rien si
+	l'ancienne valeur et la nouvelle sont egales ou encore si part vaut 0
 	@param desc   nom de la propriete modifiee
 	@param part   partie modifiee
 	@param prop   propriete modifiee
 	@param new_v  nouvelle valeur
 */
 void ElementItemEditor::addChangePartCommand(const QString &desc, CustomElementPart *part, const QString &prop, const QVariant &new_v) {
+	// ne fait rien si part vaut 0
+	if (!part) return;
+	
+	// recupere l'ancienne valeur
 	QVariant old_v = part -> property(prop);
+	
+	// ne fait rien si l'ancienne valeur et la nouvelle sont egales 
 	if (old_v == new_v) return;
+	
 	undoStack().push(
 		new ChangePartCommand(
 			desc + " " + element_type_name,
@@ -76,3 +84,12 @@
 void ElementItemEditor::setElementTypeName(const QString &name) {
 	element_type_name = name;
 }
+
+/**
+	Detache l'editeur de la primitive qu'il edite.
+	Equivaut a setPart(0)
+	@see setPart
+*/
+void ElementItemEditor::detach() {
+	setPart(0);
+}

Modified: trunk/sources/editor/elementitemeditor.h
===================================================================
--- trunk/sources/editor/elementitemeditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/elementitemeditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -44,6 +44,10 @@
 	virtual void addChangePartCommand(const QString &, CustomElementPart *, const QString &, const QVariant &);
 	virtual QString elementTypeName() const;
 	virtual void setElementTypeName(const QString &);
+	virtual void detach();
+	virtual bool setPart(CustomElementPart *) = 0;
+	virtual CustomElementPart *currentPart() const = 0;
+	virtual void updateForm() = 0;
 	
 	// attributs
 	private:

Modified: trunk/sources/editor/ellipseeditor.cpp
===================================================================
--- trunk/sources/editor/ellipseeditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/ellipseeditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,6 +16,7 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "ellipseeditor.h"
+#include "styleeditor.h"
 #include "partellipse.h"
 
 /**
@@ -24,10 +25,12 @@
 	@param ellipse L'ellipse a editer
 	@param parent le Widget parent
 */
-EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWidget *parent) : ElementItemEditor(editor, parent) {
+EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(ellipse)
+{
+	style_ = new StyleEditor(editor);
 	
-	part = ellipse;
-	
 	x = new QLineEdit();
 	y = new QLineEdit();
 	h = new QLineEdit();
@@ -38,7 +41,9 @@
 	h -> setValidator(new QDoubleValidator(h));
 	v -> setValidator(new QDoubleValidator(v));
 	
-	QGridLayout *grid = new QGridLayout(this);
+	QVBoxLayout *v_layout = new QVBoxLayout(this);
+	
+	QGridLayout *grid = new QGridLayout();
 	grid -> addWidget(new QLabel(tr("Centre : ")),       0, 0);
 	grid -> addWidget(new QLabel("x"),                   1, 0);
 	grid -> addWidget(x,                                 1, 1);
@@ -50,6 +55,9 @@
 	grid -> addWidget(new QLabel(tr("vertical :")),      4, 0);
 	grid -> addWidget(v,                                 4, 1);
 	
+	v_layout -> addWidget(style_);
+	v_layout -> addLayout(grid);
+	
 	activeConnections(true);
 	updateForm();
 }
@@ -59,9 +67,41 @@
 }
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur d'ellipse acceptera d'editer la primitive new_part s'il s'agit
+	d'un objet de la classe PartEllipse.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool EllipseEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		style_ -> setPart(0);
+		return(true);
+	}
+	if (PartEllipse *part_ellipse = dynamic_cast<PartEllipse *>(new_part)) {
+		part = part_ellipse;
+		style_ -> setPart(part);
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *EllipseEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	Met a jour l'ellipse a partir des donnees du formulaire
 */
 void EllipseEditor::updateEllipse() {
+	if (!part) return;
 	part -> setProperty("x", x -> text().toDouble());
 	part -> setProperty("y", y -> text().toDouble());
 	part -> setProperty("diameter_h", h -> text().toDouble());
@@ -81,6 +121,7 @@
 	Met a jour le formulaire d'edition
 */
 void EllipseEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	x -> setText(part -> property("x").toString());
 	y -> setText(part -> property("y").toString());

Modified: trunk/sources/editor/ellipseeditor.h
===================================================================
--- trunk/sources/editor/ellipseeditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/ellipseeditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -20,6 +20,7 @@
 #include <QtGui>
 #include "elementitemeditor.h"
 class PartEllipse;
+class StyleEditor;
 /**
 	Cette classe represente le widget d'edition d'une ellipse dans l'editeur
 	d'element.
@@ -28,17 +29,22 @@
 	Q_OBJECT
 	//constructeurs, destructeur
 	public:
-	EllipseEditor(QETElementEditor *, PartEllipse *, QWidget * = 0);
-	~EllipseEditor();
+	EllipseEditor(QETElementEditor *, PartEllipse * = 0, QWidget * = 0);
+	virtual ~EllipseEditor();
 	private:
 	EllipseEditor(const EllipseEditor &);
 	
 	// attributs
 	private:
 	PartEllipse *part;
+	StyleEditor *style_;
 	QLineEdit *x, *y, *h, *v;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	public slots:
 	void updateEllipse();
 	void updateEllipseX();

Modified: trunk/sources/editor/lineeditor.cpp
===================================================================
--- trunk/sources/editor/lineeditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/lineeditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,6 +16,7 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "lineeditor.h"
+#include "styleeditor.h"
 #include "partline.h"
 #include "qet.h"
 #include "qeticons.h"
@@ -26,10 +27,12 @@
 	@param line La ligne a editer
 	@param parent le Widget parent
 */
-LineEditor::LineEditor(QETElementEditor *editor, PartLine *line, QWidget *parent) : ElementItemEditor(editor, parent) {
+LineEditor::LineEditor(QETElementEditor *editor, PartLine *line, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(line)
+{
+	style_ = new StyleEditor(editor);
 	
-	part = line;
-	
 	x1 = new QLineEdit();
 	y1 = new QLineEdit();
 	x2 = new QLineEdit();
@@ -78,6 +81,7 @@
 	grid2 -> addWidget(end2_length,             1, 2);
 	
 	QVBoxLayout *v_layout = new QVBoxLayout(this);
+	v_layout -> addWidget(style_);
 	v_layout -> addLayout(grid);
 	v_layout -> addLayout(grid2);
 	updateForm();
@@ -88,9 +92,41 @@
 }
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur de ligne acceptera d'editer la primitive new_part s'il s'agit d'un
+	objet de la classe PartLine.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool LineEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		style_ -> setPart(0);
+		return(true);
+	}
+	if (PartLine *part_line = dynamic_cast<PartLine *>(new_part)) {
+		part = part_line;
+		style_ -> setPart(part);
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *LineEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	Met a jour la ligne a partir des donnees du formulaire
 */
 void LineEditor::updateLine() {
+	if (!part) return;
 	part -> setFirstEndType(static_cast<QET::EndType>(end1_type -> currentIndex()));
 	part -> setFirstEndLength(end1_length -> text().toDouble());
 	part -> setSecondEndType(static_cast<QET::EndType>(end2_type -> currentIndex()));
@@ -130,6 +166,7 @@
 	Met a jour le formulaire d'edition
 */
 void LineEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	QPointF p1(part -> sceneP1());
 	QPointF p2(part -> sceneP2());

Modified: trunk/sources/editor/lineeditor.h
===================================================================
--- trunk/sources/editor/lineeditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/lineeditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -20,6 +20,7 @@
 #include <QtGui>
 #include "elementitemeditor.h"
 class PartLine;
+class StyleEditor;
 /**
 	Cette classe represente le widget d'edition d'une ligne dans l'editeur
 	d'element.
@@ -28,19 +29,24 @@
 	Q_OBJECT
 	//constructeurs, destructeur
 	public:
-	LineEditor(QETElementEditor *, PartLine *, QWidget * = 0);
-	~LineEditor();
+	LineEditor(QETElementEditor *, PartLine * = 0, QWidget * = 0);
+	virtual ~LineEditor();
 	private:
 	LineEditor(const LineEditor &);
 	
 	// attributs
 	private:
 	PartLine *part;
+	StyleEditor *style_;
 	QLineEdit *x1, *y1, *x2, *y2;
 	QComboBox *end1_type, *end2_type;
 	QLineEdit *end1_length, *end2_length;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	public slots:
 	void updateLine();
 	void updateLineX1();

Modified: trunk/sources/editor/partarc.cpp
===================================================================
--- trunk/sources/editor/partarc.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partarc.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,7 +16,6 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "partarc.h"
-#include "arceditor.h"
 
 /**
 	Constructeur
@@ -35,10 +34,6 @@
 	setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 #endif
 	setAcceptedMouseButtons(Qt::LeftButton);
-	informations = new ArcEditor(elementEditor(), this);
-	informations -> setElementTypeName(name());
-	style_editor -> appendWidget(informations);
-	style_editor -> setElementTypeName(name());
 }
 
 /// Destructeur
@@ -209,8 +204,8 @@
 */
 QVariant PartArc::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
-		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			informations -> updateForm();
+		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) {
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsEllipseItem::itemChange(change, value));

Modified: trunk/sources/editor/partarc.h
===================================================================
--- trunk/sources/editor/partarc.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partarc.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -19,7 +19,6 @@
 #define PART_ARC_H
 #include <QtGui>
 #include "customelementgraphicpart.h"
-class ArcEditor;
 /**
 	Cette classe represente un arc pouvant etre utilise pour composer le
 	dessin d'un element dans l'editeur d'element.
@@ -35,7 +34,6 @@
 	
 	// attributs
 	private:
-	ArcEditor *informations;
 	int _angle;
 	int start_angle;
 	
@@ -49,6 +47,7 @@
 	virtual int type() const { return Type; }
 	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0);
 	virtual QString name() const { return(QObject::tr("arc", "element part name")); }
+	virtual QString xmlName() const { return(QString("arc")); }
 	virtual const QDomElement toXml(QDomDocument &) const;
 	virtual void fromXml(const QDomElement &);
 	virtual QPointF sceneTopLeft() const;

Modified: trunk/sources/editor/partcircle.cpp
===================================================================
--- trunk/sources/editor/partcircle.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partcircle.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,7 +16,6 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "partcircle.h"
-#include "circleeditor.h"
 
 /**
 	Constructeur
@@ -30,10 +29,6 @@
 	setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 #endif
 	setAcceptedMouseButtons(Qt::LeftButton);
-	informations = new CircleEditor(elementEditor(), this);
-	informations -> setElementTypeName(name());
-	style_editor -> appendWidget(informations);
-	style_editor -> setElementTypeName(name());
 }
 
 /// Destructeur
@@ -163,8 +158,8 @@
 */
 QVariant PartCircle::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
-		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			informations -> updateForm();
+		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) {
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsEllipseItem::itemChange(change, value));

Modified: trunk/sources/editor/partcircle.h
===================================================================
--- trunk/sources/editor/partcircle.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partcircle.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -19,7 +19,6 @@
 #define PART_CIRCLE_H
 #include <QtGui>
 #include "customelementgraphicpart.h"
-class CircleEditor;
 /**
 	Cette classe represente un cercle pouvant etre utilise pour composer le
 	dessin d'un element dans l'editeur d'element.
@@ -33,10 +32,6 @@
 	private:
 	PartCircle(const PartCircle &);
 	
-	// attributs
-	private:
-	CircleEditor *informations;
-	
 	// methodes
 	public:
 	enum { Type = UserType + 1102 };
@@ -47,6 +42,7 @@
 	virtual int type() const { return Type; }
 	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0);
 	virtual QString name() const { return(QObject::tr("cercle", "element part name")); }
+	virtual QString xmlName() const { return(QString("circle")); }
 	virtual const QDomElement toXml(QDomDocument &) const;
 	virtual void fromXml(const QDomElement &);
 	virtual QPointF sceneTopLeft() const;

Modified: trunk/sources/editor/partellipse.cpp
===================================================================
--- trunk/sources/editor/partellipse.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partellipse.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,7 +16,6 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "partellipse.h"
-#include "ellipseeditor.h"
 
 /**
 	Constructeur
@@ -30,10 +29,6 @@
 	setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 #endif
 	setAcceptedMouseButtons(Qt::LeftButton);
-	informations = new EllipseEditor(elementEditor(), this);
-	informations -> setElementTypeName(name());
-	style_editor -> appendWidget(informations);
-	style_editor -> setElementTypeName(name());
 }
 
 /// Destructeur
@@ -170,8 +165,8 @@
 */
 QVariant PartEllipse::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
-		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			informations -> updateForm();
+		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) {
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsEllipseItem::itemChange(change, value));

Modified: trunk/sources/editor/partellipse.h
===================================================================
--- trunk/sources/editor/partellipse.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partellipse.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -19,7 +19,6 @@
 #define PART_ELLIPSE_H
 #include <QtGui>
 #include "customelementgraphicpart.h"
-class EllipseEditor;
 /**
 	Cette classe represente une ellipse pouvant etre utilisee pour composer le
 	dessin d'un element dans l'editeur d'element.
@@ -33,10 +32,6 @@
 	private:
 	PartEllipse(const PartEllipse &);
 	
-	// attributs
-	private:
-	EllipseEditor *informations;
-	
 	// methodes
 	public:
 	enum { Type = UserType + 1103 };
@@ -47,6 +42,7 @@
 	virtual int type() const { return Type; }
 	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0);
 	virtual QString name() const { return(QObject::tr("ellipse", "element part name")); }
+	virtual QString xmlName() const { return(QString("ellipse")); }
 	virtual const QDomElement toXml(QDomDocument &) const;
 	virtual void fromXml(const QDomElement &);
 	virtual QPointF sceneTopLeft() const;

Modified: trunk/sources/editor/partline.cpp
===================================================================
--- trunk/sources/editor/partline.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partline.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,7 +16,6 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "partline.h"
-#include "lineeditor.h"
 #include <cmath>
 
 /**
@@ -38,10 +37,6 @@
 	setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 #endif
 	setAcceptedMouseButtons(Qt::LeftButton);
-	informations = new LineEditor(elementEditor(), this);
-	informations -> setElementTypeName(name());
-	style_editor -> appendWidget(informations);
-	style_editor -> setElementTypeName(name());
 }
 
 /// Destructeur
@@ -287,8 +282,8 @@
 */
 QVariant PartLine::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
-		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			informations -> updateForm();
+		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) {
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsLineItem::itemChange(change, value));

Modified: trunk/sources/editor/partline.h
===================================================================
--- trunk/sources/editor/partline.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partline.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -20,7 +20,6 @@
 #include <QtGui>
 #include "customelementgraphicpart.h"
 #include "qet.h"
-class LineEditor;
 /**
 	Cette classe represente une ligne pouvant etre utilisee pour composer le
 	dessin d'un element dans l'editeur d'element.
@@ -43,7 +42,6 @@
 	
 	// attributs
 	private:
-	LineEditor *informations;
 	QET::EndType first_end;
 	qreal first_length;
 	QET::EndType second_end;
@@ -60,6 +58,7 @@
 	virtual int type() const { return Type; }
 	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0);
 	virtual QString name() const { return(QObject::tr("ligne", "element part name")); }
+	virtual QString xmlName() const { return(QString("line")); }
 	virtual const QDomElement toXml(QDomDocument &) const;
 	virtual void fromXml(const QDomElement &);
 	virtual QPointF sceneP1() const;

Modified: trunk/sources/editor/partpolygon.cpp
===================================================================
--- trunk/sources/editor/partpolygon.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partpolygon.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -17,7 +17,6 @@
 */
 #include "partpolygon.h"
 #include "qet.h"
-#include "polygoneditor.h"
 
 /**
 	Constructeur
@@ -35,10 +34,6 @@
 	setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 #endif
 	setAcceptedMouseButtons(Qt::LeftButton);
-	informations = new PolygonEditor(elementEditor(), this);
-	informations -> setElementTypeName(name());
-	style_editor -> appendWidget(informations);
-	style_editor -> setElementTypeName(name());
 }
 
 /// Destructeur
@@ -142,8 +137,8 @@
 */
 QVariant PartPolygon::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
-		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			informations -> updateForm();
+		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) {
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsPolygonItem::itemChange(change, value));

Modified: trunk/sources/editor/partpolygon.h
===================================================================
--- trunk/sources/editor/partpolygon.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partpolygon.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -19,7 +19,6 @@
 #define PART_POLYGON_H
 #include <QtGui>
 #include "customelementgraphicpart.h"
-class PolygonEditor;
 /**
 	Cette classe represente un polygone pouvant etre utilise pour composer le
 	dessin d'un element dans l'editeur d'element.
@@ -36,20 +35,7 @@
 	// attributs
 	private:
 	bool closed;
-	PolygonEditor *informations;
 	
-	/**
-		constructeur
-		paint()
-		widget bidon pour l'edition
-		methode pour poser le polygone :
-			-mousePressEvent = pose un nouveau point
-			-mouseMoveEvent = deplace ce point
-			-mouveReleaseEvent = finalise ce point
-		utiliser QPolygonF ; memoriser le point en cours (tout comme le
-		partploygon en cours) et ne l'ajouter au qpolygonf que lors du
-		mouseReleaseEvent
-	*/
 	// methodes
 	public:
 	enum { Type = UserType + 1105 };
@@ -59,6 +45,7 @@
 	*/
 	virtual int type() const { return Type; }
 	virtual QString name() const { return(QObject::tr("polygone", "element part name")); }
+	virtual QString xmlName() const { return(QString("polygon")); }
 	void fromXml(const QDomElement &);
 	const QDomElement toXml(QDomDocument &) const;
 	virtual QRectF boundingRect() const;

Modified: trunk/sources/editor/partrectangle.cpp
===================================================================
--- trunk/sources/editor/partrectangle.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partrectangle.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -16,7 +16,6 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "partrectangle.h"
-#include "rectangleeditor.h"
 
 /**
 	Constructeur
@@ -30,10 +29,6 @@
 	setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 #endif
 	setAcceptedMouseButtons(Qt::LeftButton);
-	informations = new RectangleEditor(elementEditor(), this);
-	informations -> setElementTypeName(name());
-	style_editor -> appendWidget(informations);
-	style_editor -> setElementTypeName(name());
 }
 
 /// Destructeur
@@ -177,8 +172,8 @@
 */
 QVariant PartRectangle::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
-		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			informations -> updateForm();
+		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) {
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsRectItem::itemChange(change, value));

Modified: trunk/sources/editor/partrectangle.h
===================================================================
--- trunk/sources/editor/partrectangle.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partrectangle.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -19,7 +19,6 @@
 #define PART_RECTANGLE_H
 #include <QtGui>
 #include "customelementgraphicpart.h"
-class RectangleEditor;
 /**
 	Cette classe represente un rectangle pouvant etre utilise pour composer le
 	dessin d'un element dans l'editeur d'element.
@@ -33,10 +32,6 @@
 	private:
 	PartRectangle(const PartRectangle &);
 	
-	// attributs
-	private:
-	RectangleEditor *informations;
-	
 	// methodes
 	public:
 	enum { Type = UserType + 1109 };
@@ -47,6 +42,7 @@
 	virtual int type() const { return Type; }
 	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0);
 	virtual QString name() const { return(QObject::tr("rectangle", "element part name")); }
+	virtual QString xmlName() const { return(QString("rect")); }
 	virtual const QDomElement toXml(QDomDocument &) const;
 	virtual void fromXml(const QDomElement &);
 	virtual QPointF sceneTopLeft() const;

Modified: trunk/sources/editor/partterminal.cpp
===================================================================
--- trunk/sources/editor/partterminal.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partterminal.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -17,7 +17,6 @@
 */
 #include "partterminal.h"
 #include "terminal.h"
-#include "terminaleditor.h"
 
 /**
 	Constructeur
@@ -30,8 +29,6 @@
 	QGraphicsItem(parent, scene),
 	_orientation(QET::North)
 {
-	informations = new TerminalEditor(elementEditor(), this);
-	informations -> setElementTypeName(name());
 	updateSecondPoint();
 	setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
 #if QT_VERSION >= 0x040600
@@ -42,9 +39,7 @@
 
 /// Destructeur
 PartTerminal::~PartTerminal() {
-	if (informations -> parentWidget()) return; // le widget sera supprime par son parent
-	delete informations;
-};
+}
 
 /**
 	Importe les proprietes d'une borne depuis un element XML
@@ -81,13 +76,6 @@
 }
 
 /**
-	@return Le widget permettant d'editer cette borne
-*/
-QWidget *PartTerminal::elementInformations() {
-	return(informations);
-}
-
-/**
 	Dessine la borne
 	@param p QPainter a utiliser pour rendre le dessin
 	@param options Options pour affiner le rendu
@@ -152,7 +140,6 @@
 	prepareGeometryChange();
 	_orientation = ori;
 	updateSecondPoint();
-	informations -> updateForm();
 }
 
 /**
@@ -202,8 +189,8 @@
 */
 QVariant PartTerminal::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
-		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			informations -> updateForm();
+		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) {
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsItem::itemChange(change, value));

Modified: trunk/sources/editor/partterminal.h
===================================================================
--- trunk/sources/editor/partterminal.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/partterminal.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -20,8 +20,6 @@
 #include "customelementpart.h"
 #include "qet.h"
 #include <QtGui>
-class TerminalEditor;
-class QETElementEditor;
 /**
 	Cette classe represente une borne pouvant etre utilisee pour composer le
 	dessin d'un element dans l'editeur d'element.
@@ -38,7 +36,6 @@
 	private:
 	QET::Orientation _orientation;
 	QPointF second_point;
-	TerminalEditor *informations;
 	
 	// methodes
 	public:
@@ -49,9 +46,9 @@
 	*/
 	virtual int type() const { return Type; }
 	virtual QString name() const { return(QObject::tr("borne", "element part name")); }
+	virtual QString xmlName() const { return(QString("terminal")); }
 	virtual void fromXml(const QDomElement &);
 	virtual const QDomElement toXml(QDomDocument &) const;
-	virtual QWidget *elementInformations();
 	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
 	virtual QRectF boundingRect() const;
 	QET::Orientation orientation() const;

Modified: trunk/sources/editor/parttext.cpp
===================================================================
--- trunk/sources/editor/parttext.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/parttext.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -38,14 +38,10 @@
 	setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 #endif
 	setPlainText(QObject::tr("T", "default text when adding a text in the element editor"));
-	infos = new TextEditor(elementEditor(), this);
-	infos -> setElementTypeName(name());
 }
 
 /// Destructeur
 PartText::~PartText() {
-	if (infos -> parentWidget()) return; // le widget sera supprime par son parent
-	delete infos;
 }
 
 /**
@@ -80,13 +76,6 @@
 }
 
 /**
-	@return Le widget permettant d'editer ce texte statique
-*/
-QWidget *PartText::elementInformations() {
-	return(infos);
-}
-
-/**
 	Retourne la position du texte, l'origine etant le point en bas a gauche du
 	texte (et pas du cadre)
 	@return la position du texte
@@ -220,7 +209,7 @@
 QVariant PartText::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
 		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			infos -> updateForm();
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsTextItem::itemChange(change, value));

Modified: trunk/sources/editor/parttext.h
===================================================================
--- trunk/sources/editor/parttext.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/parttext.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -33,9 +33,6 @@
 	private:
 	PartText(const PartText &);
 	
-	// attributs
-	TextEditor *infos;
-	
 	// methodes
 	public:
 	enum { Type = UserType + 1107 };
@@ -45,9 +42,9 @@
 	*/
 	virtual int type() const { return Type; }
 	virtual QString name() const { return(QObject::tr("texte", "element part name")); }
+	virtual QString xmlName() const { return(QString("text")); }
 	void fromXml(const QDomElement &);
 	const QDomElement toXml(QDomDocument &) const;
-	QWidget *elementInformations();
 	QPointF pos() const;
 	void setPos(const QPointF &);
 	void setPos(qreal, qreal);

Modified: trunk/sources/editor/parttextfield.cpp
===================================================================
--- trunk/sources/editor/parttextfield.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/parttextfield.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -38,14 +38,10 @@
 	setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 #endif
 	setPlainText(QObject::tr("_", "default text when adding a textfield in the element editor"));
-	infos = new TextFieldEditor(elementEditor(), this);
-	infos -> setElementTypeName(name());
 }
 
 /// Destructeur
 PartTextField::~PartTextField() {
-	if (infos -> parentWidget()) return; // le widget sera supprime par son parent
-	delete infos;
 }
 
 /**
@@ -83,13 +79,6 @@
 }
 
 /**
-	@return Le widget permettant d'editer ce champ de texte
-*/
-QWidget *PartTextField::elementInformations() {
-	return(infos);
-}
-
-/**
 	Retourne la position du texte, l'origine etant le point en bas a gauche du
 	texte (et pas du cadre)
 	@return la position du texte
@@ -245,7 +234,7 @@
 QVariant PartTextField::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
 		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
-			infos -> updateForm();
+			updateCurrentPartEditor();
 		}
 	}
 	return(QGraphicsTextItem::itemChange(change, value));

Modified: trunk/sources/editor/parttextfield.h
===================================================================
--- trunk/sources/editor/parttextfield.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/parttextfield.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -37,7 +37,6 @@
 	PartTextField(const PartTextField &);
 	
 	// attributs
-	TextFieldEditor *infos;
 	bool follow_parent_rotations;
 	
 	// methodes
@@ -49,9 +48,9 @@
 	*/
 	virtual int type() const { return Type; }
 	virtual QString name() const { return(QObject::tr("champ de texte", "element part name")); }
+	virtual QString xmlName() const { return(QString("input")); }
 	void fromXml(const QDomElement &);
 	const QDomElement toXml(QDomDocument &) const;
-	QWidget *elementInformations();
 	QPointF pos() const;
 	void setPos(const QPointF &);
 	void setPos(qreal, qreal);

Modified: trunk/sources/editor/polygoneditor.cpp
===================================================================
--- trunk/sources/editor/polygoneditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/polygoneditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -29,10 +29,12 @@
 */
 PolygonEditor::PolygonEditor(QETElementEditor *editor, PartPolygon *p, QWidget *parent) :
 	ElementItemEditor(editor, parent),
+	part(p),
 	points_list(this),
 	close_polygon(tr("Polygone ferm\351"), this)
 {
-	part = p;
+	style_ = new StyleEditor(editor);
+	
 	// prepare la liste de points
 	points_list.setColumnCount(2);
 	QStringList headers;
@@ -43,6 +45,7 @@
 	
 	// layout
 	QVBoxLayout *layout = new QVBoxLayout(this);
+	layout -> addWidget(style_);
 	layout -> addWidget(new QLabel(tr("Points du polygone :")));
 	layout -> addWidget(&points_list);
 	layout -> addWidget(&close_polygon);
@@ -66,6 +69,7 @@
 	Met a jour les points du polygone et cree un objet d'annulation
 */
 void PolygonEditor::updatePolygonPoints() {
+	if (!part) return;
 	QVector<QPointF> points = getPointsFromTree();
 	if (points.count() < 2) {
 		QET::MessageBox::warning(
@@ -82,6 +86,7 @@
 	Met a jour l'etat ferme ou non du polygone
 */
 void PolygonEditor::updatePolygonClosedState() {
+	if (!part) return;
 	undoStack().push(
 		new ChangePartCommand(
 			tr("fermeture du polygone"),
@@ -97,6 +102,7 @@
 	Met a jour le formulaire d'edition
 */
 void PolygonEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	while(points_list.takeTopLevelItem(0)) {}
 	foreach(QPointF point, part -> polygon()) {
@@ -112,10 +118,42 @@
 }
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur de polygone acceptera d'editer la primitive new_part s'il s'agit
+	d'un objet de la classe PartPolygon.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool PolygonEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		style_ -> setPart(0);
+		return(true);
+	}
+	if (PartPolygon *part_polygon = dynamic_cast<PartPolygon *>(new_part)) {
+		part = part_polygon;
+		style_ -> setPart(part);
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *PolygonEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	@return Un vecteur contenant les points composant le polygone a partir du
 	formulaire d'edition
 */
 QVector<QPointF> PolygonEditor::getPointsFromTree() {
+	if (!part) return(QVector<QPointF>());
 	QVector<QPointF> points;
 	for(int i = 0 ; i < points_list.topLevelItemCount() ; ++ i) {
 		QTreeWidgetItem *qtwi = points_list.topLevelItem(i);

Modified: trunk/sources/editor/polygoneditor.h
===================================================================
--- trunk/sources/editor/polygoneditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/polygoneditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -19,6 +19,7 @@
 #define POLYGON_EDITOR_H
 #include "elementitemeditor.h"
 class PartPolygon;
+class StyleEditor;
 /**
 	Cette classe represente le widget d'edition d'un polygone dans l'editeur
 	d'element.
@@ -29,7 +30,7 @@
 	
 	// constructeurs, destructeur
 	public:
-	PolygonEditor(QETElementEditor *, PartPolygon *, QWidget * = 0);
+	PolygonEditor(QETElementEditor *, PartPolygon * = 0, QWidget * = 0);
 	virtual ~PolygonEditor();
 	
 	private:
@@ -38,10 +39,15 @@
 	// attributs
 	private:
 	PartPolygon *part;
+	StyleEditor *style_;
 	QTreeWidget points_list;
 	QCheckBox close_polygon;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	private:
 	QVector<QPointF> getPointsFromTree();
 	

Modified: trunk/sources/editor/qetelementeditor.cpp
===================================================================
--- trunk/sources/editor/qetelementeditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/qetelementeditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -28,6 +28,17 @@
 #include "qeticons.h"
 #include "qetmessagebox.h"
 
+// editeurs de primitives
+#include "arceditor.h"
+#include "circleeditor.h"
+#include "ellipseeditor.h"
+#include "lineeditor.h"
+#include "polygoneditor.h"
+#include "rectangleeditor.h"
+#include "terminaleditor.h"
+#include "texteditor.h"
+#include "textfieldeditor.h"
+
 /**
 	Constructeur
 	@param parent QWidget parent
@@ -60,11 +71,14 @@
 /// Destructeur
 QETElementEditor::~QETElementEditor() {
 	/*
-		retire le widget d'edition de partie affiche par le dock
-		cela evite qu'il ne soit supprime avant que la partie a laquelle il est
-		rattache ne le supprime une fois de trop
+		retire le widget d'edition de primitives affiche par le dock
+		cela evite qu'il ne soit supprime par son widget parent
 	*/
 	clearToolsDock();
+	
+	// supprime les editeurs de primitives
+	qDeleteAll(editors_.begin(), editors_.end());
+	editors_.clear();
 }
 
 /**
@@ -314,7 +328,14 @@
 	connect(QApplication::clipboard(),  SIGNAL(dataChanged()),      this, SLOT(slot_updateMenus()));
 	connect(&(ce_scene -> undoStack()), SIGNAL(cleanChanged(bool)), this, SLOT(slot_updateMenus()));
 	connect(&(ce_scene -> undoStack()), SIGNAL(cleanChanged(bool)), this, SLOT(slot_updateTitle()));
+	
+	// Annuler ou refaire une action met a jour la liste des primitives ; cela sert notamment pour les
+	// ajouts et suppressions de primitives ainsi que pour les actions entrainant un change
 	connect(&(ce_scene -> undoStack()), SIGNAL(indexChanged(int)),  this, SLOT(slot_updatePartsList()));
+	
+	// Annuler ou refaire une action met a jour les informations affichees sur les primitives selectionnees,
+	// celles-ci etant potentiellement impactees
+	connect(&(ce_scene -> undoStack()), SIGNAL(indexChanged(int)),  this, SLOT(slot_updateInformations()));
 }
 
 /**
@@ -496,6 +517,17 @@
 	tools_dock_stack_ -> insertWidget(0, default_informations);
 	tools_dock_stack_ -> insertWidget(1, tools_dock_scroll_area_);
 	
+	// widgets d'editions pour les parties
+	editors_["arc"]       = new ArcEditor(this);
+	editors_["circle"]    = new CircleEditor(this);
+	editors_["ellipse"]   = new EllipseEditor(this);
+	editors_["line"]      = new LineEditor(this);
+	editors_["polygon"]   = new PolygonEditor(this);
+	editors_["rect"]      = new RectangleEditor(this);
+	editors_["terminal"]  = new TerminalEditor(this);
+	editors_["text"]      = new TextEditor(this);
+	editors_["input"]     = new TextFieldEditor(this);
+	
 	// panel sur le cote pour editer les parties
 	tools_dock = new QDockWidget(tr("Informations", "dock title"), this);
 	tools_dock -> setObjectName("informations");
@@ -564,33 +596,37 @@
 }
 
 /**
-	Met a jour la zone d'information et d'edition.
-	Si plusieurs parties sont selectionnees, seul leur nombre est affiche.
-	Sinon, le widget d'edition de la partie est insere.
-	@see CustomElementPart::elementInformations()
+	Met a jour la zone d'information et d'edition des primitives.
+	Si plusieurs primitives sont selectionnees, seule leur quantite est
+	affichee. Sinon, un widget d'edition approprie est mis en place.
 */
 void QETElementEditor::slot_updateInformations() {
 	QList<QGraphicsItem *> selected_qgis = ce_scene -> selectedItems();
-	QList<CustomElementPart *> selected_parts;
-	foreach(QGraphicsItem *qgi, selected_qgis) {
-		if (CustomElementPart *cep = dynamic_cast<CustomElementPart *>(qgi)) {
-			selected_parts.append(cep);
-		}
-	}
 	
 	clearToolsDock();
 	
-	if (selected_parts.size() == 1) {
-		// recupere le premier CustomElementPart et en ajoute le widget d'edition
-		QWidget *edit_widget = selected_parts.first() -> elementInformations();
-		tools_dock_scroll_area_ -> setWidget(edit_widget);
-		tools_dock_stack_ -> setCurrentIndex(1);
+	// s'il n'y a qu'une seule primitive selectionnee
+	if (selected_qgis.size() == 1) {
+		QGraphicsItem *qgi = selected_qgis.first();
+		if (CustomElementPart *selection = dynamic_cast<CustomElementPart *>(qgi)) {
+			// on en ajoute le widget d'edition
+			QString selection_xml_name = selection -> xmlName();
+			ElementItemEditor *selection_editor = editors_[selection_xml_name];
+			if (selection_editor) {
+				if (selection_editor -> setPart(selection)) {
+					tools_dock_scroll_area_ -> setWidget(selection_editor);
+					tools_dock_stack_ -> setCurrentIndex(1);
+				} else {
+					qDebug() << "Editor refused part.";
+				}
+			}
+		}
 	} else {
 		default_informations -> setText(
 			tr(
 				"%n partie(s) s\351lectionn\351e(s).",
 				"",
-				selected_parts.size()
+				selected_qgis.size()
 			)
 		);
 		default_informations -> setAlignment(Qt::AlignHCenter | Qt::AlignTop);
@@ -1326,3 +1362,17 @@
 	
 	copyAndPasteXml(document_xml);
 }
+
+/**
+	Met a jour l'editeur de primitive actuellement visible.
+	Si aucun editeur de primitive n'est visible, ce slot ne fait rien.
+*/
+void QETElementEditor::updateCurrentPartEditor() {
+	// si aucun widget d'edition n'est affiche, on ne fait rien
+	if (!tools_dock_stack_ -> currentIndex()) return;
+	
+	// s'il y a un widget d'edition affiche, on le met a jour
+	if (ElementItemEditor *current_editor = dynamic_cast<ElementItemEditor *>(tools_dock_scroll_area_ -> widget())) {
+		current_editor -> updateForm();
+	}
+}

Modified: trunk/sources/editor/qetelementeditor.h
===================================================================
--- trunk/sources/editor/qetelementeditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/qetelementeditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -22,6 +22,7 @@
 #include "elementscene.h"
 #include "orientationset.h"
 #include "elementslocation.h"
+class ElementItemEditor;
 class ElementView;
 /**
 	Cette classe represente un editeur d'element. Elle permet a l'utilisateur
@@ -54,6 +55,8 @@
 	QStackedWidget *tools_dock_stack_;
 	/// label affiche lors de la selection de plusieurs elements
 	QLabel *default_informations;
+	/// Hash permettant d'acceder aux widgets d'editions disponibles
+	QHash<QString, ElementItemEditor *> editors_;
 	/// ScrollArea pour le DockWidget affichant des infos sur la partie selectionnee
 	QScrollArea *tools_dock_scroll_area_;
 	/// container pour la liste des annulations
@@ -156,6 +159,7 @@
 	bool checkElement();
 	void pasteFromFile();
 	void pasteFromElement();
+	void updateCurrentPartEditor();
 };
 
 /**

Modified: trunk/sources/editor/rectangleeditor.cpp
===================================================================
--- trunk/sources/editor/rectangleeditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/rectangleeditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -24,10 +24,12 @@
 	@param rect Le rectangle a editer
 	@param parent le Widget parent
 */
-RectangleEditor::RectangleEditor(QETElementEditor *editor, PartRectangle *rect, QWidget *parent) : ElementItemEditor(editor, parent) {
+RectangleEditor::RectangleEditor(QETElementEditor *editor, PartRectangle *rect, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(rect)
+{
+	style_ = new StyleEditor(editor);
 	
-	part = rect;
-	
 	x = new QLineEdit();
 	y = new QLineEdit();
 	w = new QLineEdit();
@@ -38,7 +40,9 @@
 	w -> setValidator(new QDoubleValidator(w));
 	h -> setValidator(new QDoubleValidator(h));
 	
-	QGridLayout *grid = new QGridLayout(this);
+	QVBoxLayout *v_layout = new QVBoxLayout(this);
+	
+	QGridLayout *grid = new QGridLayout();
 	grid -> addWidget(new QLabel(tr("Coin sup\351rieur gauche\240: ")), 0, 0);
 	grid -> addWidget(new QLabel("x"),                                  1, 0);
 	grid -> addWidget(x,                                                1, 1);
@@ -50,6 +54,9 @@
 	grid -> addWidget(new QLabel(tr("Hauteur\240:")),                   4, 0);
 	grid -> addWidget(h,                                                4, 1);
 	
+	v_layout -> addWidget(style_);
+	v_layout -> addLayout(grid);
+	
 	activeConnections(true);
 	updateForm();
 }
@@ -59,9 +66,41 @@
 }
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur de rectangle acceptera d'editer la primitive new_part s'il s'agit
+	d'un objet de la classe PartRectangle.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool RectangleEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		style_ -> setPart(0);
+		return(true);
+	}
+	if (PartRectangle *part_rectangle = dynamic_cast<PartRectangle *>(new_part)) {
+		part = part_rectangle;
+		style_ -> setPart(part);
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *RectangleEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	Met a jour le rectangle a partir des donnees du formulaire
 */
 void RectangleEditor::updateRectangle() {
+	if (!part) return;
 	part -> setProperty("x",      x -> text().toDouble());
 	part -> setProperty("y",      y -> text().toDouble());
 	part -> setProperty("width",  w -> text().toDouble());
@@ -81,6 +120,7 @@
 	Met a jour le formulaire d'edition
 */
 void RectangleEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	x -> setText(part -> property("x").toString());
 	y -> setText(part -> property("y").toString());

Modified: trunk/sources/editor/rectangleeditor.h
===================================================================
--- trunk/sources/editor/rectangleeditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/rectangleeditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -20,6 +20,7 @@
 #include <QtGui>
 #include "elementitemeditor.h"
 class PartRectangle;
+class StyleEditor;
 /**
 	Cette classe represente le widget d'edition d'un rectangle dans l'editeur
 	d'element.
@@ -28,17 +29,22 @@
 	Q_OBJECT
 	//constructeurs, destructeur
 	public:
-	RectangleEditor(QETElementEditor *, PartRectangle *, QWidget * = 0);
-	~RectangleEditor();
+	RectangleEditor(QETElementEditor *, PartRectangle * = 0, QWidget * = 0);
+	virtual ~RectangleEditor();
 	private:
 	RectangleEditor(const RectangleEditor &);
 	
 	// attributs
 	private:
 	PartRectangle *part;
+	StyleEditor *style_;
 	QLineEdit *x, *y, *w, *h;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	public slots:
 	void updateRectangle();
 	void updateRectangleX();

Modified: trunk/sources/editor/styleeditor.cpp
===================================================================
--- trunk/sources/editor/styleeditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/styleeditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -24,7 +24,10 @@
 	@param p La partie a editer
 	@param parent le Widget parent
 */
-StyleEditor::StyleEditor(QETElementEditor *editor, CustomElementGraphicPart *p, QWidget *parent) : ElementItemEditor(editor, parent), part(p) {
+StyleEditor::StyleEditor(QETElementEditor *editor, CustomElementGraphicPart *p, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(p)
+{
 	// couleur
 	color = new QButtonGroup(this);
 	color -> addButton(black_color = new QRadioButton(tr("Noir", "element part color")),  CustomElementGraphicPart::BlackColor);
@@ -34,7 +37,7 @@
 	style = new QButtonGroup(this);
 	style -> addButton(normal_style = new QRadioButton(tr("Normal", "element part line style")),       CustomElementGraphicPart::NormalStyle);
 	style -> addButton(dashed_style = new QRadioButton(tr("Pointill\351", "element part line style")), CustomElementGraphicPart::DashedStyle);
-	style -> button(part -> lineStyle()) -> setChecked(true);
+	normal_style -> setChecked(true);
 	
 	// epaisseur
 	weight = new QButtonGroup(this);
@@ -102,6 +105,7 @@
 	Met a jour le style de la partie a partir des donnees du formulaire
 */
 void StyleEditor::updatePart() {
+	if (!part) return;
 	// applique l'antialiasing
 	part -> setAntialiased(antialiasing -> isChecked());
 	
@@ -133,6 +137,7 @@
 	Met a jour le formulaire d'edition
 */
 void StyleEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	// lit l'antialiasing
 	antialiasing -> setChecked(part -> antialiased());
@@ -152,14 +157,35 @@
 }
 
 /**
-	Ajoute un widget en bas de l'editeur de style
-	@param w Widget a inserer
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur de ligne acceptera d'editer la primitive new_part s'il s'agit d'un
+	objet de la classe CustomElementGraphicPart.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
 */
-void StyleEditor::appendWidget(QWidget *w) {
-	main_layout -> insertWidget(7, w);
+bool StyleEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		return(true);
+	}
+	if (CustomElementGraphicPart *part_graphic = dynamic_cast<CustomElementGraphicPart *>(new_part)) {
+		part = part_graphic;
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
 }
 
 /**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *StyleEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	Active ou desactive les connexionx signaux/slots entre les widgets internes.
 	@param active true pour activer les connexions, false pour les desactiver
 */

Modified: trunk/sources/editor/styleeditor.h
===================================================================
--- trunk/sources/editor/styleeditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/styleeditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -30,7 +30,7 @@
 	Q_OBJECT
 	// constructeurs, destructeur
 	public:
-	StyleEditor(QETElementEditor *, CustomElementGraphicPart *, QWidget * = 0);
+	StyleEditor(QETElementEditor *, CustomElementGraphicPart * = 0, QWidget * = 0);
 	virtual ~StyleEditor();
 	
 	private:
@@ -46,9 +46,10 @@
 	QRadioButton *black_filling, *white_filling;
 	QCheckBox *antialiasing;
 	
-	//methodes
+	// methodes
 	public:
-	void appendWidget(QWidget *w);
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
 	
 	public slots:
 	void updatePart();

Modified: trunk/sources/editor/terminaleditor.cpp
===================================================================
--- trunk/sources/editor/terminaleditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/terminaleditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -25,9 +25,10 @@
 	@param term La borne a editer
 	@param parent QWidget parent de ce widget
 */
-TerminalEditor::TerminalEditor(QETElementEditor *editor, PartTerminal *term, QWidget *parent) : ElementItemEditor(editor, parent) {
-	part = term;
-	
+TerminalEditor::TerminalEditor(QETElementEditor *editor, PartTerminal *term, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(term)
+{
 	qle_x = new QLineEdit();
 	qle_y = new QLineEdit();
 	
@@ -66,9 +67,39 @@
 };
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur de borne acceptera d'editer la primitive new_part s'il s'agit d'un
+	objet de la classe PartTerminal.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool TerminalEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		return(true);
+	}
+	if (PartTerminal *part_terminal = dynamic_cast<PartTerminal *>(new_part)) {
+		part = part_terminal;
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *TerminalEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	Met a jour la borne a partir des donnees du formulaire
 */
 void TerminalEditor::updateTerminal() {
+	if (!part) return;
 	part -> setPos(qle_x -> text().toDouble(), qle_y -> text().toDouble());
 	part -> setOrientation(
 		static_cast<QET::Orientation>(
@@ -90,6 +121,7 @@
 	Met a jour le formulaire d'edition
 */
 void TerminalEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	qle_x -> setText(part -> property("x").toString());
 	qle_y -> setText(part -> property("y").toString());

Modified: trunk/sources/editor/terminaleditor.h
===================================================================
--- trunk/sources/editor/terminaleditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/terminaleditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -29,7 +29,7 @@
 	Q_OBJECT
 	// Constructeurs, destructeur
 	public:
-	TerminalEditor(QETElementEditor *, PartTerminal *, QWidget * = 0);
+	TerminalEditor(QETElementEditor *, PartTerminal * = 0, QWidget * = 0);
 	virtual ~TerminalEditor();
 	private:
 	TerminalEditor(const TerminalEditor &);
@@ -41,6 +41,10 @@
 	QComboBox *orientation;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	public slots:
 	void updateTerminal();
 	void updateTerminalX();

Modified: trunk/sources/editor/texteditor.cpp
===================================================================
--- trunk/sources/editor/texteditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/texteditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -24,9 +24,10 @@
 	@param text Champ de texte a editer
 	@param parent QWidget parent de ce widget
 */
-TextEditor::TextEditor(QETElementEditor *editor, PartText *text, QWidget *parent) : ElementItemEditor(editor, parent) {
-	part = text;
-	
+TextEditor::TextEditor(QETElementEditor *editor, PartText *text, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(text)
+{
 	qle_x     = new QLineEdit();
 	qle_y     = new QLineEdit();
 	qle_text  = new QLineEdit();
@@ -68,9 +69,39 @@
 }
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur de texte statique acceptera d'editer la primitive new_part s'il
+	s'agit d'un objet de la classe PartText.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool TextEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		return(true);
+	}
+	if (PartText *part_text = dynamic_cast<PartText *>(new_part)) {
+		part = part_text;
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *TextEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	Met a jour le champ de texte a partir des donnees du formulaire
 */
 void TextEditor::updateText() {
+	if (!part) return;
 	part -> setProperty("size", font_size -> value());
 	part -> setPlainText(qle_text -> text());
 	part -> setPos(qle_x -> text().toDouble(), qle_y -> text().toDouble());
@@ -89,6 +120,7 @@
 	Met a jour le formulaire a partir du champ de texte
 */
 void TextEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	qle_x     -> setText(part -> property("x").toString());
 	qle_y     -> setText(part -> property("y").toString());

Modified: trunk/sources/editor/texteditor.h
===================================================================
--- trunk/sources/editor/texteditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/texteditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -29,7 +29,7 @@
 	Q_OBJECT
 	// Constructeurs, destructeur
 	public:
-	TextEditor(QETElementEditor *, PartText *, QWidget * = 0);
+	TextEditor(QETElementEditor *, PartText * = 0, QWidget * = 0);
 	virtual ~TextEditor();
 	private:
 	TextEditor(const TextEditor &);
@@ -41,6 +41,10 @@
 	QSpinBox *font_size;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	public slots:
 	void updateText();
 	void updateTextX();

Modified: trunk/sources/editor/textfieldeditor.cpp
===================================================================
--- trunk/sources/editor/textfieldeditor.cpp	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/textfieldeditor.cpp	2010-02-18 00:17:34 UTC (rev 855)
@@ -24,9 +24,10 @@
 	@param textfield Le champ de texte a editer
 	@param parent QWidget parent
 */
-TextFieldEditor::TextFieldEditor(QETElementEditor *editor, PartTextField *textfield, QWidget *parent) : ElementItemEditor(editor, parent) {
-	part = textfield;
-	
+TextFieldEditor::TextFieldEditor(QETElementEditor *editor, PartTextField *textfield, QWidget *parent) :
+	ElementItemEditor(editor, parent),
+	part(textfield)
+{
 	qle_x     = new QLineEdit();
 	qle_y     = new QLineEdit();
 	qle_text  = new QLineEdit();
@@ -72,9 +73,39 @@
 }
 
 /**
+	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
+	qu'un editeur peut accepter ou refuser d'editer une primitive.
+	L'editeur de texte dynamique acceptera d'editer la primitive new_part s'il
+	s'agit d'un objet de la classe PartTextField.
+	@param new_part Nouvelle primitive a editer
+	@return true si l'editeur a accepter d'editer la primitive, false sinon
+*/
+bool TextFieldEditor::setPart(CustomElementPart *new_part) {
+	if (!new_part) {
+		part = 0;
+		return(true);
+	}
+	if (PartTextField *part_textfield = dynamic_cast<PartTextField *>(new_part)) {
+		part = part_textfield;
+		updateForm();
+		return(true);
+	} else {
+		return(false);
+	}
+}
+
+/**
+	@return la primitive actuellement editee, ou 0 si ce widget n'en edite pas
+*/
+CustomElementPart *TextFieldEditor::currentPart() const {
+	return(part);
+}
+
+/**
 	Met a jour le champ de texte a partir des donnees du formulaire
 */
 void TextFieldEditor::updateTextField() {
+	if (!part) return;
 	part -> setProperty("size", font_size -> value());
 	part -> setPlainText(qle_text -> text());
 	part -> setPos(qle_x -> text().toDouble(), qle_y -> text().toDouble());
@@ -96,6 +127,7 @@
 	Met a jour le formulaire d'edition
 */
 void TextFieldEditor::updateForm() {
+	if (!part) return;
 	activeConnections(false);
 	qle_x     -> setText(part -> property("x").toString());
 	qle_y     -> setText(part -> property("y").toString());

Modified: trunk/sources/editor/textfieldeditor.h
===================================================================
--- trunk/sources/editor/textfieldeditor.h	2010-02-14 16:28:45 UTC (rev 854)
+++ trunk/sources/editor/textfieldeditor.h	2010-02-18 00:17:34 UTC (rev 855)
@@ -30,7 +30,7 @@
 	Q_OBJECT
 	// Constructeurs, destructeur
 	public:
-	TextFieldEditor(QETElementEditor *, PartTextField *, QWidget * = 0);
+	TextFieldEditor(QETElementEditor *, PartTextField * = 0, QWidget * = 0);
 	virtual ~TextFieldEditor();
 	private:
 	TextFieldEditor(const TextFieldEditor &);
@@ -43,6 +43,10 @@
 	QCheckBox *rotate;
 	
 	// methodes
+	public:
+	virtual bool setPart(CustomElementPart *);
+	virtual CustomElementPart *currentPart() const;
+	
 	public slots:
 	void updateTextField();
 	void updateTextFieldX();


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/