summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/classifier.h
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/classifier.h')
-rw-r--r--umbrello/umbrello/classifier.h496
1 files changed, 496 insertions, 0 deletions
diff --git a/umbrello/umbrello/classifier.h b/umbrello/umbrello/classifier.h
new file mode 100644
index 00000000..c599fe16
--- /dev/null
+++ b/umbrello/umbrello/classifier.h
@@ -0,0 +1,496 @@
+/***************************************************************************
+ * *
+ * 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) 2002-2007 *
+ * Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************/
+
+#ifndef CLASSIFIER__H
+#define CLASSIFIER__H
+
+#include "package.h"
+#include "umlattributelist.h"
+#include "umloperationlist.h"
+#include "umlclassifierlistitemlist.h"
+#include "classifierlistitem.h"
+#include "umltemplatelist.h"
+#include "model_utils.h"
+
+// forward declarations
+class UMLAssociation;
+class IDChangeLog;
+
+/**
+ * This class defines the non-graphical information required for a
+ * UML Classifier (ie a class or interface).
+ * This class inherits from @ref UMLPackage which allows classifiers
+ * to also act as namespaces, i.e. it allows classifiers to nest.
+ *
+ * @short Information for a non-graphical Concept/Class.
+ * @author Paul Hensgen <phensgen@techie.com>
+ * Bugs and comments to uml-devel@lists.sf.net or http://bugs.kde.org
+ */
+
+class UMLClassifier : public UMLPackage {
+ Q_OBJECT
+public:
+
+ /**
+ * Enumeration identifying the type of classifier.
+ */
+ enum ClassifierType { ALL = 0, CLASS, INTERFACE, DATATYPE };
+
+
+ /**
+ * Sets up a Concept.
+ *
+ * @param name The name of the Concept.
+ * @param id The unique id of the Concept.
+ */
+ explicit UMLClassifier(const QString & name = "", Uml::IDType id = Uml::id_None);
+
+ /**
+ * Standard deconstructor.
+ */
+ virtual ~UMLClassifier();
+
+ /**
+ * Overloaded '==' operator.
+ */
+ bool operator==( UMLClassifier & rhs );
+
+ /**
+ * Copy the internal presentation of this object into the new
+ * object.
+ */
+ virtual void copyInto(UMLClassifier *rhs) const;
+
+ /**
+ * Make a clone of this object.
+ */
+ UMLObject* clone() const;
+
+ /**
+ * Creates an attribute for the class.
+ *
+ * @param name An optional name, used by when creating through UMLListView
+ * @param type An optional type, used by when creating through UMLListView
+ * @param vis An optional visibility, used by when creating through UMLListView
+ * @param init An optional initial value, used by when creating through UMLListView
+ * @return The UMLAttribute created
+ */
+ virtual UMLAttribute* createAttribute(const QString &name = QString::null,
+ UMLObject *type = 0,
+ Uml::Visibility vis = Uml::Visibility::Private,
+ const QString &init = QString::null);
+
+ /**
+ * Adds an attribute to the class.
+ * If an attribute of the given name already exists, then
+ * returns the existing attribute instead of creating a new one.
+ *
+ * @param name The name of the attribute.
+ * @param id The id of the attribute (optional.)
+ * If not given, and the attribute name
+ * does not already exist, then the method
+ * will internally assign a new ID.
+ * @return Pointer to the UMLAttribute created or found.
+ */
+ UMLAttribute* addAttribute(const QString &name, Uml::IDType id = Uml::id_None);
+
+ UMLAttribute* addAttribute(const QString &name, UMLObject *type, Uml::Visibility scope);
+
+ /**
+ * Adds an already created attribute.
+ * The attribute object must not belong to any other concept.
+ *
+ * @param Att Pointer to the UMLAttribute.
+ * @param Log Pointer to the IDChangeLog (optional.)
+ * @param position Position index for the insertion (optional.)
+ * If the position is omitted, or if it is
+ * negative or too large, the attribute is added
+ * to the end of the list.
+ * @return True if the attribute was successfully added.
+ */
+ bool addAttribute(UMLAttribute* Att, IDChangeLog* Log = 0,
+ int position = -1);
+
+ /**
+ * Removes an attribute from the class.
+ *
+ * @param a The attribute to remove.
+ * @return Count of the remaining attributes after removal.
+ * Returns -1 if the given attribute was not found.
+ */
+ int removeAttribute(UMLAttribute *a);
+
+ /**
+ * Returns the number of attributes for the class.
+ *
+ * @return The number of attributes for the class.
+ */
+ int attributes() ;
+
+ /**
+ * Returns the attributes.
+ * Same as UMLClassifier::getFilteredList(ot_Attribute) but
+ * return type is a true UMLAttributeList.
+ *
+ * @return List of true attributes for the class.
+ */
+ UMLAttributeList getAttributeList() const;
+
+ /**
+ * Creates an operation in the current document.
+ * The new operation is initialized with name, id, etc.
+ * If a method with the given profile already exists in the classifier,
+ * no new method is created and the existing operation is returned.
+ * If no name is provided, or if the params are NULL, an Operation
+ * Dialog is shown to ask the user for a name and parameters.
+ * The operation's signature is checked for validity within the parent
+ * classifier.
+ *
+ * @param name The operation name (will be chosen internally if
+ * none given.)
+ * @param isExistingOp Optional pointer to bool. If supplied, the bool is
+ * set to true if an existing operation is returned.
+ * @param params Optional list of parameter names and types.
+ * If supplied, new operation parameters are
+ * constructed using this list.
+ * @return The new operation, or NULL if the operation could not be
+ * created because for example, the user canceled the dialog
+ * or no appropriate name can be found.
+ */
+ UMLOperation* createOperation( const QString &name = QString::null,
+ bool *isExistingOp = NULL,
+ Model_Utils::NameAndType_List *params = NULL);
+
+ /**
+ * Adds an operation to the classifier, at the given position.
+ * If position is negative or too large, the attribute is added
+ * to the end of the list.
+ * The Classifier first checks and only adds the Operation if the
+ * signature does not conflict with exising operations
+ *
+ * @param Op Pointer to the UMLOperation to add.
+ * @param position Index at which to insert into the list.
+ * @return true if the Operation could be added to the Classifier.
+ */
+ bool addOperation(UMLOperation* Op, int position = -1);
+
+ /**
+ * Appends an operation to the classifier.
+ * @see bool addOperation(UMLOperation* Op, int position = -1)
+ * This function is mainly intended for the clipboard.
+ *
+ * @param Op Pointer to the UMLOperation to add.
+ * @param Log Pointer to the IDChangeLog.
+ * @return True if the operation was added successfully.
+ */
+ bool addOperation(UMLOperation* Op, IDChangeLog* Log);
+
+ /**
+ * Checks whether an operation is valid based on its signature -
+ * An operation is "valid" if the operation's name and parameter list
+ * are unique in the classifier.
+ *
+ * @param name Name of the operation to check.
+ * @param opParams The operation's argument list.
+ * @param exemptOp Pointer to the exempt method (optional.)
+ * @return NULL if the signature is valid (ok), else return a pointer
+ * to the existing UMLOperation that causes the conflict.
+ */
+ UMLOperation * checkOperationSignature( const QString& name,
+ UMLAttributeList opParams,
+ UMLOperation *exemptOp = NULL);
+
+ /**
+ * Remove an operation from the Classifier.
+ * The operation is not deleted so the caller is responsible for what
+ * happens to it after this.
+ *
+ * @param op The operation to remove.
+ * @return Count of the remaining operations after removal, or
+ * -1 if the given operation was not found.
+ */
+ int removeOperation(UMLOperation *op);
+
+ /**
+ * counts the number of operations in the Classifier.
+ *
+ * @return The number of operations for the Classifier.
+ */
+ int operations() ;
+
+ /**
+ * Return a list of operations for the Classifier.
+ * @param includeInherited Includes operations from superclasses.
+ *
+ * @return The list of operations for the Classifier.
+ */
+ UMLOperationList getOpList(bool includeInherited = false);
+
+ /**
+ * Creates a template for the concept.
+ *
+ * @return The UMLTemplate created
+ */
+ UMLObject* createTemplate(const QString& name = QString::null);
+
+ /**
+ * Adds a template to the class if it is not there yet.
+ *
+ * @param name The name of the template.
+ * @param id The id of the template.
+ * @return Pointer to the UMLTemplate object created.
+ */
+ UMLTemplate* addTemplate(const QString &name, Uml::IDType id = Uml::id_None);
+
+ /**
+ * Adds an already created template.
+ * The template object must not belong to any other concept.
+ *
+ * @param newTemplate Pointer to the UMLTemplate object to add.
+ * @param log Pointer to the IDChangeLog.
+ * @return True if the template was successfully added.
+ */
+ bool addTemplate(UMLTemplate* newTemplate, IDChangeLog* log = 0);
+
+ /**
+ * Adds an template to the class.
+ * The template object must not belong to any other class.
+ *
+ * @param Template Pointer to the UMLTemplate to add.
+ * @param position The position of the template in the list.
+ * A value of -1 will add the template at the end.
+ * @return True if the template was successfully added.
+ */
+ //TODO: if the param IDChangeLog from the method above is not being used,
+ // give position a default value of -1 and the method can replace the above one
+ bool addTemplate(UMLTemplate* Template, int position);
+
+ /**
+ * Removes a template from the class.
+ *
+ * @param umltemplate The template to remove.
+ * @return Count of the remaining templates after removal.
+ * Returns -1 if the given template was not found.
+ */
+ int removeTemplate(UMLTemplate* umltemplate);
+
+ /**
+ * Seeks the template parameter of the given name.
+ */
+ UMLTemplate *findTemplate(const QString& name);
+
+ /**
+ * Returns the number of templates for the class.
+ *
+ * @return The number of templates for the class.
+ */
+ int templates();
+
+ /**
+ * Returns the templates.
+ * Same as UMLClassifier::getFilteredList(ot_Template) but
+ * return type is a true UMLTemplateList.
+ *
+ * @return Pointer to the list of true templates for the class.
+ */
+ UMLTemplateList getTemplateList() const;
+
+ /**
+ * Take and return a subordinate item from this classifier.
+ * Ownership of the item is passed to the caller.
+ *
+ * @param item Subordinate item to take.
+ * @return Index in m_List of the item taken.
+ * Return -1 if the item is not found in m_List.
+ */
+ int takeItem(UMLClassifierListItem* item);
+
+ /**
+ * Returns the entries in m_List that are of the requested type.
+ * If the requested type is Uml::ot_UMLObject then all entries
+ * are returned.
+ *
+ * @return The list of true operations for the Concept.
+ */
+ virtual UMLClassifierListItemList getFilteredList(Uml::Object_Type ot) const;
+
+ /**
+ * Needs to be called after all UML objects are loaded from file.
+ * Calls the parent resolveRef(), and calls resolveRef() on all
+ * UMLClassifierListItems.
+ * Overrides the method from UMLObject.
+ *
+ * @return true for success.
+ */
+ virtual bool resolveRef();
+
+ /**
+ * Find a list of operations with the given name.
+ *
+ * @param n The name of the operation to find.
+ * @return The list of objects found; will be empty if none found.
+ */
+ UMLOperationList findOperations(const QString &n);
+
+ /**
+ * Find an attribute, operation, association or template.
+ *
+ * @param id The id of the object to find.
+ *
+ * @return The object found. Will return 0 if none found.
+ */
+ virtual UMLObject* findChildObjectById(Uml::IDType id, bool considerAncestors = false);
+
+ /**
+ * Find an operation of the given name and parameter signature.
+ *
+ * @param name The name of the operation to find.
+ * @param params The parameter descriptors of the operation to find.
+ *
+ * @return The operation found. Will return 0 if none found.
+ */
+ UMLOperation* findOperation(const QString& name,
+ Model_Utils::NameAndType_List params);
+
+ /**
+ * Returns a list of concepts which this concept inherits from.
+ *
+ * @param type The ClassifierType to seek.
+ * @return List of UMLClassifiers we inherit from.
+ */
+ UMLClassifierList findSuperClassConcepts(ClassifierType type = ALL);
+
+ /**
+ * Returns a list of concepts which inherit from this concept.
+ *
+ * @param type The ClassifierType to seek.
+ * @return List of UMLClassifiers that inherit from us.
+ */
+ UMLClassifierList findSubClassConcepts(ClassifierType type = ALL);
+
+ /** reimplemented from UMLObject */
+ virtual bool acceptAssociationType(Uml::Association_Type);
+
+ /**
+ * Sets the UMLAssociation for which this class shall act as an
+ * association class.
+ */
+ void setClassAssoc(UMLAssociation *assoc);
+
+ /**
+ * Returns the UMLAssociation for which this class acts as an
+ * association class. Returns NULL if this class does not act
+ * as an association class.
+ */
+ UMLAssociation *getClassAssoc() const;
+
+ /**
+ * Reimplementation of method from class UMLObject for controlling the
+ * exact type of this classifier: class, interface, or datatype.
+ */
+ void setBaseType(Uml::Object_Type ot);
+
+ /**
+ * Returns true if this classifier represents an interface.
+ */
+ bool isInterface() const;
+
+ /**
+ * Returns true if this classifier represents a datatype.
+ */
+ bool isDatatype() const;
+
+ /**
+ * Set the origin type (in case of e.g. typedef)
+ */
+ void setOriginType(UMLClassifier *origType);
+
+ /**
+ * Get the origin type (in case of e.g. typedef)
+ */
+ UMLClassifier * originType() const;
+
+ /**
+ * Set the m_isRef flag (true when dealing with a pointer type)
+ */
+ void setIsReference(bool isRef = true);
+
+ /**
+ * Get the m_isRef flag.
+ */
+ bool isReference() const;
+
+ /**
+ * Return true if this classifier has abstract operations.
+ */
+ bool hasAbstractOps ();
+
+ /**
+ * Create a new ClassifierListObject (attribute, operation, template)
+ * according to the given XMI tag.
+ * Returns NULL if the string given does not contain one of the tags
+ * <UML:Attribute>, <UML:Operation>, or <UML:TemplateParameter>.
+ * Used by the clipboard for paste operation.
+ */
+ UMLClassifierListItem* makeChildObject(const QString& xmiTag);
+
+ /**
+ * Return the list of unidirectional association that should show up in the code
+ */
+ virtual UMLAssociationList getUniAssociationToBeImplemented();
+
+signals:
+ /** Signals that a new UMLOperation has been added to the classifer.
+ */
+ void operationAdded(UMLClassifierListItem *);
+
+ /** Signals that a UMLOperation has been removed from the classifer.
+ */
+ void operationRemoved(UMLClassifierListItem *);
+
+ void templateAdded(UMLClassifierListItem*);
+ void templateRemoved(UMLClassifierListItem*);
+
+ // only applies when (m_Type == ot_Class)
+ void attributeAdded(UMLClassifierListItem*);
+ void attributeRemoved(UMLClassifierListItem*);
+
+private:
+
+ /**
+ * Initializes key variables of the class.
+ */
+ void init();
+
+ UMLAssociation *m_pClassAssoc;
+
+ bool m_isRef;
+
+protected:
+
+ /**
+ * Auxiliary to saveToXMI of inheriting classes:
+ * Saves template parameters to the given QDomElement.
+ */
+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement);
+
+ /**
+ * Auxiliary to loadFromXMI:
+ * The loading of operations is implemented here.
+ * Calls loadSpecialized() for any other tag.
+ * Child classes can override the loadSpecialized method
+ * to load its additional tags.
+ */
+ virtual bool load(QDomElement& element);
+
+};
+
+#endif // CONCEPT_H