addclass.cpp
Go to the documentation of this file.00001 #include <sys/stat.h>
00002 #include <sys/types.h>
00003
00004
00005 #include <qcheckbox.h>
00006 #include <qradiobutton.h>
00007 #include <qtextedit.h>
00008 #include <qtextstream.h>
00009 #include <qregexp.h>
00010 #include <qfile.h>
00011 #include <qfileinfo.h>
00012
00013
00014 #include <klineedit.h>
00015 #include <kcombobox.h>
00016 #include <keditlistbox.h>
00017 #include <kdebug.h>
00018
00019
00020 #include "addclassdlg.h"
00021
00022
00023 #include "addclass.h"
00024
00025
00026 AddClassInfo::AddClassInfo()
00027 : interfaceOpt(false), abstractOpt(false), finalOpt(false),
00028 createConstructor(true), createMain(false)
00029 {
00030 }
00031
00032
00033 QString AddClassInfo::adaFileName() const
00034 {
00035 QString dest = className;
00036 dest.replace(QRegExp("\\."), "/");
00037 return sourceDir + "/" + dest + ".ada";
00038 }
00039
00040
00041 AddClass::AddClass()
00042 {
00043 }
00044
00045
00046 void AddClass::setInfo(const AddClassInfo &info)
00047 {
00048 m_info = info;
00049 }
00050
00051
00052 AddClassInfo &AddClass::info()
00053 {
00054 return m_info;
00055 }
00056
00057
00058 void AddClass::setBaseClasses(const QStringList &classes)
00059 {
00060 m_baseClasses = classes;
00061 }
00062
00063
00064 bool AddClass::showDialog()
00065 {
00066 AddClassDlg dlg;
00067
00068 QString dir = m_info.projectDir;
00069 if (m_info.sourceDir.isEmpty())
00070 m_info.sourceDir = "src";
00071 if (dir.isEmpty())
00072 dir = m_info.sourceDir;
00073 else
00074 dir = dir + "/" + m_info.sourceDir;
00075
00076 dlg.SourcePath->setText(dir);
00077 dlg.ClassName->setText(m_info.className);
00078 dlg.Extends->insertStringList(m_baseClasses);
00079 dlg.Extends->setEditText(m_info.extends);
00080 dlg.Interface->setChecked(m_info.interfaceOpt);
00081 dlg.Abstract->setChecked(m_info.abstractOpt);
00082 dlg.Final->setChecked(m_info.finalOpt);
00083
00084 switch (m_info.visibility)
00085 {
00086 case AddClassInfo::ProtectedClass:
00087 dlg.Protected->setChecked(true);
00088 break;
00089 case AddClassInfo::PrivateClass:
00090 dlg.Private->setChecked(true);
00091 break;
00092 default:
00093 dlg.Public->setChecked(true);
00094 break;
00095 }
00096
00097 dlg.Implements->insertStringList(m_info.implements);
00098 dlg.Constructor->setChecked(m_info.createConstructor);
00099 dlg.Main->setChecked(m_info.createMain);
00100 dlg.Documentation->setText(m_info.documentation);
00101 dlg.License->setEditText(m_info.license);
00102
00103 if (dlg.exec() == QDialog::Accepted)
00104 {
00105 m_info.projectDir = "";
00106 m_info.sourceDir = dlg.SourcePath->text();
00107 m_info.className = dlg.ClassName->text();
00108 m_info.extends = dlg.Extends->currentText();
00109 m_info.interfaceOpt = dlg.Interface->isChecked();
00110 m_info.abstractOpt = dlg.Abstract->isChecked();
00111 m_info.finalOpt = dlg.Final->isChecked();
00112
00113 if (dlg.Protected->isChecked())
00114 m_info.visibility = AddClassInfo::ProtectedClass;
00115 else if (dlg.Private->isChecked())
00116 m_info.visibility = AddClassInfo::PrivateClass;
00117 else
00118 m_info.visibility = AddClassInfo::PublicClass;
00119
00120 m_info.implements = dlg.Implements->items();
00121 m_info.createConstructor = dlg.Constructor->isChecked();
00122 m_info.createMain = dlg.Main->isChecked();
00123 m_info.documentation = dlg.Documentation->text();
00124 m_info.license = dlg.License->currentText();
00125
00126 return true;
00127 }
00128
00129 return false;
00130 }
00131
00132
00133 static bool makeDirs(const QString &dest)
00134 {
00135 QStringList dirs = QStringList::split("/", dest);
00136
00137 QString d = "";
00138
00139 for (QStringList::Iterator it=dirs.begin(); it != dirs.end(); ++it)
00140 {
00141 d = d + "/" + *it;
00142
00143 QFileInfo fi(d);
00144
00145 if (fi.exists() && !fi.isDir())
00146 {
00148 return false;
00149 }
00150
00151 if (!fi.exists())
00152 if (::mkdir(QFile::encodeName(d), 0755) != 0)
00153 return false;
00154 }
00155
00156 return true;
00157 }
00158
00159
00160 bool AddClass::generate()
00161 {
00162 QString code;
00163
00164
00165
00166 if (!m_info.license.isEmpty())
00167 {
00168 code += "/*\n";
00169
00170 if (m_info.license == "GPL")
00171 {
00172 code +=
00173 " * This program is free software; you can redistribute it and/or modify\n"
00174 " * it under the terms of the GNU General Public License as published by\n"
00175 " * the Free Software Foundation; either version 2 of the License, or\n"
00176 " * (at your option) any later version.\n";
00177 }
00178 else if (m_info.license == "LGPL")
00179 {
00180 code +=
00181 " * This program is free software; you can redistribute it and/or modify\n"
00182 " * it under the terms of the GNU Library General Public License as\n"
00183 " * published by the Free Software Foundation; either version 2 of the\n"
00184 " * License, or (at your option) any later version.\n";
00185 }
00186 else if (m_info.license == "QPL")
00187 {
00188 code +=
00189 " * This program may be distributed under the terms of the Q Public\n"
00190 " * License as defined by Trolltech AS of Norway and appearing in the\n"
00191 " * file LICENSE.QPL included in the packaging of this file.\n"
00192 " *\n"
00193 " * This program is distributed in the hope that it will be useful,\n"
00194 " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
00195 " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
00196 }
00197 else
00198 {
00199 code += " * This program is licensed under the " + m_info.license + ".\n";
00200 code += " * Please see the documentation for details.\n";
00201 }
00202
00203 code += " */\n\n\n";
00204 }
00205
00206
00207 QString className, packageName;
00208
00209 int i = m_info.className.findRev('.');
00210 if (i == -1)
00211 {
00212 packageName = "";
00213 className = m_info.className;
00214 }
00215 else
00216 {
00217 packageName = m_info.className.left(i);
00218 className = m_info.className.mid(i+1);
00219 }
00220
00221
00222 if (!packageName.isEmpty())
00223 code += "package " + packageName + ";\n\n\n";
00224
00225
00226
00227 if (!m_info.documentation.isEmpty())
00228 {
00229 code += "\n\n";
00237 }
00238
00239
00240
00241 switch (m_info.visibility)
00242 {
00243 case AddClassInfo::PrivateClass:
00244 code += "private";
00245 break;
00246 case AddClassInfo::ProtectedClass:
00247 code += "protected";
00248 break;
00249 default:
00250 code += "public";
00251 break;
00252 }
00253
00254
00255
00256 if (!m_info.interfaceOpt)
00257 {
00258 if (m_info.abstractOpt)
00259 code += " abstract";
00260 if (m_info.finalOpt)
00261 code += " final";
00262 }
00263
00264
00265
00266 if (m_info.interfaceOpt)
00267 code += " interface ";
00268 else
00269 code += " class ";
00270
00271
00272
00273 code += className;
00274
00275
00276
00277 if (!m_info.extends.isEmpty())
00278 code += " extends " + m_info.extends;
00279
00280
00281
00282 if ((m_info.implements.count() > 0) && !m_info.interfaceOpt)
00283 {
00284 code += " implements ";
00285 unsigned int c=0;
00286 for (QStringList::Iterator it = m_info.implements.begin(); it != m_info.implements.end(); ++it, c++)
00287 {
00288 code += *it;
00289 if (c+1 < m_info.implements.count())
00290 code += ", ";
00291 }
00292 }
00293
00294
00295
00296 code += "\n{\n\n";
00297
00298
00299
00300 if (m_info.createConstructor && !m_info.interfaceOpt)
00301 {
00302 code += " " + className + "()\n";
00303 code += " {\n";
00304 if (!m_info.extends.isEmpty())
00305 code += " super();\n";
00306 code += " }\n\n";
00307 }
00308
00309
00310
00311 if (m_info.createMain && !m_info.interfaceOpt)
00312 {
00313 code += " public static void main(String[] args)\n";
00314 code += " {\n";
00315 code += " }\n\n";
00316 }
00317
00318
00319
00320 code += "};\n";
00321
00322
00323
00324 QString dest = packageName;
00325 dest.replace(QRegExp("\\."), "/");
00326 dest = m_info.sourceDir + "/" + dest;
00327
00328 if (!makeDirs(dest))
00329 return false;
00330
00331
00332
00333 if (QFile::exists(m_info.adaFileName()))
00334 {
00336 }
00337
00338 QFile of(m_info.adaFileName());
00339 if (!of.open(IO_WriteOnly))
00340 {
00342 return false;
00343 }
00344
00345 QTextStream os(&of);
00346 os << code;
00347
00348 of.close();
00349
00350 return true;
00351 }
This file is part of the documentation for KDevelop Version 3.1.2.