/** * Call this method to generate Pascal code for a UMLClassifier. * @param c the class to generate code for */ void PascalWriter::writeClass(UMLClassifier *c) { if (!c) { uDebug() << "Cannot write class of NULL concept!"; return; } const bool isClass = !c->isInterface(); QString classname = cleanName(c->name()); QString fileName = qualifiedName(c).toLower(); fileName.replace(QLatin1Char('.'), QLatin1Char('-')); //find an appropriate name for our file fileName = overwritableName(c, fileName, QLatin1String(".pas")); if (fileName.isEmpty()) { emit codeGenerated(c, false); return; } QFile file; if (!openFile(file, fileName)) { emit codeGenerated(c, false); return; } // Start generating the code. QTextStream pas(&file); //try to find a heading file(license, comments, etc) QString str; str = getHeadingFile(QLatin1String(".pas")); if (!str.isEmpty()) { str.replace(QRegExp(QLatin1String("%filename%")), fileName); str.replace(QRegExp(QLatin1String("%filepath%")), file.fileName()); pas << str << endl; } QString unit = qualifiedName(c); pas << "unit " << unit << ";" << m_endl << m_endl; pas << "INTERFACE" << m_endl << m_endl; // Use referenced classes. UMLPackageList imports; findObjectsRelated(c, imports); if (imports.count()) { pas << "uses" << m_endl; bool first = true; foreach (UMLPackage* con, imports) { if (con->baseType() != UMLObject::ot_Datatype) { if (first) first = false; else pas << "," << m_endl; pas << " " << qualifiedName(con); } } pas << ";" << m_endl << m_endl; }
/** * Determine the file name. * @param concept the package * @param ext the file extension * @return the valid file name */ QString SimpleCodeGenerator::findFileName(UMLPackage* concept, const QString &ext) { //if we already know to which file this class was written/should be written, just return it. if (m_fileMap.contains(concept)) return m_fileMap[concept]; //else, determine the "natural" file name QString name; // Get the package name QString package = concept->package("."); // Replace all white spaces with blanks package = package.simplified(); // Replace all blanks with underscore package.replace(QRegExp(" "), "_"); // Convert all "::" to "/" : Platform-specific path separator // package.replace(QRegExp("::"), "/"); // if package is given add this as a directory to the file name if (!package.isEmpty() && m_createDirHierarchyForPackages) { name = package + '.' + concept->name(); name.replace(QRegExp("\\."),"/"); package.replace(QRegExp("\\."), "/"); package = '/' + package; } else { name = concept->fullyQualifiedName("-"); } if (! UMLApp::app()->activeLanguageIsCaseSensitive()) { package = package.toLower(); name = name.toLower(); } // if a package name exists check the existence of the package directory if (!package.isEmpty() && m_createDirHierarchyForPackages) { QDir pathDir(UMLApp::app()->commonPolicy()->getOutputDirectory().absolutePath() + package); // does our complete output directory exist yet? if not, try to create it if (!pathDir.exists()) { const QStringList dirs = pathDir.absolutePath().split('/'); QString currentDir = ""; QStringList::const_iterator end(dirs.end()); for (QStringList::const_iterator dir(dirs.begin()); dir != end; ++dir) { currentDir += '/' + *dir; if (! (pathDir.exists(currentDir) || pathDir.mkdir(currentDir) ) ) { KMessageBox::error(0, i18n("Cannot create the folder:\n") + pathDir.absolutePath() + i18n("\nPlease check the access rights"), i18n("Cannot Create Folder")); return NULL; } } } } name = name.simplified(); name.replace(QRegExp(" "),"_"); QString extension = ext.simplified(); extension.replace(' ', '_'); return overwritableName(concept, name, extension); }