summaryrefslogtreecommitdiffstats
path: root/examples/uml
diff options
context:
space:
mode:
authorSandro S. Andrade <sandroandrade@kde.org>2013-01-09 03:15:33 -0300
committerSandro S. Andrade <sandroandrade@kde.org>2013-01-09 07:18:03 +0100
commit63faf4d975c959754fe448e8d71678dbfcd42e1e (patch)
tree85eb664c1288d525ff0ab025f0865343f5d73434 /examples/uml
parent9c117059c1871ea9421607ed78070fa393161765 (diff)
Initial working implementation of XMI read/write in UML editor
Change-Id: I98abf6c5c8b3ac3fee78087a4b07fdf72ba35617 Reviewed-by: Sandro S. Andrade <sandroandrade@kde.org>
Diffstat (limited to 'examples/uml')
-rw-r--r--examples/uml/editor/editor.pro2
-rw-r--r--examples/uml/editor/mainwindow.cpp113
-rw-r--r--examples/uml/editor/mainwindow.h11
-rw-r--r--examples/uml/editor/wrappedobjectmodel.cpp5
-rw-r--r--examples/uml/editor/wrappedobjectmodel.h1
-rw-r--r--examples/uml/xmi-read/main.cpp11
-rw-r--r--examples/uml/xmi-write/main.cpp61
7 files changed, 96 insertions, 108 deletions
diff --git a/examples/uml/editor/editor.pro b/examples/uml/editor/editor.pro
index 0fceb57a..6df02c4a 100644
--- a/examples/uml/editor/editor.pro
+++ b/examples/uml/editor/editor.pro
@@ -4,7 +4,7 @@
#
#-------------------------------------------------
-QT = core gui uml mof
+QT = core gui mof
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
diff --git a/examples/uml/editor/mainwindow.cpp b/examples/uml/editor/mainwindow.cpp
index 5a76e48a..774f157c 100644
--- a/examples/uml/editor/mainwindow.cpp
+++ b/examples/uml/editor/mainwindow.cpp
@@ -21,23 +21,14 @@
#include <QtWrappedObjects/QMetaWrappedObject>
#include <QtMof/QXmiWriter>
-
-#include <QtUml/QModel>
-#include <QtUml/QGeneralization>
-#include <QtUml/QElementImport>
-#include <QtUml/QPrimitiveType>
-#include <QtUml/QEnumeration>
-#include <QtUml/QEnumerationLiteral>
-#include <QtUml/QClass>
-#include <QtUml/QProperty>
-#include <QtUml/QComment>
+#include <QtMof/QXmiReader>
+#include <QtMof/QtMofMetaModel>
#include "wrappedobjectmodel.h"
#include "propertyeditoritemdelegate.h"
#include "wrappedobjectpropertymodel.h"
#include "wrappedobjectpropertyfiltermodel.h"
-using namespace QtUml;
using namespace QtMof;
using namespace QtWrappedObjects;
@@ -64,6 +55,8 @@ MainWindow::MainWindow(QWidget *parent) :
PropertyEditorItemDelegate *delegate = new PropertyEditorItemDelegate(ui->propertyEditor);
ui->propertyEditor->setItemDelegateForColumn(1, delegate);
+ QtMofMetaModel::init();
+
_propertyModel = new WrappedObjectPropertyModel(this);
WrappedObjectPropertyFilterModel *proxyModel = new WrappedObjectPropertyFilterModel(this);
proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
@@ -78,78 +71,20 @@ MainWindow::MainWindow(QWidget *parent) :
});
ui->propertyEditor->setModel(proxyModel);
- WrappedObjectModel *wrappedObjectModel = new WrappedObjectModel(this);
- ui->modelInspector->setModel(wrappedObjectModel);
-
- _model = new QModel;
- _model->setName("MyModel");
-
- QWrappedObjectPointer<QPackage> package = new QPackage;
- package->setName("Package1");
-
- QWrappedObjectPointer<QPrimitiveType> primitiveType = new QPrimitiveType;
- primitiveType->setName("String");
-
- QWrappedObjectPointer<QEnumeration> enumeration = new QEnumeration;
- enumeration->setName("DirectionKind");
- QWrappedObjectPointer<QEnumerationLiteral> directionIn = new QEnumerationLiteral;
- directionIn->setName("DirectionIn");
- enumeration->addOwnedLiteral(directionIn);
-
- QWrappedObjectPointer<QClass> class_ = new QClass;
- class_->setName("Student");
- class_->setAbstract(false);
- class_->setVisibility(QtUml::QtUml::VisibilityPackage);
-
- QWrappedObjectPointer<QProperty> property = new QProperty;
- property->setName("name");
- property->setType(primitiveType);
- class_->addOwnedAttribute(property);
-
- QWrappedObjectPointer<QClass> class2_ = new QClass;
- class2_->setName("InterStudent");
-
- QWrappedObjectPointer<QGeneralization> generalization = new QGeneralization;
- generalization->setObjectName("generalization");
- generalization->setGeneral(class_);
- class2_->addGeneralization(generalization);
-
- _model2 = new QModel;
- _model2->setName("Model2");
- QWrappedObjectPointer<QClass> class3_ = new QClass;
- class3_->setName("Professor");
- _model2->addOwnedType(class3_);
-
- QWrappedObjectPointer<QElementImport> elementImport = new QElementImport;
- elementImport->setObjectName("ElementImport1");
- elementImport->setImportedElement(class3_);
-
- package->addOwnedType(enumeration);
- package->addOwnedType(class_);
- package->addOwnedType(class2_);
-
- _model->addNestedPackage(package);
- _model->addOwnedType(primitiveType);
- _model->addElementImport(elementImport);
-
- wrappedObjectModel->setWrappedObject(_model);
- ui->modelInspector->expandAll();
- ui->modelInspector->resizeColumnToContents(0);
- ui->modelInspector->resizeColumnToContents(1);
+ _wrappedObjectModel = new WrappedObjectModel(this);
+ ui->modelInspector->setModel(_wrappedObjectModel);
connect(ui->modelInspector->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MainWindow::modelInspectorSelectionChanged);
- ui->modelInspector->setCurrentIndex(wrappedObjectModel->index(0, 0));
+ ui->modelInspector->setCurrentIndex(_wrappedObjectModel->index(0, 0));
connect(_propertyModel, &WrappedObjectModel::dataChanged, [=](){
- wrappedObjectModel->updateIndex(ui->modelInspector->selectionModel()->selectedIndexes().first());
+ _wrappedObjectModel->updateIndex(ui->modelInspector->selectionModel()->selectedIndexes().first());
});
}
MainWindow::~MainWindow()
{
delete ui;
- delete _model.data();
- delete _model2.data();
}
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
@@ -212,6 +147,18 @@ void MainWindow::saveXmi(QWrappedObject *rootElement)
statusBar()->showMessage("XMI file successfully saved !", 3000);
}
+QWrappedObject *MainWindow::loadXmi()
+{
+ QFile file(_currentFileName);
+ if (!file.open(QFile::ReadOnly | QFile::Text)) {
+ QMessageBox::critical(this, tr("Open"), tr("Cannot read file !"));
+ return 0;
+ }
+
+ QXmiReader reader;
+ return reader.readFile(&file);
+}
+
void MainWindow::modelInspectorSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
Q_UNUSED(deselected);
@@ -240,7 +187,7 @@ void MainWindow::handleAddMethod()
QObject *addedElement = metaObject->newInstance();
if (addedElement) {
addedElement->setObjectName(QString("Unamed %1").arg(elementType.remove("*")));
- if (!metaMethod.invoke(element, Q_ARG(QObject *, addedElement)))
+ if (!metaMethod.invoke(element, ::Q_ARG(QObject *, addedElement)))
statusBar()->showMessage("Error when invoking metaMethod !", 6000);
else
statusBar()->showMessage("MetaMethod successfully executed !", 3000);
@@ -252,12 +199,26 @@ void MainWindow::handleAddMethod()
wrappedObjectModel->updateIndex(QModelIndex());
}
+void MainWindow::on_actionFileOpen_triggered()
+{
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Open"), QDir::currentPath(), "XMI files (*.xmi)");
+ if (!fileName.isEmpty()) {
+ _currentFileName = fileName;
+ delete _wrappedObjectModel->wrappedObject();
+ _wrappedObjectModel->setWrappedObject(loadXmi());
+ ui->modelInspector->expandAll();
+ ui->modelInspector->resizeColumnToContents(0);
+ ui->modelInspector->resizeColumnToContents(1);
+ ui->modelInspector->setCurrentIndex(_wrappedObjectModel->index(0, 0));
+ }
+}
+
void MainWindow::on_actionFileSaveAs_triggered()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), QDir::currentPath(), "XMI files (*.xmi)");
if (!fileName.isEmpty()) {
_currentFileName = fileName;
- saveXmi(_model);
+ saveXmi(_wrappedObjectModel->wrappedObject());
}
}
@@ -266,5 +227,5 @@ void MainWindow::on_actionFileSave_triggered()
if (_currentFileName.isEmpty())
on_actionFileSaveAs_triggered();
else
- saveXmi(_model);
+ saveXmi(_wrappedObjectModel->wrappedObject());
}
diff --git a/examples/uml/editor/mainwindow.h b/examples/uml/editor/mainwindow.h
index eb976b01..129ca2cb 100644
--- a/examples/uml/editor/mainwindow.h
+++ b/examples/uml/editor/mainwindow.h
@@ -17,14 +17,10 @@ namespace QtWrappedObjects {
using QtWrappedObjects::QWrappedObject;
using QtWrappedObjects::QWrappedObjectPointer;
-namespace QtUml {
- class QModel;
-}
-using QtUml::QModel;
-
class QTreeWidgetItem;
class QItemSelection;
class WrappedObjectPropertyModel;
+class WrappedObjectModel;
class MainWindow : public QMainWindow
{
@@ -41,6 +37,7 @@ private Q_SLOTS:
void modelInspectorSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void handleAddMethod();
+ void on_actionFileOpen_triggered();
void on_actionFileSaveAs_triggered();
void on_actionFileSave_triggered();
@@ -49,13 +46,13 @@ private:
QHash< QString, QPair<QObject *, QMetaMethod> > _visitedAddMethods;
QList<QWrappedObject *> _visitedObjects;
- QWrappedObjectPointer<QModel> _model;
- QWrappedObjectPointer<QModel> _model2;
WrappedObjectPropertyModel *_propertyModel;
+ WrappedObjectModel *_wrappedObjectModel;
QString _currentFileName;
void populateContextMenu(QMenu &menu, QtWrappedObjects::QWrappedObject *element);
void saveXmi(QWrappedObject *rootElement);
+ QWrappedObject *loadXmi();
};
#endif // MAINWINDOW_H
diff --git a/examples/uml/editor/wrappedobjectmodel.cpp b/examples/uml/editor/wrappedobjectmodel.cpp
index 57203708..60266ccd 100644
--- a/examples/uml/editor/wrappedobjectmodel.cpp
+++ b/examples/uml/editor/wrappedobjectmodel.cpp
@@ -21,6 +21,11 @@ void WrappedObjectModel::setWrappedObject(QWrappedObject *wrappedObject)
}
}
+QWrappedObject *WrappedObjectModel::wrappedObject() const
+{
+ return _wrappedObject;
+}
+
QModelIndex WrappedObjectModel::index(int row, int column, const QModelIndex &parent) const
{
if (!_wrappedObject || row < 0 || column < 0 || column >= 2 || (parent.isValid() && parent.column() != 0))
diff --git a/examples/uml/editor/wrappedobjectmodel.h b/examples/uml/editor/wrappedobjectmodel.h
index b3353b9d..96ea3180 100644
--- a/examples/uml/editor/wrappedobjectmodel.h
+++ b/examples/uml/editor/wrappedobjectmodel.h
@@ -16,6 +16,7 @@ public:
explicit WrappedObjectModel(QObject *parent = 0);
void setWrappedObject(QWrappedObject *wrappedObject);
+ QWrappedObject *wrappedObject() const;
virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
virtual QModelIndex parent(const QModelIndex &child) const;
diff --git a/examples/uml/xmi-read/main.cpp b/examples/uml/xmi-read/main.cpp
index b164ef85..b86772b9 100644
--- a/examples/uml/xmi-read/main.cpp
+++ b/examples/uml/xmi-read/main.cpp
@@ -2,6 +2,8 @@
#include <QtMof/QXmiReader>
using QtMof::QXmiReader;
+#include <QtMof/QXmiWriter>
+using QtMof::QXmiWriter;
#include <QtMof/QtMofMetaModel>
@@ -23,5 +25,14 @@ int main ()
QXmiReader reader;
QWrappedObject *rootElement = reader.readFile(&file);
qDebug() << "Successfully read object with name" << rootElement->objectName();
+
+ QFile file2("test-out.xmi");
+
+ if (!file2.open(QFile::WriteOnly | QFile::Text)) {
+ qDebug() << "Cannot write file !";
+ return 1;
+ }
+ QXmiWriter writer(rootElement);
+ writer.writeFile(&file2);
}
diff --git a/examples/uml/xmi-write/main.cpp b/examples/uml/xmi-write/main.cpp
index e9fac002..31e7d40a 100644
--- a/examples/uml/xmi-write/main.cpp
+++ b/examples/uml/xmi-write/main.cpp
@@ -1,42 +1,55 @@
-#include <QtWrappedObjects>
+#include <QtWrappedObjects/QtWrappedObjects>
-#include <QtUml/QPackage>
-#include <QtUml/QClass>
-#include <QtUml/QUseCase>
-#include <QtUml/QPort>
-#include <QtUml/QStereotype>
-#include <QtUml/QComment>
+#include <QtUml/QtUml>
#include <QtMof/QXmiWriter>
-using QtMof::QXmiWriter;
-using namespace QtUml;
using namespace QtWrappedObjects;
+using namespace QtUml;
+
+using QtMof::QXmiWriter;
int main ()
{
+ QWrappedObjectPointer<QPackage> model = new QPackage;
+ model->setName("MyRootPackage");
+
QWrappedObjectPointer<QPackage> package = new QPackage;
- package->setName("RootPackage");
+ package->setName("Package1");
+
+ QWrappedObjectPointer<QPrimitiveType> primitiveType = new QPrimitiveType;
+ primitiveType->setName("String");
+
+ QWrappedObjectPointer<QEnumeration> enumeration = new QEnumeration;
+ enumeration->setName("DirectionKind");
+ QWrappedObjectPointer<QEnumerationLiteral> directionIn = new QEnumerationLiteral;
+ directionIn->setName("DirectionIn");
+ enumeration->addOwnedLiteral(directionIn);
QWrappedObjectPointer<QClass> class_ = new QClass;
class_->setName("Student");
- package->addOwnedType(class_);
+ class_->setAbstract(false);
+ class_->setVisibility(QtUml::QtUml::VisibilityPackage);
- QWrappedObjectPointer<QUseCase> useCase = new QUseCase;
- useCase->setName("StudentUseCase1");
- class_->addOwnedUseCase(useCase);
+ QWrappedObjectPointer<QProperty> property = new QProperty;
+ property->setName("name");
+ property->setType(primitiveType);
+ class_->addOwnedAttribute(property);
- QWrappedObjectPointer<QPort> port = new QPort;
- port->setName("StudentPort");
- class_->addOwnedAttribute(port);
+ QWrappedObjectPointer<QClass> class2_ = new QClass;
+ class2_->setName("InterStudent");
- QWrappedObjectPointer<QStereotype> stereotype = new QStereotype;
- stereotype->setName("MyStereotype");
- package->addPackagedElement(stereotype);
+ QWrappedObjectPointer<QGeneralization> generalization = new QGeneralization;
+ generalization->setObjectName("generalization");
+ generalization->setGeneral(class_);
+ class2_->addGeneralization(generalization);
+
+ package->addOwnedType(enumeration);
+ package->addOwnedType(class_);
+ package->addOwnedType(class2_);
- QWrappedObjectPointer<QComment> comment = new QComment;
- comment->setBody("Testing comment");
- stereotype->addOwnedComment(comment);
+ model->addNestedPackage(package);
+ model->addOwnedType(primitiveType);
QFile file("test.xmi");
@@ -45,7 +58,7 @@ int main ()
return 1;
}
- QXmiWriter writer(package);
+ QXmiWriter writer(model);
if (writer.writeFile(&file))
qDebug() << "XMI file saved !";
else