diff options
author | Sandro S. Andrade <sandroandrade@kde.org> | 2013-01-09 03:15:33 -0300 |
---|---|---|
committer | Sandro S. Andrade <sandroandrade@kde.org> | 2013-01-09 07:18:03 +0100 |
commit | 63faf4d975c959754fe448e8d71678dbfcd42e1e (patch) | |
tree | 85eb664c1288d525ff0ab025f0865343f5d73434 /examples/uml | |
parent | 9c117059c1871ea9421607ed78070fa393161765 (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.pro | 2 | ||||
-rw-r--r-- | examples/uml/editor/mainwindow.cpp | 113 | ||||
-rw-r--r-- | examples/uml/editor/mainwindow.h | 11 | ||||
-rw-r--r-- | examples/uml/editor/wrappedobjectmodel.cpp | 5 | ||||
-rw-r--r-- | examples/uml/editor/wrappedobjectmodel.h | 1 | ||||
-rw-r--r-- | examples/uml/xmi-read/main.cpp | 11 | ||||
-rw-r--r-- | examples/uml/xmi-write/main.cpp | 61 |
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 |