/*************************************************************************** * * * 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) 2004-2006 * * Umbrello UML Modeller Authors * ***************************************************************************/ // own header #include "model_utils.h" // qt/kde includes #include #include #include #include #include // app includes #include "umlobject.h" #include "umlpackagelist.h" #include "package.h" #include "folder.h" #include "classifier.h" #include "enum.h" #include "entity.h" #include "template.h" #include "operation.h" #include "attribute.h" #include "association.h" #include "umlrole.h" #include "umldoc.h" #include "uml.h" #include "codegenerator.h" namespace Model_Utils { bool isCloneable(Uml::Widget_Type type) { switch (type) { case Uml::wt_Actor: case Uml::wt_UseCase: case Uml::wt_Class: case Uml::wt_Interface: case Uml::wt_Enum: case Uml::wt_Datatype: case Uml::wt_Package: case Uml::wt_Component: case Uml::wt_Node: case Uml::wt_Artifact: return true; default: return false; } } UMLObject * findObjectInList(Uml::IDType id, const UMLObjectList& inList) { for (UMLObjectListIt oit(inList); oit.current(); ++oit) { UMLObject *obj = oit.current(); if (obj->getID() == id) return obj; UMLObject *o; Uml::Object_Type t = obj->getBaseType(); switch (t) { case Uml::ot_Folder: case Uml::ot_Package: case Uml::ot_Component: o = static_cast(obj)->findObjectById(id); if (o) return o; break; case Uml::ot_Interface: case Uml::ot_Class: case Uml::ot_Enum: case Uml::ot_Entity: o = static_cast(obj)->findChildObjectById(id); if (o == NULL && (t == Uml::ot_Interface || t == Uml::ot_Class)) o = ((UMLPackage*)obj)->findObjectById(id); if (o) return o; break; case Uml::ot_Association: { UMLAssociation *assoc = static_cast(obj); UMLRole *rA = assoc->getUMLRole(Uml::A); if (rA->getID() == id) return rA; UMLRole *rB = assoc->getUMLRole(Uml::B); if (rB->getID() == id) return rB; } break; default: break; } } return NULL; } UMLObject* findUMLObject(const UMLObjectList& inList, const TQString& inName, Uml::Object_Type type /* = ot_UMLObject */, UMLObject *currentObj /* = NULL */) { const bool caseSensitive = UMLApp::app()->activeLanguageIsCaseSensitive(); TQString name = inName; TQStringList components; #ifdef TRY_BUGFIX_120682 // If we have a pointer or a reference in cpp we need to remove // the asterisks and ampersands in order to find the appropriate object if (UMLApp::app()->getActiveLanguage() == Uml::pl_Cpp) { if (name.endsWith("*")) name.remove("*"); else if (name.contains("&")) name.remove("&"); } #endif TQString nameWithoutFirstPrefix; if (name.contains("::")) components = TQStringList::split("::", name); else if (name.contains(".")) components = TQStringList::split(".", name); if (components.size() > 1) { name = components.front(); components.pop_front(); nameWithoutFirstPrefix = components.join("::"); } if (currentObj) { UMLPackage *pkg = NULL; if (dynamic_cast(currentObj)) { currentObj = static_cast(currentObj->parent()); } pkg = dynamic_cast(currentObj); if (pkg == NULL) pkg = currentObj->getUMLPackage(); // Remember packages that we've seen - for avoiding cycles. UMLPackageList seenPkgs; for (; pkg; pkg = currentObj->getUMLPackage()) { if (nameWithoutFirstPrefix.isEmpty()) { if (caseSensitive) { if (pkg->getName() == name) return pkg; } else if (pkg->getName().lower() == name.lower()) { return pkg; } } if (seenPkgs.findRef(pkg) != -1) { kError() << "findUMLObject(" << name << "): " << "breaking out of cycle involving " << pkg->getName() << endl; break; } seenPkgs.append(pkg); UMLObjectList objectsInCurrentScope = pkg->containedObjects(); for (UMLObjectListIt oit(objectsInCurrentScope); oit.current(); ++oit) { UMLObject *obj = oit.current(); if (caseSensitive) { if (obj->getName() != name) continue; } else if (obj->getName().lower() != name.lower()) { continue; } Uml::Object_Type foundType = obj->getBaseType(); if (nameWithoutFirstPrefix.isEmpty()) { if (type != Uml::ot_UMLObject && type != foundType) { kDebug() << "findUMLObject: type mismatch for " << name << " (seeking type: " << type << ", found type: " << foundType << ")" << endl; // Class, Interface, and Datatype are all Classifiers // and are considered equivalent. // The caller must be prepared to handle possible mismatches. if ((type == Uml::ot_Class || type == Uml::ot_Interface || type == Uml::ot_Datatype) && (foundType == Uml::ot_Class || foundType == Uml::ot_Interface || foundType == Uml::ot_Datatype)) { return obj; } continue; } return obj; } if (foundType != Uml::ot_Package && foundType != Uml::ot_Folder && foundType != Uml::ot_Class && foundType != Uml::ot_Interface && foundType != Uml::ot_Component) { kDebug() << "findUMLObject: found \"" << name << "\" is not a package (?)" << endl; continue; } UMLPackage *pkg = static_cast(obj); return findUMLObject( pkg->containedObjects(), nameWithoutFirstPrefix, type ); } currentObj = pkg; } } for (UMLObjectListIt oit(inList); oit.current(); ++oit) { UMLObject *obj = oit.current(); if (caseSensitive) { if (obj->getName() != name) continue; } else if (obj->getName().lower() != name.lower()) { continue; } Uml::Object_Type foundType = obj->getBaseType(); if (nameWithoutFirstPrefix.isEmpty()) { if (type != Uml::ot_UMLObject && type != foundType) { kDebug() << "findUMLObject: type mismatch for " << name << " (seeking type: " << type << ", found type: " << foundType << ")" << endl; continue; } return obj; } if (foundType != Uml::ot_Package && foundType != Uml::ot_Folder && foundType != Uml::ot_Class && foundType != Uml::ot_Interface && foundType != Uml::ot_Component) { kDebug() << "findUMLObject: found \"" << name << "\" is not a package (?)" << endl; continue; } UMLPackage *pkg = static_cast(obj); return findUMLObject( pkg->containedObjects(), nameWithoutFirstPrefix, type ); } return NULL; } TQString uniqObjectName(Uml::Object_Type type, UMLPackage *parentPkg, TQString prefix) { TQString currentName = prefix; if (currentName.isEmpty()) { if(type == Uml::ot_Class) currentName = i18n("new_class"); else if(type == Uml::ot_Actor) currentName = i18n("new_actor"); else if(type == Uml::ot_UseCase) currentName = i18n("new_usecase"); else if(type == Uml::ot_Package) currentName = i18n("new_package"); else if(type == Uml::ot_Component) currentName = i18n("new_component"); else if(type == Uml::ot_Node) currentName = i18n("new_node"); else if(type == Uml::ot_Artifact) currentName = i18n("new_artifact"); else if(type == Uml::ot_Interface) currentName = i18n("new_interface"); else if(type == Uml::ot_Datatype) currentName = i18n("new_datatype"); else if(type == Uml::ot_Enum) currentName = i18n("new_enum"); else if(type == Uml::ot_Entity) currentName = i18n("new_entity"); else if(type == Uml::ot_Folder) currentName = i18n("new_folder"); else if(type == Uml::ot_Association) currentName = i18n("new_association"); else { currentName = i18n("new_object"); kWarning() << "unknown object type in umldoc::uniqObjectName()" << endl; } } UMLDoc *doc = UMLApp::app()->getDocument(); TQString name = currentName; for (int number = 1; !doc->isUnique(name, parentPkg); number++) { name = currentName + '_' + TQString::number(number); } return name; } bool isCommonXMIAttribute( const TQString &tag ) { bool retval = (Uml::tagEq(tag, "name") || Uml::tagEq(tag, "visibility") || Uml::tagEq(tag, "isRoot") || Uml::tagEq(tag, "isLeaf") || Uml::tagEq(tag, "isAbstract") || Uml::tagEq(tag, "isSpecification") || Uml::tagEq(tag, "isActive") || Uml::tagEq(tag, "namespace") || Uml::tagEq(tag, "ownerScope") || Uml::tagEq(tag, "ModelElement.stereotype") || Uml::tagEq(tag, "GeneralizableElement.generalization") || Uml::tagEq(tag, "specialization") || //NYI Uml::tagEq(tag, "clientDependency") || //NYI Uml::tagEq(tag, "supplierDependency") //NYI ); return retval; } bool isCommonDataType(TQString type) { CodeGenerator *gen = UMLApp::app()->getGenerator(); if (gen == NULL) return false; const bool caseSensitive = UMLApp::app()->activeLanguageIsCaseSensitive(); TQStringList dataTypes = gen->defaultDatatypes(); TQStringList::Iterator end(dataTypes.end()); for (TQStringList::Iterator it = dataTypes.begin(); it != end; ++it) { if (caseSensitive) { if (type == *it) return true; } else if (type.lower() == (*it).lower()) { return true; } } return false; } bool isClassifierListitem(Uml::Object_Type type) { if (type == Uml::ot_Attribute || type == Uml::ot_Operation || type == Uml::ot_Template || type == Uml::ot_EntityAttribute || type == Uml::ot_EnumLiteral) { return true; } else { return false; } } Uml::Model_Type guessContainer(UMLObject *o) { Uml::Object_Type ot = o->getBaseType(); if (ot == Uml::ot_Package && o->getStereotype() == "subsystem") return Uml::mt_Component; Uml::Model_Type mt = Uml::N_MODELTYPES; switch (ot) { case Uml::ot_Package: // CHECK: packages may appear in other views? case Uml::ot_Interface: case Uml::ot_Datatype: case Uml::ot_Enum: case Uml::ot_Class: case Uml::ot_Attribute: case Uml::ot_Operation: case Uml::ot_EnumLiteral: case Uml::ot_Template: mt = Uml::mt_Logical; break; case Uml::ot_Actor: case Uml::ot_UseCase: mt = Uml::mt_UseCase; break; case Uml::ot_Component: case Uml::ot_Artifact: // trouble: artifact can also appear at Deployment mt = Uml::mt_Component; break; case Uml::ot_Node: mt = Uml::mt_Deployment; break; case Uml::ot_Entity: case Uml::ot_EntityAttribute: mt = Uml::mt_EntityRelationship; break; case Uml::ot_Association: { UMLAssociation *assoc = static_cast(o); UMLDoc *umldoc = UMLApp::app()->getDocument(); for (int r = Uml::A; r <= Uml::B; r++) { UMLObject *roleObj = assoc->getObject((Uml::Role_Type)r); if (roleObj == NULL) { // Ouch! we have been called while types are not yet resolved return Uml::N_MODELTYPES; } UMLPackage *pkg = roleObj->getUMLPackage(); if (pkg) { while (pkg->getUMLPackage()) { // wind back to root pkg = pkg->getUMLPackage(); } const Uml::Model_Type m = umldoc->rootFolderType(pkg); if (m != Uml::N_MODELTYPES) return m; } mt = guessContainer(roleObj); if (mt != Uml::mt_Logical) break; } } break; default: break; } return mt; } int stringToDirection(TQString input, Uml::Parameter_Direction & result) { TQRegExp dirx("^(in|out|inout)"); int pos = dirx.search(input); if (pos == -1) return 0; const TQString& dirStr = dirx.capturedTexts().first(); uint dirLen = dirStr.length(); if (input.length() > dirLen && !input[dirLen].isSpace()) return 0; // no match after all. if (dirStr == "out") result = Uml::pd_Out; else if (dirStr == "inout") result = Uml::pd_InOut; else result = Uml::pd_In; return dirLen; } Parse_Status parseTemplate(TQString t, NameAndType& nmTp, UMLClassifier *owningScope) { UMLDoc *pDoc = UMLApp::app()->getDocument(); t = t.stripWhiteSpace(); if (t.isEmpty()) return PS_Empty; TQStringList nameAndType = TQStringList::split( TQRegExp("\\s*:\\s*"), t); if (nameAndType.count() == 2) { UMLObject *pType = NULL; if (nameAndType[1] != "class") { pType = pDoc->findUMLObject(nameAndType[1], Uml::ot_UMLObject, owningScope); if (pType == NULL) return PS_Unknown_ArgType; } nmTp = NameAndType(nameAndType[0], pType); } else { nmTp = NameAndType(t, NULL); } return PS_OK; } Parse_Status parseAttribute(TQString a, NameAndType& nmTp, UMLClassifier *owningScope, Uml::Visibility *vis /* = 0 */) { UMLDoc *pDoc = UMLApp::app()->getDocument(); a = a.simplifyWhiteSpace(); if (a.isEmpty()) return PS_Empty; int colonPos = a.find(':'); if (colonPos < 0) { nmTp = NameAndType(a, NULL); return PS_OK; } TQString name = a.left(colonPos).stripWhiteSpace(); if (vis) { TQRegExp mnemonicVis("^([\\+\\#\\-\\~] *)"); int pos = mnemonicVis.search(name); if (pos == -1) { *vis = Uml::Visibility::Private; // default value } else { TQString caption = mnemonicVis.cap(1); TQString strVis = caption.left(1); if (strVis == "+") *vis = Uml::Visibility::Public; else if (strVis == "#") *vis = Uml::Visibility::Protected; else if (strVis == "-") *vis = Uml::Visibility::Private; else *vis = Uml::Visibility::Implementation; } name.remove(mnemonicVis); } Uml::Parameter_Direction pd = Uml::pd_In; if (name.startsWith("in ")) { pd = Uml::pd_In; name = name.mid(3); } else if (name.startsWith("inout ")) { pd = Uml::pd_InOut; name = name.mid(6); } else if (name.startsWith("out ")) { pd = Uml::pd_Out; name = name.mid(4); } a = a.mid(colonPos + 1).stripWhiteSpace(); if (a.isEmpty()) { nmTp = NameAndType(name, NULL, pd); return PS_OK; } TQStringList typeAndInitialValue = TQStringList::split( TQRegExp("\\s*=\\s*"), a ); const TQString &type = typeAndInitialValue[0]; UMLObject *pType = pDoc->findUMLObject(type, Uml::ot_UMLObject, owningScope); if (pType == NULL) { nmTp = NameAndType(name, NULL, pd); return PS_Unknown_ArgType; } TQString initialValue; if (typeAndInitialValue.count() == 2) { initialValue = typeAndInitialValue[1]; } nmTp = NameAndType(name, pType, pd, initialValue); return PS_OK; } Parse_Status parseOperation(TQString m, OpDescriptor& desc, UMLClassifier *owningScope) { UMLDoc *pDoc = UMLApp::app()->getDocument(); m = m.simplifyWhiteSpace(); if (m.isEmpty()) return PS_Empty; if (m.contains(TQRegExp("operator *()"))) { // C++ special case: two sets of parentheses desc.m_name = "operator()"; m.remove(TQRegExp("operator *()")); } else { /** * The search pattern includes everything up to the opening parenthesis * because UML also permits non programming-language oriented designs * using narrative names, for example "check water temperature". */ TQRegExp beginningUpToOpenParenth( "^([^\\(]+)" ); int pos = beginningUpToOpenParenth.search(m); if (pos == -1) return PS_Illegal_MethodName; desc.m_name = beginningUpToOpenParenth.cap(1); } desc.m_pReturnType = NULL; TQRegExp pat = TQRegExp("\\) *:(.*)$"); int pos = pat.search(m); if (pos != -1) { // return type is optional TQString retType = pat.cap(1); retType = retType.stripWhiteSpace(); if (retType != "void") { UMLObject *pRetType = owningScope->findTemplate(retType); if (pRetType == NULL) { pRetType = pDoc->findUMLObject(retType, Uml::ot_UMLObject, owningScope); if (pRetType == NULL) return PS_Unknown_ReturnType; } desc.m_pReturnType = pRetType; } } // Remove possible empty parentheses () m.remove( TQRegExp("\\s*\\(\\s*\\)") ); desc.m_args.clear(); pat = TQRegExp( "\\((.*)\\)" ); pos = pat.search(m); if (pos == -1) // argument list is optional return PS_OK; TQString arglist = pat.cap(1); arglist = arglist.stripWhiteSpace(); if (arglist.isEmpty()) return PS_OK; TQStringList args = TQStringList::split( TQRegExp("\\s*,\\s*"), arglist); for (TQStringList::Iterator lit = args.begin(); lit != args.end(); ++lit) { NameAndType nmTp; Parse_Status ps = parseAttribute(*lit, nmTp, owningScope); if (ps) return ps; desc.m_args.append(nmTp); } return PS_OK; } TQString psText(Parse_Status value) { const TQString text[] = { i18n("OK"), i18n("Empty"), i18n("Malformed argument"), i18n("Unknown argument type"), i18n("Illegal method name"), i18n("Unknown return type"), i18n("Unspecified error") }; return text[(unsigned) value]; } TQString progLangToString(Uml::Programming_Language pl) { switch (pl) { case Uml::pl_ActionScript: return "ActionScript"; case Uml::pl_Ada: return "Ada"; case Uml::pl_Cpp: return "C++"; case Uml::pl_CSharp: return "C#"; case Uml::pl_D: return "D"; case Uml::pl_IDL: return "IDL"; case Uml::pl_Java: return "Java"; case Uml::pl_JavaScript: return "JavaScript"; case Uml::pl_Pascal: return "Pascal"; case Uml::pl_Perl: return "Perl"; case Uml::pl_PHP: return "PHP"; case Uml::pl_PHP5: return "PHP5"; case Uml::pl_Python: return "Python"; case Uml::pl_Ruby: return "Ruby"; case Uml::pl_SQL: return "SQL"; case Uml::pl_Tcl: return "Tcl"; case Uml::pl_XMLSchema: return "XMLSchema"; default: break; } return TQString(); } Uml::Programming_Language stringToProgLang(TQString str) { if (str == "ActionScript") return Uml::pl_ActionScript; if (str == "Ada") return Uml::pl_Ada; if (str == "C++" || str == "Cpp") // "Cpp" only for bkwd compatibility return Uml::pl_Cpp; if (str == "C#") return Uml::pl_CSharp; if (str == "D") return Uml::pl_D; if (str == "IDL") return Uml::pl_IDL; if (str == "Java") return Uml::pl_Java; if (str == "JavaScript") return Uml::pl_JavaScript; if (str == "Pascal") return Uml::pl_Pascal; if (str == "Perl") return Uml::pl_Perl; if (str == "PHP") return Uml::pl_PHP; if (str == "PHP5") return Uml::pl_PHP5; if (str == "Python") return Uml::pl_Python; if (str == "Ruby") return Uml::pl_Ruby; if (str == "SQL") return Uml::pl_SQL; if (str == "Tcl") return Uml::pl_Tcl; if (str == "XMLSchema") return Uml::pl_XMLSchema; return Uml::pl_Reserved; } bool typeIsRootView(Uml::ListView_Type type) { switch (type) { case Uml::lvt_View: case Uml::lvt_Logical_View: case Uml::lvt_UseCase_View: case Uml::lvt_Component_View: case Uml::lvt_Deployment_View: case Uml::lvt_EntityRelationship_Model: return true; break; default: break; } return false; } bool typeIsCanvasWidget(Uml::ListView_Type type) { switch (type) { case Uml::lvt_Actor: case Uml::lvt_UseCase: case Uml::lvt_Class: case Uml::lvt_Package: case Uml::lvt_Logical_Folder: case Uml::lvt_UseCase_Folder: case Uml::lvt_Component_Folder: case Uml::lvt_Deployment_Folder: case Uml::lvt_EntityRelationship_Folder: case Uml::lvt_Subsystem: case Uml::lvt_Component: case Uml::lvt_Node: case Uml::lvt_Artifact: case Uml::lvt_Interface: case Uml::lvt_Datatype: case Uml::lvt_Enum: case Uml::lvt_Entity: return true; break; default: break; } return false; } bool typeIsFolder(Uml::ListView_Type type) { if (typeIsRootView(type) || type == Uml::lvt_Datatype_Folder || type == Uml::lvt_Logical_Folder || type == Uml::lvt_UseCase_Folder || type == Uml::lvt_Component_Folder || type == Uml::lvt_Deployment_Folder || type == Uml::lvt_EntityRelationship_Folder) { return true; } else { return false; } } bool typeIsContainer(Uml::ListView_Type type) { if (typeIsFolder(type)) return true; return (type == Uml::lvt_Package || type == Uml::lvt_Subsystem || type == Uml::lvt_Component); } bool typeIsClassifierList(Uml::ListView_Type type) { if (type == Uml::lvt_Attribute || type == Uml::lvt_Operation || type == Uml::lvt_Template || type == Uml::lvt_EntityAttribute || type == Uml::lvt_EnumLiteral) { return true; } else { return false; } } bool typeIsDiagram(Uml::ListView_Type type) { if (type == Uml::lvt_Class_Diagram || type == Uml::lvt_Collaboration_Diagram || type == Uml::lvt_State_Diagram || type == Uml::lvt_Activity_Diagram || type == Uml::lvt_Sequence_Diagram || type == Uml::lvt_UseCase_Diagram || type == Uml::lvt_Component_Diagram || type == Uml::lvt_Deployment_Diagram || type == Uml::lvt_EntityRelationship_Diagram) { return true; } else { return false; } } Uml::Model_Type convert_DT_MT(Uml::Diagram_Type dt) { Uml::Model_Type mt; switch (dt) { case Uml::dt_UseCase: mt = Uml::mt_UseCase; break; case Uml::dt_Collaboration: case Uml::dt_Class: case Uml::dt_Sequence: case Uml::dt_State: case Uml::dt_Activity: mt = Uml::mt_Logical; break; case Uml::dt_Component: mt = Uml::mt_Component; break; case Uml::dt_Deployment: mt = Uml::mt_Deployment; break; case Uml::dt_EntityRelationship: mt = Uml::mt_EntityRelationship; break; default: kError() << "Model_Utils::convert_DT_MT: illegal input value " << dt << endl; mt = Uml::N_MODELTYPES; break; } return mt; } Uml::ListView_Type convert_MT_LVT(Uml::Model_Type mt) { Uml::ListView_Type lvt = Uml::lvt_Unknown; switch (mt) { case Uml::mt_Logical: lvt = Uml::lvt_Logical_View; break; case Uml::mt_UseCase: lvt = Uml::lvt_UseCase_View; break; case Uml::mt_Component: lvt = Uml::lvt_Component_View; break; case Uml::mt_Deployment: lvt = Uml::lvt_Deployment_View; break; case Uml::mt_EntityRelationship: lvt = Uml::lvt_EntityRelationship_Model; break; default: break; } return lvt; } Uml::Model_Type convert_LVT_MT(Uml::ListView_Type lvt) { Uml::Model_Type mt = Uml::N_MODELTYPES; switch (lvt) { case Uml::lvt_Logical_View: mt = Uml::mt_Logical; break; case Uml::lvt_UseCase_View: mt = Uml::mt_UseCase; break; case Uml::lvt_Component_View: mt = Uml::mt_Component; break; case Uml::lvt_Deployment_View: mt = Uml::mt_Deployment; break; case Uml::lvt_EntityRelationship_Model: mt = Uml::mt_EntityRelationship; break; default: break; } return mt; } Uml::ListView_Type convert_DT_LVT(Uml::Diagram_Type dt) { Uml::ListView_Type type = Uml::lvt_Unknown; switch(dt) { case Uml::dt_UseCase: type = Uml::lvt_UseCase_Diagram; break; case Uml::dt_Class: type = Uml::lvt_Class_Diagram; break; case Uml::dt_Sequence: type = Uml::lvt_Sequence_Diagram; break; case Uml::dt_Collaboration: type = Uml::lvt_Collaboration_Diagram; break; case Uml::dt_State: type = Uml::lvt_State_Diagram; break; case Uml::dt_Activity: type = Uml::lvt_Activity_Diagram; break; case Uml::dt_Component: type = Uml::lvt_Component_Diagram; break; case Uml::dt_Deployment: type = Uml::lvt_Deployment_Diagram; break; case Uml::dt_EntityRelationship: type = Uml::lvt_EntityRelationship_Diagram; break; default: kWarning() << "convert_DT_LVT() called on unknown diagram type" << endl; } return type; } Uml::ListView_Type convert_OT_LVT(UMLObject *o) { Uml::Object_Type ot = o->getBaseType(); Uml::ListView_Type type = Uml::lvt_Unknown; switch(ot) { case Uml::ot_UseCase: type = Uml::lvt_UseCase; break; case Uml::ot_Actor: type = Uml::lvt_Actor; break; case Uml::ot_Class: type = Uml::lvt_Class; break; case Uml::ot_Package: type = Uml::lvt_Package; break; case Uml::ot_Folder: { UMLDoc *umldoc = UMLApp::app()->getDocument(); UMLFolder *f = static_cast(o); do { const Uml::Model_Type mt = umldoc->rootFolderType(f); if (mt != Uml::N_MODELTYPES) { switch (mt) { case Uml::mt_Logical: type = Uml::lvt_Logical_Folder; break; case Uml::mt_UseCase: type = Uml::lvt_UseCase_Folder; break; case Uml::mt_Component: type = Uml::lvt_Component_Folder; break; case Uml::mt_Deployment: type = Uml::lvt_Deployment_Folder; break; case Uml::mt_EntityRelationship: type = Uml::lvt_EntityRelationship_Folder; break; default: break; } return type; } } while ((f = static_cast(f->getUMLPackage())) != NULL); kError() << "convert_OT_LVT(" << o->getName() << "): internal error - object is not properly nested in folder" << endl; } break; case Uml::ot_Component: type = Uml::lvt_Component; break; case Uml::ot_Node: type = Uml::lvt_Node; break; case Uml::ot_Artifact: type = Uml::lvt_Artifact; break; case Uml::ot_Interface: type = Uml::lvt_Interface; break; case Uml::ot_Datatype: type = Uml::lvt_Datatype; break; case Uml::ot_Enum: type = Uml::lvt_Enum; break; case Uml::ot_EnumLiteral: type = Uml::lvt_EnumLiteral; break; case Uml::ot_Entity: type = Uml::lvt_Entity; break; case Uml::ot_EntityAttribute: type = Uml::lvt_EntityAttribute; break; case Uml::ot_Attribute: type = Uml::lvt_Attribute; break; case Uml::ot_Operation: type = Uml::lvt_Operation; break; case Uml::ot_Template: type = Uml::lvt_Template; break; default: break; } return type; } Uml::Object_Type convert_LVT_OT(Uml::ListView_Type lvt) { Uml::Object_Type ot = (Uml::Object_Type)0; switch (lvt) { case Uml::lvt_UseCase: ot = Uml::ot_UseCase; break; case Uml::lvt_Actor: ot = Uml::ot_Actor; break; case Uml::lvt_Class: ot = Uml::ot_Class; break; case Uml::lvt_Package: case Uml::lvt_Subsystem: ot = Uml::ot_Package; break; case Uml::lvt_Component: ot = Uml::ot_Component; break; case Uml::lvt_Node: ot = Uml::ot_Node; break; case Uml::lvt_Artifact: ot = Uml::ot_Artifact; break; case Uml::lvt_Interface: ot = Uml::ot_Interface; break; case Uml::lvt_Datatype: ot = Uml::ot_Datatype; break; case Uml::lvt_Enum: ot = Uml::ot_Enum; break; case Uml::lvt_Entity: ot = Uml::ot_Entity; break; case Uml::lvt_EntityAttribute: ot = Uml::ot_EntityAttribute; break; case Uml::lvt_Attribute: ot = Uml::ot_Attribute; break; case Uml::lvt_Operation: ot = Uml::ot_Operation; break; case Uml::lvt_Template: ot = Uml::ot_Template; break; case Uml::lvt_EnumLiteral: ot = Uml::ot_EnumLiteral; break; default: if (typeIsFolder(lvt)) ot = Uml::ot_Folder; break; } return ot; } Uml::Icon_Type convert_LVT_IT(Uml::ListView_Type lvt) { Uml::Icon_Type icon = Uml::it_Home; switch (lvt) { case Uml::lvt_UseCase_View: case Uml::lvt_UseCase_Folder: icon = Uml::it_Folder_Grey; break; case Uml::lvt_Logical_View: case Uml::lvt_Logical_Folder: icon = Uml::it_Folder_Green; break; case Uml::lvt_Datatype_Folder: icon = Uml::it_Folder_Orange; break; case Uml::lvt_Component_View: case Uml::lvt_Component_Folder: icon = Uml::it_Folder_Red; break; case Uml::lvt_Deployment_View: case Uml::lvt_Deployment_Folder: icon = Uml::it_Folder_Violet; break; case Uml::lvt_EntityRelationship_Model: case Uml::lvt_EntityRelationship_Folder: icon = Uml::it_Folder_Cyan; break; case Uml::lvt_Actor: icon = Uml::it_Actor; break; case Uml::lvt_UseCase: icon = Uml::it_UseCase; break; case Uml::lvt_Class: icon = Uml::it_Class; break; case Uml::lvt_Package: icon = Uml::it_Package; break; case Uml::lvt_Subsystem: icon = Uml::it_Subsystem; break; case Uml::lvt_Component: icon = Uml::it_Component; break; case Uml::lvt_Node: icon = Uml::it_Node; break; case Uml::lvt_Artifact: icon = Uml::it_Artifact; break; case Uml::lvt_Interface: icon = Uml::it_Interface; break; case Uml::lvt_Datatype: icon = Uml::it_Datatype; break; case Uml::lvt_Enum: icon = Uml::it_Enum; break; case Uml::lvt_Entity: icon = Uml::it_Entity; break; case Uml::lvt_Template: icon = Uml::it_Template; break; case Uml::lvt_Attribute: icon = Uml::it_Private_Attribute; break; case Uml::lvt_EntityAttribute: icon = Uml::it_Private_Attribute; break; case Uml::lvt_EnumLiteral: icon = Uml::it_Public_Attribute; break; case Uml::lvt_Operation: icon = Uml::it_Public_Method; break; case Uml::lvt_Class_Diagram: icon = Uml::it_Diagram_Class; break; case Uml::lvt_UseCase_Diagram: icon = Uml::it_Diagram_Usecase; break; case Uml::lvt_Sequence_Diagram: icon = Uml::it_Diagram_Sequence; break; case Uml::lvt_Collaboration_Diagram: icon = Uml::it_Diagram_Collaboration; break; case Uml::lvt_State_Diagram: icon = Uml::it_Diagram_State; break; case Uml::lvt_Activity_Diagram: icon = Uml::it_Diagram_Activity; break; case Uml::lvt_Component_Diagram: icon = Uml::it_Diagram_Component; break; case Uml::lvt_Deployment_Diagram: icon = Uml::it_Diagram_Deployment; break; case Uml::lvt_EntityRelationship_Diagram: icon = Uml::it_Diagram_EntityRelationship; break; default: break; } return icon; } Uml::Diagram_Type convert_LVT_DT(Uml::ListView_Type lvt) { Uml::Diagram_Type dt = Uml::dt_Undefined; switch (lvt) { case Uml::lvt_Class_Diagram: dt = Uml::dt_Class; break; case Uml::lvt_UseCase_Diagram: dt = Uml::dt_UseCase; break; case Uml::lvt_Sequence_Diagram: dt = Uml::dt_Sequence; break; case Uml::lvt_Collaboration_Diagram: dt = Uml::dt_Collaboration; break; case Uml::lvt_State_Diagram: dt = Uml::dt_State; break; case Uml::lvt_Activity_Diagram: dt = Uml::dt_Activity; break; case Uml::lvt_Component_Diagram: dt = Uml::dt_Component; break; case Uml::lvt_Deployment_Diagram: dt = Uml::dt_Deployment; break; case Uml::lvt_EntityRelationship_Diagram: dt = Uml::dt_EntityRelationship; break; default: break; } return dt; } Uml::Model_Type convert_OT_MT(Uml::Object_Type ot) { Uml::Model_Type mt = Uml::N_MODELTYPES; switch (ot) { case Uml::ot_Actor: case Uml::ot_UseCase: mt = Uml::mt_UseCase; break; case Uml::ot_Component: case Uml::ot_Artifact: mt = Uml::mt_Component; break; case Uml::ot_Node: mt = Uml::mt_Deployment; break; case Uml::ot_Entity: case Uml::ot_EntityAttribute: mt = Uml::mt_EntityRelationship; break; default: mt = Uml::mt_Logical; break; } return mt; } } // namespace Model_Utils