All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
PluginBuilderWizard.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/qt/widgets/plugin/builder/PluginBuilderWizard.cpp
22 
23  \brief A Qt dialog that allows users to create new plugins based on TerraLib framework.
24 */
25 
26 // TerraLib
27 #include "../../../../common/StringUtils.h"
28 #include "../../../../common/Version.h"
29 #include "../../../../plugin/PluginManager.h"
30 #include "../../../../plugin/PluginInfo.h"
31 #include "../../../../plugin/Provider.h"
32 #include "../../utils/DoubleListWidget.h"
33 #include "../../utils/ParameterTableWidget.h"
34 #include "PluginBuilderWizard.h"
35 #include "PluginCMakeWriter.h"
36 #include "PluginSourceWriter.h"
37 #include "ui_DoubleListWidgetForm.h"
38 #include "ui_ParameterTableWidgetForm.h"
39 #include "ui_PluginBuilderWizardForm.h"
40 
41 // Qt
42 #include <QFileDialog>
43 #include <QMessageBox>
44 #include <QRegExp>
45 #include <QVBoxLayout>
46 
48  : QWizard(parent),
49  m_ui(new Ui::PluginBuilderWizardForm),
50  m_curDir("")
51 {
52  m_ui->setupUi(this);
53 
54  //terralib modules
55  std::vector<std::string> teModulesNeeded;
56  teModulesNeeded.push_back("te.common"); //MANDATORY
57  teModulesNeeded.push_back("te.plugin"); //MANDATORY
58 
59  std::vector<std::string> teModules;
60  teModules.push_back("te.annotationtext");
61  teModules.push_back("te.color");
62  teModules.push_back("te.dataaccess");
63  teModules.push_back("te.datatype");
64  teModules.push_back("te.filter_encoding");
65  teModules.push_back("te.da.gdal");
66  teModules.push_back("te.geometry");
67  teModules.push_back("te.gml");
68  teModules.push_back("te.maptools");
69  teModules.push_back("te.da.memory");
70  teModules.push_back("te.qt.af");
71  teModules.push_back("te.raster");
72  teModules.push_back("te.rasterprocessing");
73  teModules.push_back("te.srs");
74  teModules.push_back("te.symbology_encoding");
75  teModules.push_back("te.xlinks");
76  teModules.push_back("te.xml");
77 
78  //license types
79  QStringList licenses;
80  licenses.push_back("Berkeley Database License");
81  licenses.push_back("Boost Software License");
82  licenses.push_back("BSD Documentation License");
83  licenses.push_back("Eclipse Distribution License");
84  licenses.push_back("GPL / GNU General Public License");
85  licenses.push_back("Intel Open Source License");
86  licenses.push_back("LGPL / GNU Lesser General Public License");
87  licenses.push_back("License of Python");
88  licenses.push_back("MIT license");
89  licenses.push_back("Public Domain");
90  licenses.push_back("W3C Software Notice and License");
91 
92  //category tpyes
93  QStringList categList;
94  categList.push_back("Cellular Space");
95  categList.push_back("Data Access");
96  categList.push_back("Data Management");
97  categList.push_back("Examples");
98  categList.push_back("Language Bindings");
99  categList.push_back("Location Base Services");
100  categList.push_back("Plugin Managememt");
101  categList.push_back("Spatial Analysis");
102  categList.push_back("Spatial Operations");
103  categList.push_back("Web Services");
104 
105  //fill interface
106  m_ui->m_terralibVersionLineEdit->setText(te::common::Version::asString().c_str());
107  m_ui->m_pluginCategoryComboBox->addItems(categList);
108  m_ui->m_pluginLicenseComboBox->addItems(licenses);
109 
110  setButtonText(QWizard::CustomButton1, tr("&Settings"));
111 
112  // plugin dependencies
113  m_pluginDependencies.reset(new DoubleListWidget(m_ui->m_pluginDependenciesPage));
114  m_pluginDependencies->getForm()->m_leftItemsLabel->setText(tr("Available Plugins"));
115  m_pluginDependencies->getForm()->m_rightItemsLabel->setText(tr("Required Plugins"));
116  m_ui->m_pluginDependenciesGridLayout->addWidget(m_pluginDependencies.get());
117 
118  std::vector<std::string> plugins = te::plugin::PluginManager::getInstance().getPlugins();
119  m_pluginDependencies->setInputValues(plugins);
120 
121 // category dependencies
122  m_categoryDependencies.reset(new DoubleListWidget(m_ui->m_categoryDependenciesPage));
123  m_categoryDependencies->getForm()->m_leftItemsLabel->setText(tr("Available plugin categories"));
124  m_categoryDependencies->getForm()->m_rightItemsLabel->setText(tr("Required categories for your plugin"));
125  m_ui->m_categoryDependenciesGridLayout->addWidget(m_categoryDependencies.get());
126 
127  std::vector<std::string> categories;
128  te::plugin::PluginManager::getInstance().getCategories(categories);
129  m_categoryDependencies->setInputValues(categories);
130 
131 // module dependencies
132  m_moduleDependencies.reset(new DoubleListWidget(m_ui->m_moduleDependenciesPage));
133  m_moduleDependencies->getForm()->m_leftItemsLabel->setText(tr("Available modules"));
134  m_moduleDependencies->getForm()->m_rightItemsLabel->setText(tr("Required modules for your plugin"));
135  m_ui->m_moduleDependenciesGridLayout->addWidget(m_moduleDependencies.get());
136 
137  m_moduleDependencies->setInputValues(teModules);
138  m_moduleDependencies->setOutputValues(teModulesNeeded);
139 
140 // plugin resources
141  m_pluginResources.reset(new ParameterTableWidget(m_ui->m_resourcesPage));
142  m_pluginResources->getForm()->m_parameterTitle->setText(tr("Resources"));
143  m_ui->m_resourcesGridLayout->addWidget(m_pluginResources.get());
144 
145 // plugin parameters
146  m_pluginParameters.reset(new ParameterTableWidget(m_ui->m_parametersPage));
147  m_ui->m_parametersGridLayout->addWidget(m_pluginParameters.get());
148 
149 // connect
150  connect(m_ui->m_terraLibIncludeDirToolButton, SIGNAL(clicked()), this, SLOT(onTeIncludeDirButtonClicked()));
151  connect(m_ui->m_terraLibCmakeDirToolButton, SIGNAL(clicked()), this, SLOT(onTeCmakeDirButtonClicked()));
152  connect(m_ui->m_sourceCodeLocationToolButton, SIGNAL(clicked()), this, SLOT(onPluginSrcDirButtonClicked()));
153  connect(m_ui->m_buildLocationToolButton, SIGNAL(clicked()), this, SLOT(onPluginBuildDirButtonClicked()));
154 }
155 
157 {
158 }
159 
161 {
162  if(currentPage() == m_ui->m_basicPluginInfoPage)
163  {
164  return pluginInfoPageCheck();
165  }
166  else if(currentPage() == m_ui->m_licenseAndProviderPage)
167  {
168  return providerPageCheck();
169  }
170  else if(currentPage() == m_ui->m_pluginTargetLocationPage)
171  {
172  if(dirPageCheck())
173  {
174  buildPlugin();
175  }
176  else
177  {
178  return false;
179  }
180  }
181 
182  return true;
183 }
184 
186 {
187  m_curDir = QFileDialog::getExistingDirectory(this, tr("Select the Include directory of TerraLib"), m_curDir);
188 
189  if(m_curDir.isEmpty() == false)
190  {
191  m_ui->m_terralibIncludeDirLineEdit->setText(m_curDir);
192  }
193 }
194 
196 {
197  m_curDir = QFileDialog::getExistingDirectory(this, tr("Select the Cmake Configure Files directory of TerraLib"), m_curDir);
198 
199  if(m_curDir.isEmpty() == false)
200  {
201  m_ui->m_terralibCmakeDirLineEdit->setText(m_curDir);
202  }
203 }
204 
206 {
207  m_curDir = QFileDialog::getExistingDirectory(this, tr("Select the location to create the source code files"), m_curDir);
208 
209  if(m_curDir.isEmpty() == false)
210  {
211  m_ui->m_sourceCodeLocationLineEdit->setText(m_curDir);
212  }
213 }
214 
216 {
217  m_curDir = QFileDialog::getExistingDirectory(this, tr("Select the location to create the build files"), m_curDir);
218 
219  if(m_curDir.isEmpty() == false)
220  {
221  m_ui->m_buildLocationLineEdit->setText(m_curDir);
222  }
223 }
224 
226 {
227  if(m_ui->m_pluginNameLineEdit->text().isEmpty())
228  {
229  QMessageBox::warning(this, tr("Plugin Builder"), tr("Plugin Name not defined."));
230  return false;
231  }
232  else
233  {
234  std::string name = m_ui->m_pluginNameLineEdit->text().toStdString();
235  m_pluginResources->add("SharedLibraryName", name);
236 
237  //perhaps this information should be generated elsewhere
238  int pos = name.rfind("_");
239  std::string nameSpace = name.substr(pos + 1, name.size() - 1);
240  std::string macroExport = "TEPLUGIN" + te::common::Convert2UCase(nameSpace) + "DLL";
241 
242  m_ui->m_cPlusPlusNameSpaceLineEdit->setText(nameSpace.c_str());
243  m_ui->m_cPlusPlusMacroExportLineEdit->setText(macroExport.c_str());
244  }
245 
246  if(m_ui->m_pluginVersionLineEdit->text().isEmpty())
247  {
248  QMessageBox::warning(this, tr("Plugin Builder"), tr("Plugin Version not defined."));
249  return false;
250  }
251 
252  if(m_ui->m_pluginDisplayTextLineEdit->text().isEmpty())
253  {
254  QMessageBox::warning(this, tr("Plugin Builder"), tr("Plugin Display Text not defined."));
255  return false;
256  }
257 
258  if(m_ui->m_pluginSiteLineEdit->text().isEmpty())
259  {
260  QMessageBox::warning(this, tr("Plugin Builder"), tr("Plugin Site not defined."));
261  return false;
262  }
263 
264  if(m_ui->m_pluginDescriptionTextEdit->document()->toPlainText().isEmpty())
265  {
266  QMessageBox::warning(this, tr("Plugin Builder"), tr("Plugin Description not defined."));
267  return false;
268  }
269 
270  return true;
271 }
272 
274 {
275  if(m_ui->m_pluginLicenseSiteLineEdit->text().isEmpty())
276  {
277  QMessageBox::warning(this, tr("Plugin Builder"), tr("License Site not defined."));
278  return false;
279  }
280 
281  if(m_ui->m_pluginProviderNameLineEdit->text().isEmpty())
282  {
283  QMessageBox::warning(this, tr("Plugin Builder"), tr("Provider Name not defined."));
284  return false;
285  }
286 
287  if(m_ui->m_pluginProviderSiteLineEdit->text().isEmpty())
288  {
289  QMessageBox::warning(this, tr("Plugin Builder"), tr("Provider Site not defined."));
290  return false;
291  }
292 
293  if(m_ui->m_pluginProviderEmailLineEdit->text().isEmpty())
294  {
295  QMessageBox::warning(this, tr("Plugin Builder"), tr("Provider Email not defined."));
296  return false;
297  }
298 
299  return true;
300 }
301 
303 {
304  if(m_ui->m_terralibIncludeDirLineEdit->text().isEmpty())
305  {
306  QMessageBox::warning(this, tr("Plugin Builder"), tr("TerraLib Include dir not defined."));
307  return false;
308  }
309 
310  if(m_ui->m_terralibCmakeDirLineEdit->text().isEmpty())
311  {
312  QMessageBox::warning(this, tr("Plugin Builder"), tr("TerraLib Cmake dir not defined."));
313  return false;
314  }
315 
316  if(m_ui->m_sourceCodeLocationLineEdit->text().isEmpty())
317  {
318  QMessageBox::warning(this, tr("Plugin Builder"), tr("Plugin Source dir not defined."));
319  return false;
320  }
321 
322  if(m_ui->m_buildLocationLineEdit->text().isEmpty())
323  {
324  QMessageBox::warning(this, tr("Plugin Builder"), tr("Plugin Build dir not defined."));
325  return false;
326  }
327 
328  return true;
329 }
330 
332 {
334  pi.m_name = m_ui->m_pluginNameLineEdit->text().toStdString();
335  pi.m_displayName = m_ui->m_pluginDisplayTextLineEdit->text().toStdString();
336  pi.m_description = m_ui->m_pluginDescriptionTextEdit->document()->toPlainText().toStdString();
337  pi.m_version = m_ui->m_pluginVersionLineEdit->text().toStdString();
338  pi.m_release = m_ui->m_pluginReleaseDateTime->text().toStdString();
339  pi.m_engine = m_ui->m_cPlusPlusLanguageRadioButton->text().toStdString(); // SET TO C++ CHANGE THIS IN THE FUTURE
340  pi.m_terralibVersion = m_ui->m_terralibVersionLineEdit->text().toStdString();
341  pi.m_licenseDescription = m_ui->m_pluginLicenseComboBox->currentText().toStdString();
342  pi.m_licenseURL = m_ui->m_pluginLicenseSiteLineEdit->text().toStdString();
343  pi.m_category = m_ui->m_pluginCategoryComboBox->currentText().toStdString();
344  pi.m_site = m_ui->m_pluginSiteLineEdit->text().toStdString();
345  //pi.m_folder = m_ui->m_buildLocationLineEdit->text().toStdString();
346 
347  pi.m_requiredPlugins = m_pluginDependencies->getOutputValues();
348  pi.m_requiredPluginCategories = m_categoryDependencies->getOutputValues();
349  pi.m_requiredModules = m_moduleDependencies->getOutputValues();
350 
351  std::map<std::string, std::string> pluginResMap = m_pluginResources->getMap();
352  std::map<std::string, std::string>::iterator it = pluginResMap.begin();
353 
354  while(it != pluginResMap.end())
355  {
356  te::plugin::PluginInfo::Resource r(it->first, it->second);
357  pi.m_resources.push_back(r);
358  ++it;
359  }
360 
361  std::map<std::string, std::string> pluginParamsMap = m_pluginParameters->getMap();
362  it = pluginParamsMap.begin();
363 
364  while(it != pluginParamsMap.end())
365  {
366  te::plugin::PluginInfo::Parameter p(it->first, it->second);
367  pi.m_parameters.push_back(p);
368  ++it;
369  }
370 
371  //aquire provider info
373  p.m_name = m_ui->m_pluginProviderNameLineEdit->text().toStdString();
374  p.m_site = m_ui->m_pluginProviderSiteLineEdit->text().toStdString();
375  p.m_email = m_ui->m_pluginProviderEmailLineEdit->text().toStdString();
376 
377  //acquire dir informations
378  std::string teIncludeDir = m_ui->m_terralibIncludeDirLineEdit->text().replace(QRegExp("\\\\"), "/").toStdString();
379  std::string teCmakeDir = m_ui->m_terralibCmakeDirLineEdit->text().replace(QRegExp("\\\\"), "/").toStdString();
380  std::string pluginSrcDir = m_ui->m_sourceCodeLocationLineEdit->text().replace(QRegExp("\\\\"), "/").toStdString();
381  std::string pluginBuildDir = m_ui->m_buildLocationLineEdit->text().replace(QRegExp("\\\\"), "/").toStdString();
382  // \\\\ is used to represente a back slash - Believe... QRegExp - Qt Documentation
383 
384  //targuet language information
385  std::string nameSpace = "";
386  std::string macroExport = "";
387 
388  if(m_ui->m_cPlusPlusLanguageRadioButton->isChecked())
389  {
390  nameSpace = m_ui->m_cPlusPlusNameSpaceLineEdit->text().toStdString();
391  macroExport = m_ui->m_cPlusPlusMacroExportLineEdit->text().toStdString();
392  }
393 
394  //create cmake files
396  cmakeWriter.createCmakeFile(pluginBuildDir, pluginSrcDir, pi.m_name, macroExport, teCmakeDir, pi);
397 
398  cmakeWriter.createPluginInfoFile(pluginBuildDir, pi, p);
399 
400  //create source files
402  sourceWriter.createHeaderFile(pluginSrcDir, nameSpace);
403 
404  sourceWriter.createCppFile(pluginSrcDir, nameSpace, pi.m_name);
405 
406  sourceWriter.createConfigFile(pluginSrcDir, nameSpace, macroExport, pi.m_name);
407 
408  QMessageBox::information(this, tr("Plugin Builder"), tr("Plugin built successfully!"));
409 }
410 
A Qt dialog that allows users to create new plugins based on TerraLib framework.
std::auto_ptr< DoubleListWidget > m_moduleDependencies
std::auto_ptr< ParameterTableWidget > m_pluginResources
std::string m_name
The plugin name: an internal value used to identify the plugin in the system. Must be a unique value...
Definition: PluginInfo.h:66
std::vector< std::string > m_requiredPlugins
The list of required plugins in order to lunch the plugin.
Definition: PluginInfo.h:78
std::vector< std::string > m_requiredModules
The list of required category of plugins in order to lunch the plugin.
Definition: PluginInfo.h:80
std::auto_ptr< Ui::PluginBuilderWizardForm > m_ui
std::string m_site
The provider home page.
Definition: Provider.h:48
This struct can be used to describe a given plugin provider.
Definition: Provider.h:45
std::string m_licenseDescription
A brief description about the plugin license.
Definition: PluginInfo.h:73
std::auto_ptr< DoubleListWidget > m_pluginDependencies
std::string m_displayName
The plugin name to be displayed in a graphical interface.
Definition: PluginInfo.h:67
static std::string asString()
Definition: Version.cpp:60
std::auto_ptr< DoubleListWidget > m_categoryDependencies
std::string Convert2UCase(const std::string &value)
It converts a string to upper case.
Definition: StringUtils.h:163
std::string m_terralibVersion
The TerraLib version this plugin depends on.
Definition: PluginInfo.h:72
This class is used to create the cmake file for the new plugin builded.
void createCppFile(const std::string &sourcePath, const std::string &nameSpace, const std::string projName)
std::string m_engine
The type of plugin execution engine: C++, JAVA.
Definition: PluginInfo.h:71
std::string m_version
The plugin version.
Definition: PluginInfo.h:69
std::string m_site
An URL pointing to the plugin site.
Definition: PluginInfo.h:76
static PluginManager & getInstance()
It returns a reference to the singleton instance.
std::auto_ptr< ParameterTableWidget > m_pluginParameters
std::vector< std::string > m_requiredPluginCategories
The list of required category of plugins in order to lunch the plugin.
Definition: PluginInfo.h:79
std::string m_email
The provider contact e-mail.
Definition: Provider.h:49
std::string m_release
The release date of the plugin. This may be used to identify new versions of a given plugin...
Definition: PluginInfo.h:70
void createPluginInfoFile(const std::string &buildPath, const te::plugin::PluginInfo &pi, const te::plugin::Provider &p)
std::vector< Resource > m_resources
The list of resources used by plugin.
Definition: PluginInfo.h:81
std::vector< Parameter > m_parameters
Any configuration parameter that can be informed to plugin (map: parameter-name -> parameter-value)...
Definition: PluginInfo.h:82
std::pair< std::string, std::string > Resource
Definition: PluginInfo.h:63
This class is used to create the cmake file for the new plugin builded.
std::string m_description
A brief explanation about the plugin.
Definition: PluginInfo.h:68
std::string m_name
Provider name: may be a person or a company.
Definition: Provider.h:47
This class is used to create the source files for the new plugin builded.
The basic information about a plugin.
Definition: PluginInfo.h:61
void createConfigFile(const std::string &sourcePath, const std::string &nameSpace, const std::string exportMacro, const std::string projName)
void createHeaderFile(const std::string &sourcePath, const std::string &nameSpace)
void createCmakeFile(const std::string &buildPath, const std::string &sourcePath, const std::string &projName, const std::string exportMacro, const std::string &cmakePath, const te::plugin::PluginInfo &pi)
std::string m_category
The plugin category.
Definition: PluginInfo.h:75
std::pair< std::string, std::string > Parameter
Definition: PluginInfo.h:64
std::string m_licenseURL
An URL where someone can find more information on the license.
Definition: PluginInfo.h:74