summaryrefslogtreecommitdiffstats
path: root/languages/ada/addclass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'languages/ada/addclass.cpp')
-rw-r--r--languages/ada/addclass.cpp351
1 files changed, 351 insertions, 0 deletions
diff --git a/languages/ada/addclass.cpp b/languages/ada/addclass.cpp
new file mode 100644
index 00000000..5a5ccb13
--- /dev/null
+++ b/languages/ada/addclass.cpp
@@ -0,0 +1,351 @@
+#include <sys/stat.h>
+#include <sys/types.h>
+
+
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qtextedit.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+
+
+#include <klineedit.h>
+#include <kcombobox.h>
+#include <keditlistbox.h>
+#include <kdebug.h>
+
+
+#include "addclassdlg.h"
+
+
+#include "addclass.h"
+
+
+AddClassInfo::AddClassInfo()
+ : interfaceOpt(false), abstractOpt(false), finalOpt(false),
+ createConstructor(true), createMain(false)
+{
+}
+
+
+QString AddClassInfo::adaFileName() const
+{
+ QString dest = className;
+ dest.replace(QRegExp("\\."), "/");
+ return sourceDir + "/" + dest + ".ada";
+}
+
+
+AddClass::AddClass()
+{
+}
+
+
+void AddClass::setInfo(const AddClassInfo &info)
+{
+ m_info = info;
+}
+
+
+AddClassInfo &AddClass::info()
+{
+ return m_info;
+}
+
+
+void AddClass::setBaseClasses(const QStringList &classes)
+{
+ m_baseClasses = classes;
+}
+
+
+bool AddClass::showDialog()
+{
+ AddClassDlg dlg;
+
+ QString dir = m_info.projectDir;
+ if (m_info.sourceDir.isEmpty())
+ m_info.sourceDir = "src";
+ if (dir.isEmpty())
+ dir = m_info.sourceDir;
+ else
+ dir = dir + "/" + m_info.sourceDir;
+
+ dlg.SourcePath->setText(dir);
+ dlg.ClassName->setText(m_info.className);
+ dlg.Extends->insertStringList(m_baseClasses);
+ dlg.Extends->setEditText(m_info.extends);
+ dlg.Interface->setChecked(m_info.interfaceOpt);
+ dlg.Abstract->setChecked(m_info.abstractOpt);
+ dlg.Final->setChecked(m_info.finalOpt);
+
+ switch (m_info.visibility)
+ {
+ case AddClassInfo::ProtectedClass:
+ dlg.Protected->setChecked(true);
+ break;
+ case AddClassInfo::PrivateClass:
+ dlg.Private->setChecked(true);
+ break;
+ default:
+ dlg.Public->setChecked(true);
+ break;
+ }
+
+ dlg.Implements->insertStringList(m_info.implements);
+ dlg.Constructor->setChecked(m_info.createConstructor);
+ dlg.Main->setChecked(m_info.createMain);
+ dlg.Documentation->setText(m_info.documentation);
+ dlg.License->setEditText(m_info.license);
+
+ if (dlg.exec() == QDialog::Accepted)
+ {
+ m_info.projectDir = "";
+ m_info.sourceDir = dlg.SourcePath->text();
+ m_info.className = dlg.ClassName->text();
+ m_info.extends = dlg.Extends->currentText();
+ m_info.interfaceOpt = dlg.Interface->isChecked();
+ m_info.abstractOpt = dlg.Abstract->isChecked();
+ m_info.finalOpt = dlg.Final->isChecked();
+
+ if (dlg.Protected->isChecked())
+ m_info.visibility = AddClassInfo::ProtectedClass;
+ else if (dlg.Private->isChecked())
+ m_info.visibility = AddClassInfo::PrivateClass;
+ else
+ m_info.visibility = AddClassInfo::PublicClass;
+
+ m_info.implements = dlg.Implements->items();
+ m_info.createConstructor = dlg.Constructor->isChecked();
+ m_info.createMain = dlg.Main->isChecked();
+ m_info.documentation = dlg.Documentation->text();
+ m_info.license = dlg.License->currentText();
+
+ return true;
+ }
+
+ return false;
+}
+
+
+static bool makeDirs(const QString &dest)
+{
+ QStringList dirs = QStringList::split("/", dest);
+
+ QString d = "";
+
+ for (QStringList::Iterator it=dirs.begin(); it != dirs.end(); ++it)
+ {
+ d = d + "/" + *it;
+
+ QFileInfo fi(d);
+
+ if (fi.exists() && !fi.isDir())
+ {
+ /// @todo message to user!
+ return false;
+ }
+
+ if (!fi.exists())
+ if (::mkdir(QFile::encodeName(d), 0755) != 0)
+ return false;
+ }
+
+ return true;
+}
+
+
+bool AddClass::generate()
+{
+ QString code;
+
+ // license
+
+ if (!m_info.license.isEmpty())
+ {
+ code += "/*\n";
+
+ if (m_info.license == "GPL")
+ {
+ code +=
+ " * This program is free software; you can redistribute it and/or modify\n"
+ " * it under the terms of the GNU General Public License as published by\n"
+ " * the Free Software Foundation; either version 2 of the License, or\n"
+ " * (at your option) any later version.\n";
+ }
+ else if (m_info.license == "LGPL")
+ {
+ code +=
+ " * This program is free software; you can redistribute it and/or modify\n"
+ " * it under the terms of the GNU Library General Public License as\n"
+ " * published by the Free Software Foundation; either version 2 of the\n"
+ " * License, or (at your option) any later version.\n";
+ }
+ else if (m_info.license == "QPL")
+ {
+ code +=
+ " * This program may be distributed under the terms of the Q Public\n"
+ " * License as defined by Trolltech AS of Norway and appearing in the\n"
+ " * file LICENSE.QPL included in the packaging of this file.\n"
+ " *\n"
+ " * This program is distributed in the hope that it will be useful,\n"
+ " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
+ }
+ else
+ {
+ code += " * This program is licensed under the " + m_info.license + ".\n";
+ code += " * Please see the documentation for details.\n";
+ }
+
+ code += " */\n\n\n";
+ }
+
+ // find class and package name
+ QString className, packageName;
+
+ int i = m_info.className.findRev('.');
+ if (i == -1)
+ {
+ packageName = "";
+ className = m_info.className;
+ }
+ else
+ {
+ packageName = m_info.className.left(i);
+ className = m_info.className.mid(i+1);
+ }
+
+ // package
+ if (!packageName.isEmpty())
+ code += "package " + packageName + ";\n\n\n";
+
+ // documentation
+
+ if (!m_info.documentation.isEmpty())
+ {
+ code += "/**\n";
+
+ QTextStream ts(&m_info.documentation, IO_ReadOnly);
+
+ while (!ts.eof())
+ code += " * " + ts.readLine() + "\n";
+
+ code += " */\n\n";
+ }
+
+ // visibility
+
+ switch (m_info.visibility)
+ {
+ case AddClassInfo::PrivateClass:
+ code += "private";
+ break;
+ case AddClassInfo::ProtectedClass:
+ code += "protected";
+ break;
+ default:
+ code += "public";
+ break;
+ }
+
+ // abstract, final
+
+ if (!m_info.interfaceOpt)
+ {
+ if (m_info.abstractOpt)
+ code += " abstract";
+ if (m_info.finalOpt)
+ code += " final";
+ }
+
+ // generate class/interface declaration
+
+ if (m_info.interfaceOpt)
+ code += " interface ";
+ else
+ code += " class ";
+
+ // classname
+
+ code += className;
+
+ // extends
+
+ if (!m_info.extends.isEmpty())
+ code += " extends " + m_info.extends;
+
+ // implements
+
+ if ((m_info.implements.count() > 0) && !m_info.interfaceOpt)
+ {
+ code += " implements ";
+ unsigned int c=0;
+ for (QStringList::Iterator it = m_info.implements.begin(); it != m_info.implements.end(); ++it, c++)
+ {
+ code += *it;
+ if (c+1 < m_info.implements.count())
+ code += ", ";
+ }
+ }
+
+ // body start
+
+ code += "\n{\n\n";
+
+ // default constructor
+
+ if (m_info.createConstructor && !m_info.interfaceOpt)
+ {
+ code += " " + className + "()\n";
+ code += " {\n";
+ if (!m_info.extends.isEmpty())
+ code += " super();\n";
+ code += " }\n\n";
+ }
+
+ // main method
+
+ if (m_info.createMain && !m_info.interfaceOpt)
+ {
+ code += " public static void main(String[] args)\n";
+ code += " {\n";
+ code += " }\n\n";
+ }
+
+ // body end
+
+ code += "};\n";
+
+ // create directories
+
+ QString dest = packageName;
+ dest.replace(QRegExp("\\."), "/");
+ dest = m_info.sourceDir + "/" + dest;
+
+ if (!makeDirs(dest))
+ return false;
+
+ // write out the file
+
+ if (QFile::exists(m_info.adaFileName()))
+ {
+ /// @todo ask before overwriting!
+ }
+
+ QFile of(m_info.adaFileName());
+ if (!of.open(IO_WriteOnly))
+ {
+ /// @todo message to user
+ return false;
+ }
+
+ QTextStream os(&of);
+ os << code;
+
+ of.close();
+
+ return true;
+}