[qet] [878] L'application active desormais l'editeur d' element adequat au lieu de permettre l'ouverture d' un meme element plusieurs fois en simultane.

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


Revision: 878
Author:   xavier
Date:     2010-03-04 22:04:23 +0100 (Thu, 04 Mar 2010)
Log Message:
-----------
L'application active desormais l'editeur d'element adequat au lieu de permettre l'ouverture d'un meme element plusieurs fois en simultane.

Modified Paths:
--------------
    trunk/sources/editor/qetelementeditor.cpp
    trunk/sources/editor/qetelementeditor.h
    trunk/sources/elementspanelwidget.cpp
    trunk/sources/qet.cpp
    trunk/sources/qet.h
    trunk/sources/qetapp.cpp
    trunk/sources/qetapp.h
    trunk/sources/qetdiagrameditor.cpp

Modified: trunk/sources/editor/qetelementeditor.cpp
===================================================================
--- trunk/sources/editor/qetelementeditor.cpp	2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/editor/qetelementeditor.cpp	2010-03-04 21:04:23 UTC (rev 878)
@@ -16,6 +16,7 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "qetelementeditor.h"
+#include "qet.h"
 #include "qetapp.h"
 #include "elementscene.h"
 #include "elementview.h"
@@ -838,6 +839,46 @@
 }
 
 /**
+	@param location Emplacement d'un element
+	@return true si cet editeur est en train d'editer l'element dont
+	l'emplacement est location, false sinon
+*/
+bool QETElementEditor::isEditing(const ElementsLocation &provided_location) {
+	if (opened_from_file) {
+		return(
+			QET::compareCanonicalFilePaths(
+				filename_,
+				QETApp::realPath(provided_location.toString())
+			)
+		);
+	} else {
+		return(provided_location == location_);
+	}
+}
+
+/**
+	@param provided_filepath Chemin d'un element sur un filesystem
+	@return true si cet editeur est en train d'editer l'element dont
+	le chemin est filepath, false sinon
+*/
+bool QETElementEditor::isEditing(const QString &provided_filepath) {
+	// determine le chemin canonique de l'element actuelle edite, si applicable
+	QString current_filepath;
+	if (opened_from_file) {
+		current_filepath = filename_;
+	} else {
+		current_filepath = QETApp::realPath(location_.toString());
+	}
+	
+	return(
+		QET::compareCanonicalFilePaths(
+			current_filepath,
+			provided_filepath
+		)
+	);
+}
+
+/**
 	specifie si l'editeur d'element doit etre en mode lecture seule
 	@param ro true pour activer le mode lecture seule, false pour le desactiver
 */
@@ -872,9 +913,7 @@
 	// demande le chemin virtuel de l'element a ouvrir a l'utilisateur
 	ElementsLocation location = ElementDialog::getOpenElementLocation(this);
 	if (location.isNull()) return;
-	QETElementEditor *cee = new QETElementEditor();
-	cee -> fromLocation(location);
-	cee -> show();
+	QETApp::instance() -> openElementLocations(QList<ElementsLocation>() << location);
 }
 
 /**
@@ -908,12 +947,11 @@
 	Cette methode ne controle pas si le fichier est deja ouvert
 	@param filepath Fichier a ouvrir
 	@see fromFile
+	@see QETApp::openElementFiles
 */
 void QETElementEditor::openElement(const QString &filepath) {
 	if (filepath.isEmpty()) return;
-	QETElementEditor *cee = new QETElementEditor();
-	cee -> fromFile(filepath);
-	cee -> show();
+	QETApp::instance() -> openElementFiles(QStringList() << filepath);
 }
 
 /**

Modified: trunk/sources/editor/qetelementeditor.h
===================================================================
--- trunk/sources/editor/qetelementeditor.h	2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/editor/qetelementeditor.h	2010-03-04 21:04:23 UTC (rev 878)
@@ -115,6 +115,8 @@
 	void fromLocation(const ElementsLocation &);
 	bool toFile(const QString &);
 	bool toLocation(const ElementsLocation &);
+	bool isEditing(const ElementsLocation &);
+	bool isEditing(const QString &);
 	ElementScene *elementScene() const;
 	void readSettings();
 	void writeSettings();

Modified: trunk/sources/elementspanelwidget.cpp
===================================================================
--- trunk/sources/elementspanelwidget.cpp	2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/elementspanelwidget.cpp	2010-03-04 21:04:23 UTC (rev 878)
@@ -255,9 +255,7 @@
 	
 	// Ouverture de l'element dans l'editeur pour pouvoir ensuite l'enregistrer dans la categorie voulue
 	if (!fileName.isEmpty()) {
-		QETElementEditor *editor = new QETElementEditor();
-		editor -> fromFile(fileName);
-		editor -> show();
+		QETApp::instance() -> openElementFiles(QStringList() << fileName);
 	}
 }
 
@@ -530,9 +528,7 @@
 	@param location Emplacement de l'element a editer
 */
 void ElementsPanelWidget::launchElementEditor(const ElementsLocation &location) {
-	QETElementEditor *editor = new QETElementEditor();
-	editor -> fromLocation(location);
-	editor -> show();
+	QETApp::instance() -> openElementLocations(QList<ElementsLocation>() << location);
 }
 
 /**

Modified: trunk/sources/qet.cpp
===================================================================
--- trunk/sources/qet.cpp	2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qet.cpp	2010-03-04 21:04:23 UTC (rev 878)
@@ -434,3 +434,25 @@
 		)
 	);
 }
+
+/**
+	@param first  Un premier chemin vers un fichier
+	@param second Un second chemin vers un fichier
+	@return true si les deux chemins existent existent et sont identiques
+	lorsqu'ils sont exprimes sous forme canonique
+*/
+bool QET::compareCanonicalFilePaths(const QString &first, const QString &second) {
+	QString first_canonical_path = QFileInfo(first).canonicalFilePath();
+	if (first_canonical_path.isEmpty()) return(false);
+
+	QString second_canonical_path = QFileInfo(second).canonicalFilePath();
+	if (second_canonical_path.isEmpty()) return(false);
+	
+#ifdef Q_WS_WIN
+	// sous Windows, on ramene les chemins en minuscules
+	first_canonical_path  = first_canonical_path.toLower();
+	second_canonical_path = second_canonical_path.toLower();
+#endif
+	
+	return(first_canonical_path == second_canonical_path);
+}

