codegenerationpolicy.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "codegenerationpolicy.h"
00019
00020
00021 #include <cstdlib>
00022
00023
00024 #include <qstringlist.h>
00025 #include <qregexp.h>
00026 #include <qtextstream.h>
00027 #include <qdatetime.h>
00028
00029
00030 #include <kconfig.h>
00031 #include <kdeversion.h>
00032 #include <kdebug.h>
00033 #include <kstandarddirs.h>
00034
00035
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
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
00113
00114
00115
00116
00117
00118
00119
00120
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
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);
00423
00424
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);
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);
00451
00452
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);
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
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
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
00522
00523
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
00532 filename = m_headingFiles.absFilePath(m_headingFiles.entryList().first());
00533
00534 }
00535 } else {
00536 filename = m_headingFiles.absFilePath(str);
00537 }
00538
00539 QFile f(filename);
00540 if(!f.open(IO_ReadOnly)) {
00541
00542
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
00553 retstr.replace( QRegExp("%author%"),QString(getenv("USER")));
00554 retstr.replace( QRegExp("%headingpath%"),filename );
00555 retstr.replace( QRegExp("%time%"), QTime::currentTime().toString());
00556 retstr.replace( QRegExp("%date%"), QDate::currentDate().toString());
00557
00558
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"
This file is part of the documentation for umbrello Version 3.1.0.