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