diff options
Diffstat (limited to 'umbrello/umbrello/codegenerator.h')
-rw-r--r-- | umbrello/umbrello/codegenerator.h | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/umbrello/umbrello/codegenerator.h b/umbrello/umbrello/codegenerator.h new file mode 100644 index 00000000..0928dbba --- /dev/null +++ b/umbrello/umbrello/codegenerator.h @@ -0,0 +1,416 @@ +/*************************************************************************** + * * + * 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 <uml-devel@uml.sf.net> * + ***************************************************************************/ + +/* This code generated by: + * Author : thomas + * Date : Thu Jun 19 2003 + * Bugs and comments to uml-devel@lists.sf.net or http://bugs.kde.org + */ + + +#ifndef CODEGENERATOR_H +#define CODEGENERATOR_H + +#include <qdict.h> +#include <qdir.h> + +#include "codegenerators/codegenpolicyext.h" +#include "codegenerationpolicy.h" +#include "umlpackagelist.h" +#include "umlclassifierlist.h" +#include "codedocumentlist.h" +#include "codeviewerstate.h" +#include "umlnamespace.h" + +class UMLAttribute; +class UMLDoc; +class UMLObject; +class UMLRole; +class UMLOperation; + +class ClassifierCodeDocument; +class CodeAccessorMethod; +class CodeBlock; +class CodeBlockWithComments; +class CodeClassField; +class CodeClassFieldDeclarationBlock; +class CodeComment; +class CodeDocument; +class CodeOperation; +class CodeViewerDialog; + +class KConfig; + +/** + * class CodeGenerator + * This class collects together all of the code documents which form this project, + * and generates code for them in a given language. + */ + +/** + * CodeGenerator is the base class for all CodeGenerators. It + * provides the interface through which all Generators are invoked and + * the all the basic functionality. The only thing it doesn't do is to + * generate code =) + * + * If you want to implement a CodeGenerator for some language follow + * these steps: + * + * Create a class which inherits CodeGenerator. This class can have + * any name, I use names like CppCodeGenerator for the Cpp Generator, + * JavaCodeGenerator for the Java Generator and so on, but you can use what + * you want. + * + * The code you generate should be output to "outputDirectory" and you + * should respect the OverwritePolicy specified. You should call + * findFileName(..) to get an appropriate file name, and then you can + * call openFile if you want, but if you want to do it yourself you + * + * Finally put your generator in a library which can be dlopened + * together with a factory class (see below) and you are ready to go. + */ + + +class CodeGenerator : public QObject { + Q_OBJECT + +public: + + // Constructors/Destructors + // + + /** + * Constructors + */ + + /** + * Build a code generator. + * @return CodeGenerator + */ + CodeGenerator (); + + /** + * Build a code generator and then initialize it from an XMI element. + * @return CodeGenerator + * @param element an element from an XMI document + */ + CodeGenerator (QDomElement & element ); + + /** + * Empty Destructor + */ + virtual ~CodeGenerator ( ); + + // Public attribute accessor methods + // + + /** + * Add a CodeDocument object to the m_codedocumentVector List + * @return boolean - will return false if it couldnt add a document. + */ + bool addCodeDocument ( CodeDocument * add_object ); + + /** + * Replace (or possibly add a new) CodeDocument object to the m_codedocumentVector List. + * As names must be unique and each code document must have a name. + * @return boolean value which will be true if the passed document was able to replace some + * other document OR was added(no prior document existed..only when addIfPriorDocumentNotPresent is true). + * The document which was replaced will be deleted IF deleteReplacedDocument is true. + */ + // bool replaceCodeDocument ( CodeDocument * replace_doc=0, bool addIfPriorDocumentNotPresent=true, + // bool deleteReplacedDocument=true ); + + /** + * Remove a CodeDocument object from m_codedocumentVector List + * @return boolean - will return false if it couldnt remove a document. + */ + bool removeCodeDocument ( CodeDocument * remove_object ); + + /** + * Get the list of CodeDocument objects held by m_codedocumentVector + * @return CodeDocumentList list of CodeDocument objects held by + * m_codedocumentVector + */ + CodeDocumentList * getCodeDocumentList ( ); + + // get a unique id for this codedocument + QString getUniqueID ( CodeDocument * codeDoc ); + + /** + * Save the XMI representation of this object + */ + virtual void saveToXMI ( QDomDocument & doc, QDomElement & root ); + + /** + * Find a code document by the given id string. + * @return CodeDocument + */ + CodeDocument * findCodeDocumentByID (const QString &id ); + + /** + * Write out all code documents to file as appropriate. + */ + virtual void writeCodeToFile ( ); + + // this method is here to provide class wizard the + // ability to write out only those classes which + // are selected by the user. + virtual void writeCodeToFile(UMLClassifierList &list); + + // these are utility methods for accessing the default + // code gen policy object and *perhaps* should go away when we + // finally implement the CodeGenDialog class -b.t. + + void setModifyNamePolicy(CodeGenerationPolicy::ModifyNamePolicy p); + CodeGenerationPolicy::ModifyNamePolicy modifyNamePolicy()const; + + void setIncludeHeadings(bool i); + bool includeHeadings() const; + + void setHeadingFileDir(const QString &); + QString headingFileDir() const; + + void setForceDoc(bool f); + bool forceDoc() const; + + void setForceSections(bool f); + bool forceSections() const; + + + /** + * Gets the heading file (as a string) to be inserted at the + * beginning of the generated file. you give the file type as + * parameter and get the string. if fileName starts with a + * period (.) then fileName is the extension (.cpp, .h, + * .java) if fileName starts with another character you are + * requesting a specific file (mylicensefile.txt). The files + * can have parameters which are denoted by %parameter%. + * + * current parameters are + * %author% + * %date% + * %time% + * %filepath% + * + * @return QString + * @param file + */ + virtual QString getHeadingFile (const QString &file ); + + /** + * Finds an appropriate file name for the given CodeDocument, taking into + * account the Overwrite Policy and asking the user what to do if need be + * (if policy == Ask). + * + * @param doc the CodeDocument for which an output file name is desired. + * @return the file name that should be used. (with extension) or + * NULL if none to be used + */ + virtual QString findFileName(CodeDocument * doc); + + /** + * Replaces spaces with underscores and capitalises as defined in m_modname + * @return QString + * @param name + */ + static QString cleanName ( const QString &name ); + + /** Format documentation for output in source files + * + * @param text the documentation which has to be formatted + * @param linePrefix the prefix which has to be added in the beginnig of each line + * @param lineWidth the line width used for word-wrapping the documentation + * + * @return the formatted documentation text + */ + QString formatDoc (const QString & text, const QString & linePrefix = " *", int lineWidth = 80 ); + + /** + * Finds all classes in the current document to which objects of class c + * are in some way related. Possible relations are Associations (generalization, + * composition, etc) as well as parameters to methods and return values + * this is useful in deciding which classes/files to import/include in code generation + * @param c the class for which relations are to be found + * @param cList a reference to the list into which return the result + */ + static void findObjectsRelated(UMLClassifier *c, UMLPackageList &cList); + + // a series of accessor method constructors that we need to define + // for any particular language. + virtual CodeDocument * newClassifierCodeDocument (UMLClassifier * classifier ) = 0; + + /** + * @param element + */ + virtual void loadFromXMI (QDomElement & element ); + + /** + * Create a new Code document belonging to this package. + * @return CodeDocument pointer to new code document. + */ + virtual CodeDocument * newCodeDocument ( ); + + /** + * Return the unique language enum that identifies this type of code generator + */ + virtual Uml::Programming_Language getLanguage() = 0; + + /** + * Find a code document by the given classifier. + * @return CodeDocument + * @param classifier + */ + //FIX + // NOTE: this should be 'protected' or we could have problems with CPP code generator + CodeDocument * findCodeDocumentByClassifier (UMLClassifier * classifier ); + + /** + * Return the default datatypes for your language (bool, int etc) + * Default implementation returns empty list. + */ + virtual QStringList defaultDatatypes(); + + /** Get the editing dialog for this code document + */ + virtual CodeViewerDialog * getCodeViewerDialog( QWidget* parent, CodeDocument * doc, + Settings::CodeViewerState state); + + /** + * Check whether the given string is a reserved word for the + * language of this code generator + * + * @param rPossiblyReservedKeyword is the string to check + * + */ + virtual bool isReservedKeyword(const QString & rPossiblyReservedKeyword); + + /** + * get list of reserved keywords + */ + virtual const QStringList reservedKeywords() const; + + /** + * Create the default stereotypes for your language (constructor, int etc) + */ + virtual void createDefaultStereotypes (); + + /** + * Initialize this code generator from its parent UMLDoc. When this is called, + * it will (re-)generate the list of code documents for this project (generator) + * by checking for new objects/attributes which have been added or changed in the + * document. One or more CodeDocuments will be created/overwritten/amended as is + * appropriate for the given language. + */ + virtual void initFromParentDocument( ); + + /** + * Connect additional slots. + * Only required for Advanced Code Generators. + * To be called after constructing the code generator (see CodeGenFactory) + */ + void connect_newcodegen_slots(); + +protected: + + /** + * Remove (and possibly delete) all AutoGenerated content type CodeDocuments but leave + * the UserGenerated (and any other type) documents in this generator alone. + */ + // void removeAndDeleteAllAutoGeneratedCodeDocuments ( bool deleteRemovedDocs=true ); + + /** + * Returns a name that can be written to in the output directory, + * respecting the overwrite policy. + * If a file of the given name and extension does not exist, + * then just returns the name. + * If a file of the given name and extension does exist, + * then opens an overwrite dialog. In this case the name returned + * may be a modification of the input name. + * This method is invoked by findFileName(). + * + * @param name the proposed output file name + * @param extension the extension to use + * @return the real file name that should be used (including extension) or + * QString::null if none to be used + */ + QString overwritableName (const QString& name, const QString &extension ); + + /** Opens a file named "name" for writing in the outputDirectory. + * If something goes wrong, it informs the user + * if this function returns true, you know you can write to the file + * @return bool + * @param file + * @param name + */ + bool openFile (QFile& file, const QString &name); + + /** the actual internal routine which writes code documents + */ + void writeListedCodeDocsToFile(CodeDocumentList * docs); + + static const char * hierarchicalCodeBlockNodeName; + + // map of what code documents we currently have in this generator. + QDict<CodeDocument> m_codeDocumentDictionary; + + /** + * used by overwriteDialogue to know if the apply to all + * remaining files checkbox should be checked (is by default) + */ + bool m_applyToAllRemaining; + + /** + * The document object + */ + UMLDoc* m_document; + +private: + + /** + * Maps CodeDocuments to filenames. Used for finding out which file + * each class was written to. + */ + // this seems silly and overkill now. -b.t. + // QMap<CodeDocument*,QString> *m_fileMap; + + CodeDocumentList m_codedocumentVector; + int lastIDIndex; + + void initFields() ; + +public slots: + + /** These 2 functions check for adding or removing objects to the UMLDocument */ + virtual void checkAddUMLObject (UMLObject * obj); + virtual void checkRemoveUMLObject (UMLObject * obj); + + /** + * Force a synchronize of this code generator, and its present contents, to that of the parent UMLDocument. + * "UserGenerated" code will be preserved, but Autogenerated contents will be updated/replaced + * or removed as is apppropriate. + */ + virtual void syncCodeToDocument ( ); + +signals: + + /** + * This signal is emitted when code for a UMLClassifier has been + * generated. Its only really used by the codegenerationwizard to + * update its progress. + * @param concept The concept which was processed + * @param generated Flag, set to true if generation was successful + */ + void codeGenerated(UMLClassifier* concept, bool generated); + +}; + +#endif // CODEGENERATOR_H + |