umbrello API Documentation

codegenerationpolicy.cpp

00001 /***************************************************************************
00002  *                                                                         *
00003  *   This program is free software; you can redistribute it and/or modify  *
00004  *   it under the terms of the GNU General Public License as published by  *
00005  *   the Free Software Foundation; either version 2 of the License, or     *
00006  *   (at your option) any later version.                                   *
00007  *                                                                         *
00008  *   copyright (C) 2003-2006                                               *
00009  *   Umbrello UML Modeller Authors <uml-devel@uml.sf.net>                  *
00010  ***************************************************************************/
00011 
00012 /*  This code generated by:
00013  *      Author : thomas
00014  *      Date   : Fri Jun 20 2003
00015  */
00016 
00017 // own header
00018 #include "codegenerationpolicy.h"
00019 
00020 //system includes
00021 #include <cstdlib> //to get the user name
00022 
00023 // qt includes
00024 #include <qstringlist.h>
00025 #include <qregexp.h>
00026 #include <qtextstream.h>
00027 #include <qdatetime.h>
00028 
00029 // kde includes
00030 #include <kconfig.h>
00031 #include <kdeversion.h>
00032 #include <kdebug.h>
00033 #include <kstandarddirs.h>
00034 
00035 // app includes
00036 #include "uml.h"
00037 #include "umldoc.h"
00038 #include "dialogs/codegenerationpolicypage.h"
00039 
00040 using namespace std;
00041 
00042 #define MAXLINES 256
00043 
00044 CodeGenerationPolicy::OverwritePolicy CodeGenerationPolicy::defaultOverwritePolicy() const {
00045     return Ask;
00046 }
00047 
00048 bool CodeGenerationPolicy::defaultVerboseSectionComments() const {
00049     return true;
00050 }
00051 
00052 bool CodeGenerationPolicy::defaultVerboseDocumentComments() const {
00053     return true;
00054 }
00055 
00056 bool CodeGenerationPolicy::defaultIncludeHeadings() const {
00057     return true;
00058 }
00059 
00060 CodeGenerationPolicy::NewLineType CodeGenerationPolicy::defaultLineEndingType() const {
00061     return UNIX;
00062 }
00063 
00064 CodeGenerationPolicy::IndentationType CodeGenerationPolicy::defaultIndentType() const {
00065     return SPACE;
00066 }
00067 
00068 int CodeGenerationPolicy::defaultIndentAmount() const {
00069     return 2;
00070 }
00071 
00072 CodeGenerationPolicy::ModifyNamePolicy CodeGenerationPolicy::defaultModifyNamePolicy() const {
00073     return No;
00074 }
00075 
00076 CodeGenerationPolicy::CommentStyle CodeGenerationPolicy::defaultCommentStyle() const {
00077     return SingleLine;
00078 }
00079 
00080 CodeGenerationPolicy::ScopePolicy CodeGenerationPolicy::defaultAttribAccessorScope() const {
00081     return FromParent;
00082 }
00083 
00084 CodeGenerationPolicy::ScopePolicy CodeGenerationPolicy::defaultAssocFieldScope() const {
00085     return FromParent;
00086 }
00087 
00088 bool CodeGenerationPolicy::defaultAutoGenerateConstructors() const {
00089     return false;
00090 }
00091 
00092 
00093 // Constructors/Destructors
00094 //
00095 
00096 CodeGenerationPolicy::CodeGenerationPolicy(CodeGenerationPolicy * clone)
00097 {
00098 
00099     initFields();
00100     setDefaults(clone,false);
00101 }
00102 
00103 CodeGenerationPolicy::CodeGenerationPolicy(KConfig * config)
00104 {
00105     initFields();
00106     setDefaults(config,false);
00107 }
00108 
00109 CodeGenerationPolicy::~CodeGenerationPolicy ( ) { }
00110 
00111 //
00112 // Methods
00113 //
00114 
00115 
00116 // Accessor methods
00117 //
00118 
00119 
00120 // Public attribute accessor methods
00121 //
00122 
00129 void CodeGenerationPolicy::setOverwritePolicy ( OverwritePolicy new_var ) {
00130     m_overwritePolicy = new_var;
00131 }
00132 
00139 CodeGenerationPolicy::OverwritePolicy CodeGenerationPolicy::getOverwritePolicy ( ) const {
00140     return m_overwritePolicy;
00141 }
00142 
00147 void CodeGenerationPolicy::setCommentStyle ( CommentStyle new_var ) {
00148     m_commentStyle = new_var;
00149     emit modifiedCodeContent();
00150 }
00151 
00156 CodeGenerationPolicy::CommentStyle CodeGenerationPolicy::getCommentStyle ( ) {
00157     return m_commentStyle;
00158 }
00159 
00166 void CodeGenerationPolicy::setCodeVerboseSectionComments ( bool new_var ) {
00167     m_codeVerboseSectionComments = new_var;
00168     emit modifiedCodeContent();
00169 }
00170 
00177 bool CodeGenerationPolicy::getCodeVerboseSectionComments ( ) const {
00178     return m_codeVerboseSectionComments;
00179 }
00180 
00188 void CodeGenerationPolicy::setCodeVerboseDocumentComments ( bool new_var ) {
00189     m_codeVerboseDocumentComments = new_var;
00190     emit modifiedCodeContent();
00191 }
00192 
00200 bool CodeGenerationPolicy::getCodeVerboseDocumentComments ( ) const {
00201     return m_codeVerboseDocumentComments;
00202 }
00203 
00209 void CodeGenerationPolicy::setHeadingFileDir ( const QString & path) {
00210     m_headingFiles.setPath(path);
00211 }
00212 
00218 QString CodeGenerationPolicy::getHeadingFileDir ( ) const {
00219     return m_headingFiles.absPath();
00220 }
00221 
00226 void CodeGenerationPolicy::setIncludeHeadings ( bool new_var ) {
00227     m_includeHeadings = new_var;
00228     emit modifiedCodeContent();
00229 }
00230 
00235 bool CodeGenerationPolicy::getIncludeHeadings ( ) const {
00236     return m_includeHeadings;
00237 }
00238 
00244 void CodeGenerationPolicy::setOutputDirectory ( QDir new_var ) {
00245     m_outputDirectory = new_var;
00246 }
00247 
00253 QDir CodeGenerationPolicy::getOutputDirectory ( ) {
00254     return m_outputDirectory;
00255 }
00256 
00262 void CodeGenerationPolicy::setLineEndingType ( NewLineType type) {
00263     m_lineEndingType = type;
00264     switch (m_lineEndingType) {
00265     case MAC:
00266         m_lineEndingChars = QString("\r\n");
00267         break;
00268     case DOS:
00269         m_lineEndingChars = QString("\r");
00270         break;
00271     case UNIX:
00272     default:
00273         m_lineEndingChars = QString("\n");
00274         break;
00275     }
00276     emit modifiedCodeContent();
00277 }
00278 
00284 CodeGenerationPolicy::NewLineType CodeGenerationPolicy::getLineEndingType ( ) {
00285     return m_lineEndingType;
00286 }
00287 
00290 QString CodeGenerationPolicy::getNewLineEndingChars ( ) const {
00291     return m_lineEndingChars;
00292 }
00293 
00299 void CodeGenerationPolicy::setIndentationType ( IndentationType new_var ) {
00300     m_indentationType = new_var;
00301     calculateIndentation();
00302     emit modifiedCodeContent();
00303 }
00304 
00305 CodeGenerationPolicy::IndentationType CodeGenerationPolicy::getIndentationType ( ) {
00306     return m_indentationType;
00307 }
00308 
00309 void CodeGenerationPolicy::setIndentationAmount ( int amount ) {
00310     if(amount > -1)
00311     {
00312         m_indentationAmount = amount;
00313         calculateIndentation();
00314         emit modifiedCodeContent();
00315     }
00316 }
00317 
00318 int CodeGenerationPolicy::getIndentationAmount ( ) {
00319     return m_indentationAmount;
00320 }
00321 
00326 QString CodeGenerationPolicy::getIndentation ( ) const {
00327     return m_indentation;
00328 }
00329 
00330 void CodeGenerationPolicy::calculateIndentation ( ) {
00331     QString indent = "";
00332     m_indentation = "";
00333     switch (m_indentationType) {
00334     case NONE:
00335         break;
00336     case TAB:
00337         indent = QString("\t");
00338         break;
00339     default:
00340     case SPACE:
00341         indent = QString(" ");
00342         break;
00343     }
00344 
00345     for (int i=0; i < m_indentationAmount; i++)
00346         m_indentation += indent;
00347 }
00348 
00353 void CodeGenerationPolicy::setModifyPolicy ( ModifyNamePolicy new_var ) {
00354     m_modifyPolicy = new_var;
00355 }
00356 
00361 CodeGenerationPolicy::ModifyNamePolicy CodeGenerationPolicy::getModifyPolicy ( ) const {
00362     return m_modifyPolicy;
00363 }
00364 
00369 void CodeGenerationPolicy::setAutoGenerateConstructors( bool var ) {
00370     m_autoGenerateConstructors = var;
00371     emit modifiedCodeContent();
00372 }
00373 
00378 bool CodeGenerationPolicy::getAutoGenerateConstructors( ){
00379     return m_autoGenerateConstructors;
00380 }
00381 
00382 void CodeGenerationPolicy::setAttributeAccessorScope(CodeGenerationPolicy::ScopePolicy var) {
00383     m_attributeAccessorScope = var;
00384     emit modifiedCodeContent();
00385 }
00386 
00387 CodeGenerationPolicy::ScopePolicy CodeGenerationPolicy::getAttributeAccessorScope() {
00388     return m_attributeAccessorScope;
00389 }
00390 
00391 void CodeGenerationPolicy::setAssociationFieldScope(CodeGenerationPolicy::ScopePolicy var) {
00392     m_associationFieldScope = var;
00393     emit modifiedCodeContent();
00394 }
00395 
00396 CodeGenerationPolicy::ScopePolicy CodeGenerationPolicy::getAssociationFieldScope() {
00397     return m_associationFieldScope;
00398 }
00399 
00404 CodeGenerationPolicyPage * CodeGenerationPolicy::createPage ( QWidget *pWidget, const char *name ) {
00405     return new CodeGenerationPolicyPage ( pWidget, name, 0 );
00406 }
00407 
00408 // Other methods
00409 //
00410 
00411 void CodeGenerationPolicy::emitModifiedCodeContentSig() {
00412     if (!UMLApp::app()->getDocument()->loading())
00413         emit modifiedCodeContent();
00414 }
00415 
00416 void CodeGenerationPolicy::setDefaults ( CodeGenerationPolicy * clone , bool emitUpdateSignal)
00417 {
00418 
00419     if(!clone)
00420         return;
00421 
00422     blockSignals(true); // we need to do this because otherwise most of these
00423     // settors below will each send the modifiedCodeContent() signal
00424     // needlessly (we can just make one call at the end).
00425 
00426     setCodeVerboseSectionComments ( clone->getCodeVerboseSectionComments() );
00427     setCodeVerboseDocumentComments ( clone->getCodeVerboseDocumentComments() );
00428     setHeadingFileDir ( clone->getHeadingFileDir());
00429     setIncludeHeadings ( clone->getIncludeHeadings());
00430     setOutputDirectory ( clone->getOutputDirectory());
00431     setLineEndingType ( clone->getLineEndingType());
00432     setIndentationAmount ( clone->getIndentationAmount());
00433     setIndentationType ( clone->getIndentationType());
00434     setModifyPolicy ( clone->getModifyPolicy());
00435     setOverwritePolicy ( clone->getOverwritePolicy() );
00436 
00437     blockSignals(false); // "as you were citizen"
00438 
00439     if(emitUpdateSignal)
00440         emit modifiedCodeContent();
00441 
00442 }
00443 
00444 void CodeGenerationPolicy::setDefaults( KConfig * config, bool emitUpdateSignal)
00445 {
00446 
00447     if(!config)
00448         return;
00449 
00450     blockSignals(true); // we need to do this because otherwise most of these
00451     // settors below will each send the modifiedCodeContent() signal
00452     // needlessly (we can just make one call at the end).
00453 
00454     config -> setGroup("Code Generation");
00455     setAttributeAccessorScope((ScopePolicy)config->readNumEntry("defaultAttributeAccessorScope",defaultAttribAccessorScope()));
00456     setAssociationFieldScope((ScopePolicy)config->readNumEntry("defaultAssocFieldScope",defaultAssocFieldScope()));
00457     setCommentStyle((CommentStyle)config->readNumEntry("commentStyle",defaultCommentStyle()));
00458     setAutoGenerateConstructors(config->readBoolEntry("autoGenEmptyConstructors",defaultAutoGenerateConstructors()));
00459     setCodeVerboseDocumentComments( config->readBoolEntry("forceDoc",defaultVerboseDocumentComments()) );
00460     setCodeVerboseSectionComments( config->readBoolEntry("forceSections",defaultVerboseSectionComments()) );
00461     setLineEndingType( (NewLineType) config->readNumEntry("lineEndingType",defaultLineEndingType()) );
00462     setIndentationType( (IndentationType) config->readNumEntry("indentationType",defaultIndentType()) );
00463     setIndentationAmount( config->readNumEntry("indentationAmount",defaultIndentAmount()));
00464 
00465     QString path = config -> readPathEntry("outputDirectory");
00466     if(path.isEmpty())
00467         path = QDir::homeDirPath() + "/uml-generated-code/";
00468     setOutputDirectory ( QDir (path) );
00469 
00470     path = config -> readPathEntry("headingsDirectory");
00471     if(path.isEmpty()) {
00472         KStandardDirs stddirs;
00473         path =  stddirs.findDirs("data","umbrello/headings").first();
00474     }
00475     setHeadingFileDir ( path );
00476 
00477     setIncludeHeadings( config->readBoolEntry("includeHeadings",defaultIncludeHeadings()) );
00478     setOverwritePolicy( (OverwritePolicy)config->readNumEntry("overwritePolicy",defaultOverwritePolicy()));
00479     setModifyPolicy( (ModifyNamePolicy)config->readNumEntry("modnamePolicy",defaultModifyNamePolicy()));
00480 
00481     blockSignals(false); // "as you were citizen"
00482 
00483     if(emitUpdateSignal)
00484         emit modifiedCodeContent();
00485 
00486 }
00487 
00488 void CodeGenerationPolicy::writeConfig (KConfig * config) {
00489 
00490     config->setGroup("Code Generation");
00491 
00492     config->writeEntry("defaultAttributeAccessorScope",getAttributeAccessorScope());
00493     config->writeEntry("defaultAssocFieldScope",getAssociationFieldScope());
00494     config->writeEntry("commentStyle",getCommentStyle());
00495     config->writeEntry("autoGenEmptyConstructors",getAutoGenerateConstructors());
00496     //config->writeEntry("newCodegen", getNewCodegen());
00497     config->writeEntry("forceDoc",getCodeVerboseDocumentComments());
00498     config->writeEntry("forceSections",getCodeVerboseSectionComments());
00499 
00500     config->writeEntry("lineEndingType",getLineEndingType());
00501     config->writeEntry("indentationType",getIndentationType());
00502     config->writeEntry("indentationAmount",getIndentationAmount());
00503 
00504     config->writePathEntry("outputDirectory",getOutputDirectory().absPath());
00505     config->writePathEntry("headingsDirectory",getHeadingFileDir());
00506     config->writeEntry("includeHeadings",getIncludeHeadings());
00507     config->writeEntry("overwritePolicy",getOverwritePolicy());
00508     config->writeEntry("modnamePolicy",  getModifyPolicy());
00509 
00510 }
00511 
00512 // return the actual text
00513 QString CodeGenerationPolicy::getHeadingFile(QString str) {
00514 
00515     if(!getIncludeHeadings() || str.isEmpty())
00516         return QString("");
00517     if(str.contains(" ") ||str.contains(";")) {
00518         kWarning() << "File folder must not have spaces or semi colons!" << endl;
00519         return QString("");
00520     }
00521     //if we only get the extension, then we look for the default
00522     // heading.[extension]. If there is no such file, we try to
00523     // get any file with the same extension
00524     QString filename;
00525     if(str.startsWith(".")) {
00526         if(QFile::exists(m_headingFiles.absFilePath("heading"+str)))
00527             filename = m_headingFiles.absFilePath("heading"+str);
00528         else {
00529             str.prepend('*');
00530             m_headingFiles.setNameFilter(str);
00531             //if there is more than one match we just take the first one
00532             filename = m_headingFiles.absFilePath(m_headingFiles.entryList().first());
00533             // kWarning() << "header file name set to " << filename << " because it was *" << endl;
00534         }
00535     } else {   //we got a file name (not only extension)
00536         filename = m_headingFiles.absFilePath(str);
00537     }
00538 
00539     QFile f(filename);
00540     if(!f.open(IO_ReadOnly)) {
00541         //                kWarning() << "Error opening heading file: " << f.name() << endl;
00542         //                kWarning() << "Headings directory was " << m_headingFiles.absPath() << endl;
00543         return QString("");
00544     }
00545 
00546     QTextStream ts(&f);
00547     QString retstr = QString("");
00548     QString endLine = getNewLineEndingChars();
00549     for(int l = 0; l < MAXLINES && !ts.atEnd(); l++)
00550         retstr += ts.readLine()+endLine;
00551 
00552     //do variable substitution
00553     retstr.replace( QRegExp("%author%"),QString(getenv("USER")));  //get the user name from some where else
00554     retstr.replace( QRegExp("%headingpath%"),filename );
00555     retstr.replace( QRegExp("%time%"), QTime::currentTime().toString());
00556     retstr.replace( QRegExp("%date%"), QDate::currentDate().toString());
00557     // the replace filepath, time parts are also in the code document updateHeader method
00558     // (which is not a virtual function)...
00559 
00560     return retstr;
00561 }
00562 
00563 void CodeGenerationPolicy::initFields ( ) {
00564 
00565     blockSignals(true);
00566 
00567     m_overwritePolicy = defaultOverwritePolicy();
00568     m_codeVerboseSectionComments = defaultVerboseSectionComments();
00569     m_codeVerboseDocumentComments = defaultVerboseDocumentComments();
00570     m_includeHeadings = defaultIncludeHeadings();
00571     setLineEndingType(defaultLineEndingType());
00572     m_indentationType = defaultIndentType();
00573     m_indentationAmount = defaultIndentAmount();
00574     m_modifyPolicy = defaultModifyNamePolicy();
00575     m_autoGenerateConstructors = defaultAutoGenerateConstructors();
00576     m_attributeAccessorScope = defaultAttribAccessorScope();
00577     m_associationFieldScope = defaultAssocFieldScope();
00578     m_commentStyle = defaultCommentStyle();
00579 
00580     m_outputDirectory.setPath(QDir::home().absPath() + "/uml-generated-code/");
00581     m_headingFiles.setPath(QDir::home().absPath() + "/headings/");
00582 
00583     calculateIndentation();
00584 
00585     blockSignals(false);
00586 }
00587 
00588 #include "codegenerationpolicy.moc"
KDE Logo
This file is part of the documentation for umbrello Version 3.1.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Jun 26 08:07:55 2007 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003