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 }