Modified: trunk/sources/qet.h
===================================================================
--- trunk/sources/qet.h	2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qet.h	2010-03-04 21:04:23 UTC (rev 878)
@@ -121,5 +121,6 @@
 	QString diagramAreaToString(const QET::DiagramArea &);
 	QET::DiagramArea diagramAreaFromString(const QString &);
 	QString pointerString(void *);
+	bool compareCanonicalFilePaths(const QString &, const QString &);
 }
 #endif

Modified: trunk/sources/qetapp.cpp
===================================================================
--- trunk/sources/qetapp.cpp	2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qetapp.cpp	2010-03-04 21:04:23 UTC (rev 878)
@@ -730,14 +730,72 @@
 void QETApp::openElementFiles(const QStringList &files_list) {
 	if (files_list.isEmpty()) return;
 	
-	// creation et affichage d'un ou plusieurs editeurs d'element
-	foreach(QString element_file, files_list) {
-		QETElementEditor *element_editor = new QETElementEditor();
-		element_editor -> fromFile(element_file);
+	// evite autant que possible les doublons dans la liste fournie
+	QSet<QString> files_set;
+	foreach(QString file, files_list) {
+		QString canonical_filepath = QFileInfo(file).canonicalFilePath();
+		if (!canonical_filepath.isEmpty()) files_set << canonical_filepath;
 	}
+	// a ce stade, tous les fichiers dans le Set existent et sont a priori differents
+	if (files_set.isEmpty()) return;
+	
+	// liste des editeurs d'element ouverts
+	QList<QETElementEditor *> element_editors = elementEditors();
+	
+	// on traite les fichiers a la queue leu leu...
+	foreach(QString element_file, files_set) {
+		bool already_opened_in_existing_element_editor = false;
+		foreach(QETElementEditor *element_editor, element_editors) {
+			if (element_editor -> isEditing(element_file)) {
+				// ce fichier est deja ouvert dans un editeur
+				already_opened_in_existing_element_editor = true;
+				element_editor -> setVisible(true);
+				element_editor -> raise();
+				element_editor -> activateWindow();
+				break;
+			}
+		}
+		if (!already_opened_in_existing_element_editor) {
+			// ce fichier n'est ouvert dans aucun editeur
+			QETElementEditor *element_editor = new QETElementEditor();
+			element_editor -> fromFile(element_file);
+		}
+	}
 }
 
 /**
+	Ouvre les elements dont l'emplacement est passe en parametre. Si un element
+	est deja ouvert, la fentre qui l'edite est activee.
+	@param locations_list Emplacements a ouvrir
+*/
+void QETApp::openElementLocations(const QList<ElementsLocation> &locations_list) {
+	if (locations_list.isEmpty()) return;
+	
+	// liste des editeurs d'element ouverts
+	QList<QETElementEditor *> element_editors = elementEditors();
+	
+	// on traite les emplacements  a la queue leu leu...
+	foreach(ElementsLocation element_location, locations_list) {
+		bool already_opened_in_existing_element_editor = false;
+		foreach(QETElementEditor *element_editor, element_editors) {
+			if (element_editor -> isEditing(element_location)) {
+				// cet emplacement est deja ouvert dans un editeur
+				already_opened_in_existing_element_editor = true;
+				element_editor -> setVisible(true);
+				element_editor -> raise();
+				element_editor -> activateWindow();
+				break;
+			}
+		}
+		if (!already_opened_in_existing_element_editor) {
+			// cet emplacement n'est ouvert dans aucun editeur
+			QETElementEditor *element_editor = new QETElementEditor();
+			element_editor -> fromLocation(element_location);
+		}
+	}
+}
+
+/**
 	Permet a l'utilisateur de configurer QET en lancant un dialogue approprie.
 	@see ConfigDialog
 */

Modified: trunk/sources/qetapp.h
===================================================================
--- trunk/sources/qetapp.h	2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qetapp.h	2010-03-04 21:04:23 UTC (rev 878)
@@ -159,6 +159,7 @@
 	void openFiles(const QETArguments &);
 	void openProjectFiles(const QStringList &);
 	void openElementFiles(const QStringList &);
+	void openElementLocations(const QList<ElementsLocation> &);
 	void configureQET();
 	void aboutQET();
 	

Modified: trunk/sources/qetdiagrameditor.cpp
===================================================================
--- trunk/sources/qetdiagrameditor.cpp	2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qetdiagrameditor.cpp	2010-03-04 21:04:23 UTC (rev 878)
@@ -1757,12 +1757,9 @@
 	@param location Emplacement de l'element a editer
 */
 void QETDiagramEditor::editElementInEditor(const ElementsLocation &location) {
-	QETElementEditor *editor = new QETElementEditor();
-	editor -> fromLocation(location);
-	editor -> show();
+	QETApp::instance() -> openElementLocations(QList<ElementsLocation>() << location);
 }
 
-
 /**
 	@return Les proprietes par defaut pour le cartouche d'un schema
 */


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