summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/enum.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/enum.cpp')
-rw-r--r--umbrello/umbrello/enum.cpp206
1 files changed, 206 insertions, 0 deletions
diff --git a/umbrello/umbrello/enum.cpp b/umbrello/umbrello/enum.cpp
new file mode 100644
index 00000000..ba3be7b4
--- /dev/null
+++ b/umbrello/umbrello/enum.cpp
@@ -0,0 +1,206 @@
+/***************************************************************************
+ * *
+ * 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) 2003-2007 *
+ * Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************/
+
+// own header
+#include "enum.h"
+// qt/kde includes
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+// app includes
+#include "enumliteral.h"
+#include "umldoc.h"
+#include "uml.h"
+#include "uniqueid.h"
+#include "clipboard/idchangelog.h"
+
+UMLEnum::UMLEnum(const QString& name, Uml::IDType id) : UMLClassifier(name, id) {
+ init();
+}
+
+UMLEnum::~UMLEnum() {
+ m_List.clear();
+}
+
+bool UMLEnum::operator==( UMLEnum & rhs ) {
+ return UMLClassifier::operator==(rhs);
+}
+
+void UMLEnum::copyInto(UMLEnum *rhs) const
+{
+ UMLClassifier::copyInto(rhs);
+}
+
+UMLObject* UMLEnum::clone() const
+{
+ UMLEnum *clone = new UMLEnum();
+ copyInto(clone);
+
+ return clone;
+}
+
+void UMLEnum::init() {
+ m_BaseType = Uml::ot_Enum;
+ setStereotype( "enum" );
+}
+
+UMLObject* UMLEnum::createEnumLiteral(const QString& name) {
+ Uml::IDType id = UniqueID::gen();
+ QString currentName;
+ if (name.isNull()) {
+ currentName = uniqChildName(Uml::ot_EnumLiteral);
+ } else {
+ currentName = name;
+ }
+
+ UMLEnumLiteral* newEnumLiteral = new UMLEnumLiteral(this, currentName);
+
+ bool ok = true;
+ bool goodName = false;
+
+ //check for name.isNull() stops dialog being shown
+ //when creating enum literal via list view
+ while (ok && !goodName && name.isNull()) {
+ ok = newEnumLiteral->showPropertiesDialog( UMLApp::app() );
+ QString name = newEnumLiteral->getName();
+
+ if(name.length() == 0) {
+ KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name"));
+ } else {
+ goodName = true;
+ }
+ }
+
+ if (!ok) {
+ delete newEnumLiteral;
+ return NULL;
+ }
+
+ addEnumLiteral(newEnumLiteral);
+
+ UMLDoc *umldoc = UMLApp::app()->getDocument();
+ umldoc->signalUMLObjectCreated(newEnumLiteral);
+ return newEnumLiteral;
+}
+
+UMLObject* UMLEnum::addEnumLiteral(const QString &name, Uml::IDType id) {
+ UMLObject *el = UMLCanvasObject::findChildObject(name);
+ if (el != NULL) {
+ kDebug() << "UMLEnum::addEnumLiteral: " << name
+ << " is already present" << endl;
+ return el;
+ }
+ UMLEnumLiteral* literal = new UMLEnumLiteral(this, name, id);
+ m_List.append(literal);
+ UMLObject::emitModified();
+ emit enumLiteralAdded(literal);
+ connect(literal,SIGNAL(modified()),this,SIGNAL(modified()));
+ return literal;
+}
+
+bool UMLEnum::addEnumLiteral(UMLEnumLiteral* literal, IDChangeLog* Log /* = 0*/) {
+ QString name = (QString)literal->getName();
+ if (findChildObject(name) == NULL) {
+ literal->parent()->removeChild(literal);
+ this->insertChild(literal);
+ m_List.append(literal);
+ UMLObject::emitModified();
+ emit enumLiteralAdded(literal);
+ connect(literal,SIGNAL(modified()),this,SIGNAL(modified()));
+ return true;
+ } else if (Log) {
+ Log->removeChangeByNewID( literal->getID() );
+ delete literal;
+ }
+ return false;
+}
+
+bool UMLEnum::addEnumLiteral(UMLEnumLiteral* literal, int position) {
+ QString name = (QString)literal->getName();
+ if (findChildObject(name) == NULL) {
+ literal->parent()->removeChild(literal);
+ this->insertChild(literal);
+ if ( position >= 0 && position <= (int)m_List.count() ) {
+ m_List.insert(position,literal);
+ } else {
+ m_List.append(literal);
+ }
+ UMLObject::emitModified();
+ emit enumLiteralAdded(literal);
+ connect(literal,SIGNAL(modified()),this,SIGNAL(modified()));
+ return true;
+ }
+ return false;
+}
+
+int UMLEnum::removeEnumLiteral(UMLEnumLiteral* literal) {
+ if (!m_List.remove(literal)) {
+ kDebug() << "can't find att given in list" << endl;
+ return -1;
+ }
+ emit enumLiteralRemoved(literal);
+ UMLObject::emitModified();
+ // If we are deleting the object, then we don't need to disconnect..this is done auto-magically
+ // for us by QObject. -b.t.
+ // disconnect(a,SIGNAL(modified()),this,SIGNAL(modified()));
+ delete literal;
+ return m_List.count();
+}
+
+int UMLEnum::enumLiterals() {
+ return m_List.count();
+}
+
+void UMLEnum::signalEnumLiteralRemoved(UMLClassifierListItem *elit) {
+ emit enumLiteralRemoved(elit);
+}
+
+void UMLEnum::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) {
+ QDomElement enumElement = UMLObject::save("UML:Enumeration", qDoc);
+ // save enum literals
+ UMLClassifierListItemList enumLiterals = getFilteredList(Uml::ot_EnumLiteral);
+ UMLClassifierListItem* pEnumLiteral = 0;
+ for (UMLClassifierListItemListIt it(enumLiterals);
+ (pEnumLiteral = it.current()) != NULL; ++it) {
+ pEnumLiteral->saveToXMI(qDoc, enumElement);
+ }
+ qElement.appendChild(enumElement);
+}
+
+bool UMLEnum::load(QDomElement& element) {
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ) {
+ if (node.isComment()) {
+ node = node.nextSibling();
+ continue;
+ }
+ QDomElement tempElement = node.toElement();
+ QString tag = tempElement.tagName();
+ if (Uml::tagEq(tag, "EnumerationLiteral") ||
+ Uml::tagEq(tag, "EnumLiteral")) { // for backward compatibility
+ UMLEnumLiteral* pEnumLiteral = new UMLEnumLiteral(this);
+ if( !pEnumLiteral->loadFromXMI(tempElement) ) {
+ return false;
+ }
+ m_List.append(pEnumLiteral);
+ } else if (tag == "stereotype") {
+ kDebug() << "UMLEnum::load(" << m_Name
+ << "): losing old-format stereotype." << endl;
+ } else {
+ kWarning() << "unknown child type in UMLEnum::load" << endl;
+ }
+ node = node.nextSibling();
+ }//end while
+ return true;
+}
+
+
+#include "enum.moc"