• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

rocs/RocsCore

  • sources
  • kde-4.14
  • kdeedu
  • rocs
  • RocsCore
DataStructureBackendManager.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Rocs.
3  Copyright 2010 Wagner Reck <wagner.reck@gmail.com>
4  Copyright 2012-2013 Andreas Cord-Landwehr <cordlandwehr@kde.org>
5 
6  This program is free software; you can redistribute it and/or
7  modify it under the terms of the GNU General Public License as
8  published by the Free Software Foundation; either version 2 of
9  the License, or (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "DataStructureBackendManager.h"
21 #include "DataStructureBackendInterface.h"
22 
23 #include <KPluginInfo>
24 #include <KServiceTypeTrader>
25 #include <KDebug>
26 #include <KStandardDirs>
27 
28 #include <QHash>
29 #include "DataStructure.h"
30 #include "Data.h"
31 #include "Pointer.h"
32 
42 class DataStructureBackendManagerPrivate
43 {
44 public:
45 
46  typedef KPluginInfo::List KPluginList;
47 
48  QObject *_parent;
49  bool _initialized;
50  KPluginList _pluginInfo;
51  DataStructureBackendInterface *_currentPlugin;
52  QHash<QString, DataStructureBackendInterface*> _pluginList;
53 
54  DataStructureBackendManagerPrivate(QObject *parent)
55  : _parent(parent)
56  , _initialized(false)
57  , _pluginInfo(KPluginList())
58  , _currentPlugin(0)
59  {
60  }
61 
62  ~DataStructureBackendManagerPrivate()
63  {
64  _currentPlugin = 0;
65 
66  // clear plugins
67  qDeleteAll<QHash<QString, DataStructureBackendInterface*>::iterator>(_pluginList.begin(), _pluginList.end());
68  _pluginList.clear();
69  }
70 
71  void lazyInit()
72  {
73  if(!_initialized) {
74  _initialized = true;
75  loadBackends();
76  }
77  }
78 
79  DataStructurePtr convertDataStructureToActiveBackend(const DataStructurePtr dataStructure, Document* parent)
80  {
81  if (_currentPlugin) {
82  return _currentPlugin->convertToDataStructure(dataStructure, parent);
83  }
84  return dataStructure;
85  }
86 
87  KPluginInfo pluginInfo(DataStructureBackendInterface *plugin)
88  {
89  QString name = _pluginList.key(plugin);
90  foreach(const KPluginInfo& info, _pluginInfo) {
91  // we only want to compere the internal name and not the actual translated name
92  QString identifier = info.property(QLatin1String("X-Rocs-DataStructureIdentifier")).toString();
93  if (identifier.isEmpty()) {
94  identifier = info.name();
95  }
96  if (identifier == name) {
97  return info;
98  }
99  }
100  return KPluginInfo();
101  }
102 
103  DataStructurePtr createDataStructure(Document *arg1 , const QString &pluginName)
104  {
105  if (!pluginName.isEmpty()) {
106  if (DataStructureBackendInterface *plugin = _pluginList.value(pluginName)) {
107  return plugin->createDataStructure(arg1);
108  }
109  } else if (_currentPlugin) {
110  return _currentPlugin->createDataStructure(arg1);
111  }
112  return DataStructurePtr();
113  }
114 
115  DataStructureBackendInterface * backend(const QString &pluginIdentifier)
116  {
117  if (_pluginList.contains(pluginIdentifier)) {
118  return _pluginList[pluginIdentifier];
119  }
120  return 0;
121  }
122 
123  void setActivePlugin(const QString &pluginIdentifier)
124  {
125  if (DataStructureBackendInterface *plg = backend(pluginIdentifier)) {
126  _currentPlugin = plg;
127  }
128  }
129 
130  void loadBackends()
131  {
132  KServiceTypeTrader *trader = KServiceTypeTrader::self();
133  QString serviceType = QString::fromLatin1("Rocs/DataStructurePlugin");
134 
135  // standard read of backend services
136  KService::List offers = trader->query(serviceType);
137  KPluginInfo::List offerInfos = KPluginInfo::fromServices(offers);
138 
139  // fallback to load default data structures "by hand"
140  // this is the case when no kbuildsycoa4 run is performed and hence no trader cache was generated
141  QStringList defaultBackends;
142  defaultBackends << "rocs_GraphStructure.desktop"
143  << "rocs_ListStructure.desktop"
144  << "rocs_RootedTreeStructure.desktop";
145  foreach (QString pluginDesktopFile, defaultBackends) {
146  QString path = KGlobal::dirs()->findResource("services", pluginDesktopFile);
147  if (path.isEmpty()) {
148  kWarning() << "Could not find default plugin desktop file: " << pluginDesktopFile;
149  continue;
150  }
151 
152  // check if service is loaded from trader
153  KService::Ptr service = KSharedPtr<KService>(new KService(path));
154  KPluginInfo *info = new KPluginInfo(service);
155  bool found = false;
156  foreach (KPluginInfo offerInfo, offerInfos) {
157  if (info->property(QLatin1String("X-Rocs-DataStructureIdentifier")).toString()
158  == offerInfo.property(QLatin1String("X-Rocs-DataStructureIdentifier")).toString())
159  {
160  found = true;
161  break;
162  }
163  }
164  if (!found) {
165  kWarning() << "Backend manager falls back to manually load structure"
166  << info->property(QLatin1String("X-Rocs-DataStructureIdentifier")).toString()
167  << "The structure was not found in the service cache.";
168  offers.append(service);
169  }
170  delete info;
171  }
172 
173  // set up found backends
174  _pluginInfo = KPluginInfo::fromServices(offers);
175  foreach (KService::Ptr service, offers) {
176  kDebug() << "set up backend " << service->property(QLatin1String("X-Rocs-DataStructureIdentifier")).toString();
177  QString error;
178  KPluginFactory *factory = KPluginLoader(service->library()).factory();
179 
180  if (!factory) {
181  kError(5001) << "KPluginFactory could not load the plugin:" << service->library();
182  continue;
183  }
184 
185  KPluginInfo *info = new KPluginInfo(service);
186  DataStructureBackendInterface *plugin = factory->create<DataStructureBackendInterface>(_parent);
187 
188  if (plugin) {
189  KPluginInfo *info = new KPluginInfo(service);
190  QString identifier = info->property(QLatin1String("X-Rocs-DataStructureIdentifier")).toString();
191  if (identifier.isEmpty()) {
192  identifier = info->name();
193  kWarning() << "No data structure backend identifier exists for plugin " << identifier << ", using its name.";
194  }
195  _pluginList.insert(identifier, plugin);
196  info->setPluginEnabled(true);
197  continue;
198  } else {
199  kError() << "Error while loading data structure backend \"" << info->name();
200  }
201  }
202 
203  // at least one data structure plugin is required
204  if (_pluginList.isEmpty()) {
205  kError() << "No backend found, cannot set active data structure backend.";
206  return;
207  }
208 
209  QHash<QString, DataStructureBackendInterface*>::const_iterator iter = _pluginList.constBegin();
210  while (iter != _pluginList.constEnd()) {
211  if (iter.value()->internalName() == QLatin1String("Graph")){
212  _currentPlugin = iter.value();
213  return;
214  }
215  ++iter;
216  }
217 
218  // set last plugin, if "Graph" was not found
219  _currentPlugin = _pluginList.values().last();
220  }
221 };
222 
223 
224 DataStructureBackendManager::DataStructureBackendManager()
225  : d(new DataStructureBackendManagerPrivate(this))
226 {
227 }
228 
229 DataStructureBackendManager::~DataStructureBackendManager()
230 {
231 }
232 
233 DataStructureBackendManager & DataStructureBackendManager::self()
234 {
235  static DataStructureBackendManager instance;
236  instance.d->lazyInit();
237  return instance;
238 }
239 
240 void DataStructureBackendManager::setBackend(const QString &pluginIdentifier)
241 {
242  DataStructureBackendInterface* plugin = d->backend(pluginIdentifier);
243  if (!plugin) {
244  kError() << "Could not set \"" << pluginIdentifier << "\" as current backend, aborting.";
245  return;
246  }
247  if (d->_currentPlugin && pluginIdentifier == d->_currentPlugin->internalName()) {
248  return;
249  }
250 
251  d->setActivePlugin(pluginIdentifier);
252  emit backendChanged(pluginIdentifier);
253 }
254 
255 DataStructurePtr DataStructureBackendManager::createDataStructure(const DataStructurePtr dataStructure, Document *parent)
256 {
257  return d->convertDataStructureToActiveBackend(dataStructure, parent);
258 }
259 
260 DataStructurePtr DataStructureBackendManager::createDataStructure(Document *parent, const QString &pluginName)
261 {
262  return d->createDataStructure(parent, pluginName);
263 }
264 
265 KPluginInfo DataStructureBackendManager::backendInfo(DataStructureBackendInterface *plugin) const
266 {
267  return d->pluginInfo(plugin);
268 }
269 
270 const QStringList DataStructureBackendManager::backends() const
271 {
272  return d->_pluginList.keys();
273 }
274 
275 DataStructureBackendInterface * DataStructureBackendManager::activeBackend() const
276 {
277  return d->_currentPlugin;
278 }
279 
280 DataStructureBackendInterface * DataStructureBackendManager::backend(const QString &internalName) const
281 {
282  return d->backend(internalName);
283 }
284 
285 QGraphicsItem * DataStructureBackendManager::dataItem(DataPtr data) const
286 {
287  if (DataStructureBackendInterface *plg = data->dataStructure()->document()->backend()) {
288  return plg->dataItem(data);
289  }
290  return d->_currentPlugin->dataItem(data);
291 }
292 
293 QGraphicsItem * DataStructureBackendManager::pointerItem(PointerPtr pointer) const
294 {
295  if (DataStructureBackendInterface *plg = pointer->dataStructure()->document()->backend()) {
296  return plg->pointerItem(pointer);
297  }
298  return d->_currentPlugin->pointerItem(pointer);;
299 }
300 
301 QLayout * DataStructureBackendManager::pointerExtraProperties(PointerPtr pointer, QWidget *parent) const
302 {
303  if (DataStructureBackendInterface *plg = pointer->dataStructure()->document()->backend()) {
304  return plg->pointerExtraProperties(pointer, parent);
305  }
306  return d->_currentPlugin->pointerExtraProperties(pointer, parent);
307 }
308 
309 QLayout * DataStructureBackendManager::dataStructureExtraProperties(DataStructurePtr dataStructure, QWidget *parent) const
310 {
311  if (DataStructureBackendInterface *plg = dataStructure->document()->backend()) {
312  return plg->dataStructureExtraProperties(dataStructure, parent);
313  }
314  return d->_currentPlugin->dataStructureExtraProperties(dataStructure, parent);
315 }
316 
317 QLayout * DataStructureBackendManager::dataExtraProperties(DataPtr data, QWidget *parent) const
318 {
319  if (DataStructureBackendInterface *plg = data->dataStructure()->document()->backend()) {
320  return plg->dataExtraProperties(data, parent);
321  }
322  return d->_currentPlugin->dataExtraProperties(data, parent);
323 }
DataStructureBackendManager::backends
const QStringList backends() const
Returns list of loaded backends.
Definition: DataStructureBackendManager.cpp:270
QWidget
DataStructureBackendManager::activeBackend
DataStructureBackendInterface * activeBackend() const
Returns the currently active data structure backend.
Definition: DataStructureBackendManager.cpp:275
DataStructureBackendManager::pointerItem
QGraphicsItem * pointerItem(PointerPtr pointer) const
Generates graphics item for represenation of pointer at graph scene based on data structure backend o...
Definition: DataStructureBackendManager.cpp:293
DataStructurePtr
boost::shared_ptr< DataStructure > DataStructurePtr
Definition: CoreTypes.h:38
QLayout
QGraphicsItem
Data.h
DataStructureBackendManager::self
static DataStructureBackendManager & self()
Returns self reference to backend manager.
Definition: DataStructureBackendManager.cpp:233
DataStructureBackendInterface.h
DataStructureBackendManager::dataItem
QGraphicsItem * dataItem(DataPtr data) const
Generates graphics item for represenation of data at graph scene based on data structure backend of t...
Definition: DataStructureBackendManager.cpp:285
PointerPtr
boost::shared_ptr< Pointer > PointerPtr
Definition: CoreTypes.h:35
DataStructure.h
QString::insert
QString & insert(int position, QChar ch)
QHash::constEnd
const_iterator constEnd() const
QHash< QString, DataStructureBackendInterface * >
QObject
QString::isEmpty
bool isEmpty() const
DataStructureBackendInterface::createDataStructure
virtual DataStructurePtr createDataStructure(Document *parent)=0
DataStructureBackendManager::dataStructureExtraProperties
QLayout * dataStructureExtraProperties(DataStructurePtr dataStructure, QWidget *parent) const
Create widgets for backend specific data structure properties.
Definition: DataStructureBackendManager.cpp:309
QString
QStringList
QHash::value
const T value(const Key &key) const
Document
Definition: Document.h:41
QHash::constBegin
const_iterator constBegin() const
DataStructureBackendManager::setBackend
void setBackend(const QString &pluginIdentifier)
Change the active backend.
Definition: DataStructureBackendManager.cpp:240
QLatin1String
Pointer.h
DataPtr
boost::shared_ptr< Data > DataPtr
Definition: CoreTypes.h:34
DataStructureBackendManager::backendChanged
void backendChanged(const QString &pluginName)
Emitted if the active backend is changed.
QHash::values
QList< T > values() const
DataStructureBackendManager::createDataStructure
DataStructurePtr createDataStructure(Document *parent, const QString &pluginName=QString())
TODO change this method: it is not clear how the parent document is registered; the creation function...
Definition: DataStructureBackendManager.cpp:260
QString::fromLatin1
QString fromLatin1(const char *str, int size)
DataStructureBackendInterface
Definition: DataStructureBackendInterface.h:42
DataStructureBackendManager::dataExtraProperties
QLayout * dataExtraProperties(DataPtr data, QWidget *parent) const
Create widgets for backend specific data properties.
Definition: DataStructureBackendManager.cpp:317
DataStructureBackendManager::pointerExtraProperties
QLayout * pointerExtraProperties(PointerPtr pointer, QWidget *parent) const
Create widgets for backend specific pointer properties.
Definition: DataStructureBackendManager.cpp:301
DataStructureBackendManager.h
DataStructureBackendManager
This singelton class provides access to all available data structure backends.
Definition: DataStructureBackendManager.h:43
DataStructureBackendManager::backendInfo
KPluginInfo backendInfo(DataStructureBackendInterface *plugin) const
Returns KPluginInfo object representing the plugin information for plugin.
Definition: DataStructureBackendManager.cpp:265
DataStructureBackendManager::backend
DataStructureBackendInterface * backend(const QString &internalName) const
Returns data structure backend identified by its identifier internalName.
Definition: DataStructureBackendManager.cpp:280
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:16:18 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

rocs/RocsCore

Skip menu "rocs/RocsCore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal