summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/object_factory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/object_factory.cpp')
-rw-r--r--umbrello/umbrello/object_factory.cpp283
1 files changed, 283 insertions, 0 deletions
diff --git a/umbrello/umbrello/object_factory.cpp b/umbrello/umbrello/object_factory.cpp
new file mode 100644
index 00000000..f6fcbe41
--- /dev/null
+++ b/umbrello/umbrello/object_factory.cpp
@@ -0,0 +1,283 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * copyright (C) 2006-2007 *
+ * Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************/
+
+// own header
+#include "object_factory.h"
+
+// qt/kde includes
+#include <qregexp.h>
+#include <qstringlist.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kinputdialog.h>
+
+// app includes
+#include "umlobject.h"
+#include "umlpackagelist.h"
+#include "package.h"
+#include "folder.h"
+#include "classifier.h"
+#include "attribute.h"
+#include "operation.h"
+#include "enum.h"
+#include "entity.h"
+#include "actor.h"
+#include "usecase.h"
+#include "component.h"
+#include "node.h"
+#include "artifact.h"
+#include "stereotype.h"
+#include "association.h"
+#include "umldoc.h"
+#include "uml.h"
+#include "codegenerator.h"
+#include "model_utils.h"
+#include "uniqueid.h"
+
+namespace Object_Factory {
+
+Uml::IDType g_predefinedId = Uml::id_None;
+
+void assignUniqueIdOnCreation(bool yesno) {
+ if (yesno)
+ g_predefinedId = Uml::id_None;
+ else
+ g_predefinedId = Uml::id_Reserved;
+}
+
+bool assignUniqueIdOnCreation() {
+ return (g_predefinedId == Uml::id_None);
+}
+
+UMLObject* createNewUMLObject(Uml::Object_Type type, const QString &name,
+ UMLPackage *parentPkg) {
+ if (parentPkg == NULL) {
+ kError() << "Object_Factory::createNewUMLObject(" << name
+ << "): parentPkg is NULL" << endl;
+ return NULL;
+ }
+ UMLObject *o = NULL;
+ switch (type) {
+ case Uml::ot_Actor:
+ o = new UMLActor(name, g_predefinedId);
+ break;
+ case Uml::ot_UseCase:
+ o = new UMLUseCase(name, g_predefinedId);
+ break;
+ case Uml::ot_Class:
+ o = new UMLClassifier(name, g_predefinedId);
+ break;
+ case Uml::ot_Package:
+ o = new UMLPackage(name, g_predefinedId);
+ break;
+ case Uml::ot_Component:
+ o = new UMLComponent(name, g_predefinedId);
+ break;
+ case Uml::ot_Node:
+ o = new UMLNode(name, g_predefinedId);
+ break;
+ case Uml::ot_Artifact:
+ o = new UMLArtifact(name, g_predefinedId);
+ break;
+ case Uml::ot_Interface: {
+ UMLClassifier *c = new UMLClassifier(name, g_predefinedId);
+ c->setBaseType(Uml::ot_Interface);
+ o = c;
+ break;
+ }
+ case Uml::ot_Datatype: {
+ UMLClassifier *c = new UMLClassifier(name, g_predefinedId);
+ c->setBaseType(Uml::ot_Datatype);
+ o = c;
+ break;
+ }
+ case Uml::ot_Enum:
+ o = new UMLEnum(name, g_predefinedId);
+ break;
+ case Uml::ot_Entity:
+ o = new UMLEntity(name, g_predefinedId);
+ break;
+ case Uml::ot_Folder:
+ o = new UMLFolder(name, g_predefinedId);
+ break;
+ default:
+ kWarning() << "createNewUMLObject error unknown type: " << type << endl;
+ return NULL;
+ }
+ o->setUMLPackage(parentPkg);
+ UMLDoc *doc = UMLApp::app()->getDocument();
+ parentPkg->addObject(o);
+ doc->signalUMLObjectCreated(o);
+ kapp->processEvents();
+ return o;
+}
+
+UMLObject* createUMLObject(Uml::Object_Type type, const QString &n,
+ UMLPackage *parentPkg /* = NULL */,
+ bool solicitNewName /* = true */) {
+ UMLDoc *doc = UMLApp::app()->getDocument();
+ if (parentPkg == NULL) {
+ if (type == Uml::ot_Datatype) {
+ parentPkg = doc->getDatatypeFolder();
+ } else {
+ Uml::Model_Type mt = Model_Utils::convert_OT_MT(type);
+ kDebug() << "Object_Factory::createUMLObject(" << n << "): "
+ << "parentPkg is not set, assuming Model_Type " << mt << endl;
+ parentPkg = doc->getRootFolder(mt);
+ }
+ }
+ if (!n.isEmpty()) {
+ UMLObject *o = doc->findUMLObject(n, type, parentPkg);
+ if (o) {
+ if (!solicitNewName)
+ return o;
+ } else {
+ o = createNewUMLObject(type, n, parentPkg);
+ return o;
+ }
+ }
+ bool ok = false;
+ QString name = Model_Utils::uniqObjectName(type, parentPkg, n);
+ bool bValidNameEntered = false;
+ do {
+ name = KInputDialog::getText(i18n("Name"), i18n("Enter name:"), name, &ok, (QWidget*)UMLApp::app());
+ if (!ok) {
+ return 0;
+ }
+ if (name.length() == 0) {
+ KMessageBox::error(0, i18n("That is an invalid name."),
+ i18n("Invalid Name"));
+ continue;
+ }
+ CodeGenerator *codegen = UMLApp::app()->getGenerator();
+ if (codegen != NULL && codegen->isReservedKeyword(name)) {
+ KMessageBox::error(0, i18n("This is a reserved keyword for the language of the configured code generator."),
+ i18n("Reserved Keyword"));
+ continue;
+ }
+ if (! doc->isUnique(name, parentPkg)) {
+ KMessageBox::error(0, i18n("That name is already being used."),
+ i18n("Not a Unique Name"));
+ continue;
+ }
+ bValidNameEntered = true;
+ } while (bValidNameEntered == false);
+ UMLObject *o = createNewUMLObject(type, name, parentPkg);
+ return o;
+}
+
+UMLAttribute *createAttribute(UMLObject *parent, const QString& name, UMLObject *type) {
+ UMLAttribute *attr = new UMLAttribute(parent);
+ attr->setName(name);
+ attr->setType(type);
+ if (g_predefinedId == Uml::id_None)
+ attr->setID(UniqueID::gen());
+ return attr;
+}
+
+UMLOperation *createOperation(UMLClassifier *parent, const QString& name) {
+ UMLOperation *op = new UMLOperation(parent, name, g_predefinedId);
+ return op;
+}
+
+UMLClassifierListItem* createChildObject(UMLClassifier* parent, Uml::Object_Type type) {
+ UMLObject* returnObject = NULL;
+ switch (type) {
+ case Uml::ot_Attribute:
+ case Uml::ot_EntityAttribute: {
+ UMLClassifier *c = dynamic_cast<UMLClassifier*>(parent);
+ if (c && !c->isInterface())
+ returnObject = c->createAttribute();
+ break;
+ }
+ case Uml::ot_Operation: {
+ UMLClassifier *c = dynamic_cast<UMLClassifier*>(parent);
+ if (c)
+ returnObject = c->createOperation();
+ break;
+ }
+ case Uml::ot_Template: {
+ UMLClassifier *c = dynamic_cast<UMLClassifier*>(parent);
+ if (c)
+ returnObject = c->createTemplate();
+ break;
+ }
+ case Uml::ot_EnumLiteral: {
+ UMLEnum* umlenum = dynamic_cast<UMLEnum*>(parent);
+ if (umlenum) {
+ returnObject = umlenum->createEnumLiteral();
+ }
+ break;
+ }
+ default:
+ kDebug() << "ERROR UMLDoc::createChildObject type:" << type << endl;
+ }
+ return static_cast<UMLClassifierListItem*>(returnObject);
+}
+
+UMLObject* makeObjectFromXMI(const QString& xmiTag,
+ const QString& stereoID /* = QString::null */) {
+ UMLObject* pObject = 0;
+ if (Uml::tagEq(xmiTag, "UseCase")) {
+ pObject = new UMLUseCase();
+ } else if (Uml::tagEq(xmiTag, "Actor")) {
+ pObject = new UMLActor();
+ } else if (Uml::tagEq(xmiTag, "Class")) {
+ pObject = new UMLClassifier();
+ } else if (Uml::tagEq(xmiTag, "Package")) {
+ if (!stereoID.isEmpty()) {
+ UMLDoc *doc = UMLApp::app()->getDocument();
+ UMLObject *stereo = doc->findStereotypeById(STR2ID(stereoID));
+ if (stereo && stereo->getName() == "folder")
+ pObject = new UMLFolder();
+ }
+ if (pObject == NULL)
+ pObject = new UMLPackage();
+ } else if (Uml::tagEq(xmiTag, "Component")) {
+ pObject = new UMLComponent();
+ } else if (Uml::tagEq(xmiTag, "Node")) {
+ pObject = new UMLNode();
+ } else if (Uml::tagEq(xmiTag, "Artifact")) {
+ pObject = new UMLArtifact();
+ } else if (Uml::tagEq(xmiTag, "Interface")) {
+ UMLClassifier *c = new UMLClassifier();
+ c->setBaseType(Uml::ot_Interface);
+ pObject = c;
+ } else if (Uml::tagEq(xmiTag, "DataType") || Uml::tagEq(xmiTag, "Primitive")
+ || Uml::tagEq(xmiTag, "Datatype")) { // for bkwd compat.
+ UMLClassifier *c = new UMLClassifier();
+ c->setBaseType(Uml::ot_Datatype);
+ pObject = c;
+ } else if (Uml::tagEq(xmiTag, "Enumeration") ||
+ Uml::tagEq(xmiTag, "Enum")) { // for bkwd compat.
+ pObject = new UMLEnum();
+ } else if (Uml::tagEq(xmiTag, "Entity")) {
+ pObject = new UMLEntity();
+ } else if (Uml::tagEq(xmiTag, "Stereotype")) {
+ pObject = new UMLStereotype();
+ } else if (Uml::tagEq(xmiTag, "Association") ||
+ Uml::tagEq(xmiTag, "AssociationClass")) {
+ pObject = new UMLAssociation();
+ } else if (Uml::tagEq(xmiTag, "Generalization")) {
+ pObject = new UMLAssociation(Uml::at_Generalization);
+ } else if (Uml::tagEq(xmiTag, "Realization") ||
+ Uml::tagEq(xmiTag, "Abstraction")) {
+ pObject = new UMLAssociation(Uml::at_Realization);
+ } else if (Uml::tagEq(xmiTag, "Dependency")) {
+ pObject = new UMLAssociation(Uml::at_Dependency);
+ }
+ return pObject;
+}
+
+} // end namespace Object_Factory
+