123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- /*=============================================================================
- Library: CTK
- Copyright (c) 2010 German Cancer Research Center,
- Division of Medical and Biological Informatics
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- =============================================================================*/
- #include "ctkPluginGeneratorMainExtension.h"
- #include <ctkPluginGeneratorCodeModel.h>
- #include <ctkPluginGeneratorConstants.h>
- #include <ctkPluginGeneratorCMakeLists.h>
- #include <ctkPluginGeneratorHeaderTemplate.h>
- #include <ctkPluginGeneratorCppPluginActivator.h>
- #include <ctkPluginGeneratorTargetLibraries.h>
- ctkPluginGeneratorMainExtension::ctkPluginGeneratorMainExtension()
- : ui(0)
- {
- this->setTitle(tr("Main"));
- this->setDescription("The main parameters for a new plugin");
- }
- QWidget* ctkPluginGeneratorMainExtension::createWidget()
- {
- ui = new Ui::ctkPluginGeneratorMainExtension();
- QWidget* container = new QWidget();
- ui->setupUi(container);
- connectSignals();
- setTitle(tr("Main"));
- return container;
- }
- void ctkPluginGeneratorMainExtension::connectSignals()
- {
- connect(ui->symbolicNameEdit, SIGNAL(textChanged(QString)), this, SLOT(symbolicNameChanged()));
- connect(ui->activatorClassEdit, SIGNAL(textChanged(QString)), this, SLOT(activatorClassChanged()));
- connect(ui->symbolicNameEdit, SIGNAL(textChanged(QString)), this, SLOT(updateParameters()));
- connect(ui->exportDirectiveEdit, SIGNAL(textChanged(QString)), this, SLOT(updateParameters()));
- connect(ui->activatorClassEdit, SIGNAL(textChanged(QString)), this, SLOT(updateParameters()));
- connect(ui->activatorHeaderEdit, SIGNAL(textChanged(QString)), this, SLOT(updateParameters()));
- connect(ui->activatorSourceEdit, SIGNAL(textChanged(QString)), this, SLOT(updateParameters()));
- }
- void ctkPluginGeneratorMainExtension::symbolicNameChanged()
- {
- QString symbolicName = ui->symbolicNameEdit->text().replace(".", "_");
- ui->exportDirectiveEdit->setText(symbolicName + "_EXPORT");
- QString activatorClassName;
- QStringList tokens = symbolicName.split('_');
- if (tokens.size() > 1)
- {
- tokens.pop_front();
- activatorClassName += tokens.takeFirst();
- foreach(QString token, tokens)
- {
- activatorClassName += token.left(1).toUpper() + token.mid(1);
- }
- }
- activatorClassName += "Plugin";
- ui->activatorClassEdit->setText(activatorClassName);
- ui->activatorHeaderEdit->setText(activatorClassName + "_p.h");
- ui->activatorSourceEdit->setText(activatorClassName + ".cpp");
- }
- void ctkPluginGeneratorMainExtension::activatorClassChanged()
- {
- QString activatorClassName = ui->activatorClassEdit->text();
- ui->activatorHeaderEdit->setText(activatorClassName + "_p.h");
- ui->activatorSourceEdit->setText(activatorClassName + ".cpp");
- ui->advancedButton->setText(tr("Advanced (activator class: %1)").arg(activatorClassName));
- }
- bool ctkPluginGeneratorMainExtension::verifyParameters(
- const QHash<QString, QVariant>& params)
- {
- if (params["symbolic-name"].toString().isEmpty())
- {
- this->setErrorMessage(tr("The symbolic name cannot be empty"));
- return false;
- }
- if (params["export-directive"].toString().isEmpty())
- {
- this->setErrorMessage(tr("The export directive cannot be empty"));
- return false;
- }
- if (params["activator-classname"].toString().isEmpty())
- {
- this->setErrorMessage(tr("The activator class name cannot be empty"));
- return false;
- }
- if (params["activator-headerfile"].toString().isEmpty())
- {
- this->setErrorMessage(tr("The activator header filename cannot be empty"));
- return false;
- }
- if (params["activator-sourcefile"].toString().isEmpty())
- {
- this->setErrorMessage(tr("The activator source filename cannot be empty"));
- return false;
- }
- this->setErrorMessage("");
- return true;
- }
- void ctkPluginGeneratorMainExtension::updateCodeModel(const QHash<QString, QVariant>& params)
- {
- ctkPluginGeneratorCodeModel* codeModel = this->getCodeModel();
- codeModel->setSymbolicName(params["symbolic-name"].toString());
- codeModel->setExportMacroInclude(QString("#include <") + codeModel->getSymbolicName() + "_Export.h>");
- codeModel->setExportMacro(params["export-directive"].toString());
- // Add CMakeLists.txt template
- codeModel->addTemplate(new ctkPluginGeneratorCMakeLists());
- ctkPluginGeneratorAbstractTemplate* cmakelistsTemplate = codeModel->getTemplate(ctkPluginGeneratorConstants::TEMPLATE_CMAKELISTS_TXT);
- cmakelistsTemplate->addContent(ctkPluginGeneratorCMakeLists::PLUGIN_PROJECT_NAME_MARKER,
- codeModel->getSymbolicName(),
- ctkPluginGeneratorAbstractTemplate::REPLACE);
- cmakelistsTemplate->addContent(ctkPluginGeneratorConstants::PLUGIN_EXPORTMACRO_MARKER,
- codeModel->getExportMacro(),
- ctkPluginGeneratorAbstractTemplate::REPLACE);
- // Add <plugin-activator>.h template
- QString activatorClassName = params["activator-classname"].toString();
- ctkPluginGeneratorAbstractTemplate* activatorHeaderTemplate =
- new ctkPluginGeneratorHeaderTemplate(ctkPluginGeneratorConstants::TEMPLATE_PLUGINACTIVATOR_H);
- activatorHeaderTemplate->addContent(ctkPluginGeneratorConstants::PLUGIN_LICENSE_MARKER, codeModel->getLicense());
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_INCLUDES_MARKER, "#include <ctkPluginActivator.h>");
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_CLASSNAME_MARKER, activatorClassName);
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_SUPERCLASSES_MARKER, "public QObject, public ctkPluginActivator");
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_DEFAULT_ACCESS_MARKER, "Q_OBJECT\nQ_INTERFACES(ctkPluginActivator)");
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_PUBLIC_MARKER, activatorClassName + "();\n~" + activatorClassName + "();");
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_PUBLIC_MARKER, "void start(ctkPluginContext* context);\nvoid stop(ctkPluginContext* context);");
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_PUBLIC_MARKER, QString("static ") + activatorClassName + "* getInstance();");
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_PUBLIC_MARKER, "ctkPluginContext* getPluginContext() const;");
- activatorHeaderTemplate->addContent(ctkPluginGeneratorHeaderTemplate::H_PRIVATE_MARKER, QString("static ") + activatorClassName + "* instance;\nctkPluginContext* context;");
- activatorHeaderTemplate->setFilename(params["activator-headerfile"].toString());
- codeModel->addTemplate(activatorHeaderTemplate);
- // Add <plugin-activator>.cpp template
- ctkPluginGeneratorAbstractTemplate* activatorCppTemplate =
- new ctkPluginGeneratorCppPluginActivator();
- activatorCppTemplate->addContent(ctkPluginGeneratorConstants::PLUGIN_LICENSE_MARKER, codeModel->getLicense());
- activatorCppTemplate->addContent(ctkPluginGeneratorCppTemplate::CPP_CLASSNAME_MARKER, activatorClassName);
- activatorCppTemplate->addContent(ctkPluginGeneratorCppTemplate::CPP_INCLUDES_MARKER, QString("#include \"") + activatorHeaderTemplate->getFilename() + "\"");
- activatorCppTemplate->addContent(ctkPluginGeneratorCppTemplate::CPP_GLOBAL_MARKER, activatorClassName + "* " + activatorClassName + "::instance = 0;");
- activatorCppTemplate->addContent(ctkPluginGeneratorCppTemplate::CPP_CONSTRUCTOR_INITLIST_MARKER, "context(0)");
- activatorCppTemplate->addContent(ctkPluginGeneratorCppTemplate::CPP_DESTRUCTOR_BODY_MARKER, "");
- activatorCppTemplate->addContent(ctkPluginGeneratorCppPluginActivator::PLUGINACTIVATOR_START_MARKER, "instance = this;\nthis->context = context;");
- activatorCppTemplate->addContent(ctkPluginGeneratorCppTemplate::CPP_METHODS_MARKER, activatorClassName + "* " + activatorClassName + "::getInstance()\n{\n return instance;\n}");
- activatorCppTemplate->addContent(ctkPluginGeneratorCppTemplate::CPP_METHODS_MARKER, QString("ctkPluginContext* ") + activatorClassName + "::getPluginContext() const\n{\n return context;\n}");
- activatorCppTemplate->setFilename(params["activator-sourcefile"].toString());
- codeModel->addTemplate(activatorCppTemplate);
- // Add target_libraries.cmake template
- // TODO only add the CTKPluginFramework library if there are no plugin dependencies
- ctkPluginGeneratorAbstractTemplate* targetLibrariesTemplate =
- new ctkPluginGeneratorTargetLibraries();
- targetLibrariesTemplate->addContent(ctkPluginGeneratorTargetLibraries::TARGETLIBRARIES_MARKER, "CTKPluginFramework");
- codeModel->addTemplate(targetLibrariesTemplate);
- // add project files to CMakeLists.txt
- cmakelistsTemplate->addContent(ctkPluginGeneratorCMakeLists::PLUGIN_SRCS_MARKER, activatorCppTemplate->getFilename());
- cmakelistsTemplate->addContent(ctkPluginGeneratorCMakeLists::PLUGIN_MOC_SRCS_MARKER, activatorHeaderTemplate->getFilename());
- }
- void ctkPluginGeneratorMainExtension::updateParameters()
- {
- this->setParameter("symbolic-name", ui->symbolicNameEdit->text());
- this->setParameter("plugin-name", ui->nameEdit->text());
- this->setParameter("plugin-version", ui->versionEdit->text());
- this->setParameter("export-directive", ui->exportDirectiveEdit->text());
- this->setParameter("activator-classname", ui->activatorClassEdit->text());
- this->setParameter("activator-headerfile", ui->activatorHeaderEdit->text());
- this->setParameter("activator-sourcefile", ui->activatorSourceEdit->text());
- this->validate();
- }
|