• 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.12
  • kdeedu
  • rocs
  • RocsCore
Document.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Rocs.
3  Copyright 2008-2011 Tomaz Canabrava <tomaz.canabrava@gmail.com>
4  Copyright 2008 Ugo Sangiori <ugorox@gmail.com>
5  Copyright 2010-2011 Wagner Reck <wagner.reck@gmail.com>
6  Copyright 2011-2013 Andreas Cord-Landwehr <cola@uni-paderborn.de>
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 2 of
11  the License, or (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #include "Document.h"
23 #include "DocumentManager.h"
24 #include "DataStructure.h"
25 #include "Data.h"
26 #include "Pointer.h"
27 #include "PointerType.h"
28 #include "DataType.h"
29 #include "DataStructureBackendManager.h"
30 #include "DataStructureBackendInterface.h"
31 #include "QtScriptBackend.h"
32 #include "ConcurrentHelpClasses.h"
33 
34 #include <KStandardDirs>
35 #include <KSaveFile>
36 #include <KDebug>
37 
38 #include <QString>
39 #include <QByteArray>
40 #include <QSvgRenderer>
41 #include <QMap>
42 
43 class DocumentPrivate
44 {
45 public:
46  DocumentPrivate()
47  : _left(0)
48  , _right(0)
49  , _top(0)
50  , _bottom(0)
51  { }
52 
53  QString _lastSavedDocumentPath;
54  QString _name;
55  qreal _left;
56  qreal _right;
57  qreal _top;
58  qreal _bottom;
59  bool _modified;
60  DataStructurePtr _activeDataStructure;
61  QPointer<DataStructureBackendInterface> _backend;
62  QtScriptBackend* _engineBackend;
63  QList< DataStructurePtr > _dataStructures;
64 
65  // data and pointer types
66  QMap<int, DataTypePtr> _dataTypes; // list of data types
67  QMap<int, PointerTypePtr> _pointerTypes; // list of pointer types
68  DataTypePtr _groupType;
69 
70  QString _iconPackage; // available icons for data types
71 };
72 
73 
74 
75 Document::Document(const QString& name, QObject *parent)
76  : QObject(parent)
77  , d(new DocumentPrivate())
78 {
79  d->_name = name;
80  d->_engineBackend = new QtScriptBackend(this);
81  d->_backend = DataStructureBackendManager::self().activeBackend();
82  d->_modified = false;
83 
84  d->_iconPackage = KGlobal::dirs()->locate("appdata", "iconpacks/default.svg");
85  if (!DocumentManager::self().sharedRenderer(d->_iconPackage)) {
86  DocumentManager::self().registerSharedRenderer(d->_iconPackage);
87  }
88 
89  // default types
90  d->_dataTypes.insert(0, DataType::create(this, 0));
91  d->_pointerTypes.insert(0, PointerType::create(this, 0));
92 
93  kDebug() << "Construct Graph Document of type : " << d->_backend->name();
94 }
95 
96 void Document::setModified(const bool mod)
97 {
98  d->_modified = mod;
99 }
100 
101 void Document::changeBackend()
102 {
103  cleanUpBeforeConvert();
104  d->_backend = DataStructureBackendManager::self().activeBackend();
105 
106  // create list of existing data structures, then convert them one by one
107  QList<DataStructurePtr> dataStructures = QList<DataStructurePtr>(d->_dataStructures);
108  d->_dataStructures.clear();
109 
110  for (int i = 0; i < dataStructures.count(); ++i) {
111  DataStructurePtr newDataStructure = addDataStructure(
112  DataStructureBackendManager::self().createDataStructure(dataStructures.at(i), this));
113  // remove origin data structure
114  dataStructures[i]->remove();
115  }
116 }
117 
118 Document::~Document()
119 {
120  clear();
121  delete d->_engineBackend;
122 }
123 
124 int Document::registerDataType(const QString& name, int identifier)
125 {
126  // create new identifier if identifier is already in use or 0
127  if (identifier==0 || d->_dataTypes.contains(identifier)) {
128  QList<int> usedIdentifier = d->_dataTypes.keys();
129  qSort(usedIdentifier);
130  identifier = usedIdentifier.last() + 1;
131  }
132 
133  DataTypePtr dataType = DataType::create(this, identifier);
134  dataType->setName(name);
135 
136  d->_dataTypes.insert(identifier, dataType);
137 
138  emit(dataTypeCreated(identifier));
139  return identifier;
140 }
141 
142 int Document::registerPointerType(const QString& name, int identifier)
143 {
144  // create new identifier if identifier is already in use or 0
145  if (identifier==0 || d->_pointerTypes.contains(identifier)) {
146  QList<int> usedIdentifier = d->_pointerTypes.keys();
147  qSort(usedIdentifier);
148  identifier = usedIdentifier.last() + 1;
149  }
150 
151  PointerTypePtr pointerType = PointerType::create(this, identifier);
152  pointerType->setName(name);
153 
154  d->_pointerTypes.insert(identifier, pointerType);
155 
156  emit(pointerTypeCreated(identifier));
157  return identifier;
158 }
159 
160 QList<int> Document::dataTypeList() const
161 {
162  return d->_dataTypes.keys();
163 }
164 
165 QList<int> Document::pointerTypeList() const
166 {
167  return d->_pointerTypes.keys();
168 }
169 
170 QString Document::iconPackage() const
171 {
172  return d->_iconPackage;
173 }
174 
175 bool Document::removeDataType(int identifier)
176 {
177  Q_ASSERT(d->_dataTypes.contains(identifier));
178 
179  emit(dataTypeRemoved(identifier));
180  if (d->_dataTypes.contains(identifier)) {
181  d->_dataTypes[identifier]->remove();
182  }
183  return d->_dataTypes.remove(identifier) > 0;
184 }
185 
186 bool Document::removePointerType(int identifier)
187 {
188  Q_ASSERT(d->_pointerTypes.contains(identifier));
189 
190  emit(pointerTypeRemoved(identifier));
191  if (d->_pointerTypes.contains(identifier)) {
192  d->_pointerTypes[identifier]->remove();
193  }
194  return d->_pointerTypes.remove(identifier) > 0;
195 }
196 
197 DataTypePtr Document::dataType(int identifier) const
198 {
199  Q_ASSERT(d->_dataTypes.contains(identifier));
200 
201  if (!d->_dataTypes.contains(identifier)) {
202  return DataTypePtr();
203  }
204  return d->_dataTypes[identifier];
205 }
206 
207 PointerTypePtr Document::pointerType(int identifier) const
208 {
209  Q_ASSERT(d->_pointerTypes.contains(identifier));
210 
211  if (!d->_pointerTypes.contains(identifier)) {
212  return PointerTypePtr();
213  }
214  return d->_pointerTypes[identifier];
215 }
216 
217 int Document::groupType()
218 {
219  if (!d->_groupType) {
220  int typeId = registerDataType("Subdatastructure");
221  d->_groupType = dataType(typeId);
222  return typeId;
223  }
224  return d->_groupType->identifier();
225 }
226 
227 QList< DataStructurePtr >& Document::dataStructures() const
228 {
229  return d->_dataStructures;
230 }
231 
232 bool Document::isValidIdentifier(const QString& identifier)
233 {
234  QRegExp validator("(^([a-z]|[A-Z])+([0-9]|[a-z]|[A-Z]|_)*$)");
235  return (validator.indexIn(identifier) != -1);
236 }
237 
238 
239 QtScriptBackend * Document::engineBackend() const
240 {
241  return d->_engineBackend;
242 }
243 
244 // Sets the current file name of the DataStructure Collection
245 void Document::setName(const QString& name)
246 {
247  d->_name = name;
248  d->_modified = true;
249  emit nameChanged(name);
250 }
251 
252 // Gets the name of the DataStructure
253 QString Document::name() const
254 {
255  return d->_name;
256 }
257 
258 void Document::updateGraphics(DataTypePtr dataType)
259 {
260  foreach(const DataStructurePtr &structure, d->_dataStructures) {
261  QtConcurrent::blockingMap(structure->dataList(dataType->identifier()), DataGraphicsUpdated());
262  }
263 }
264 
265 void Document::updateGraphics(PointerTypePtr pointerType)
266 {
267  foreach(const DataStructurePtr &structure, d->_dataStructures) {
268  QtConcurrent::blockingMap(structure->pointers(pointerType->identifier()), PointerGraphicsUpdated());
269  }
270 }
271 
272 QRectF Document::sceneRect() const
273 {
274  return QRectF(d->_left, d->_top, d->_right - d->_left, d->_bottom - d->_top);
275 }
276 
277 void Document::updateSceneRect(const QPointF &position)
278 {
279  if (sceneRect().contains(position) == true) {
280  //TODO If this happens, we must shrink the rectangular area where the nodes
281  // are positioned. Though it looks that one of the only efficient ways to do this
282  // is to implement a QuadTree for the scene rect an track the positions of nodes.
283  // Especially for corner cases (moving a node at the border of the rect with epsilon small
284  // wobbling) we must take a carefull look to guarantee fast processing.
285  return;
286  }
287  if (position.x() < d->_left) {
288  d->_left = position.x();
289  }
290  if (position.x() > d->_right) {
291  d->_right = position.x();
292  }
293  if (position.y() < d->_top) {
294  d->_top = position.y();
295  }
296  if (position.y() > d->_bottom) {
297  d->_bottom = position.y();
298  }
299 
300  emit sceneRectChanged(sceneRect());
301 }
302 
303 bool Document::isModified() const
304 {
305  return d->_modified;
306 }
307 
308 void Document::cleanUpBeforeConvert()
309 {
310  foreach(DataStructurePtr ds, d->_dataStructures) {
311  ds->cleanUpBeforeConvert();
312  }
313 }
314 
315 void Document::setActiveDataStructure(int index)
316 {
317  if (index >= 0 && index < d->_dataStructures.length()) {
318  d->_activeDataStructure = d->_dataStructures.at(index);
319  emit activeDataStructureChanged(d->_activeDataStructure);
320  d->_modified = true;
321  }
322 }
323 
324 void Document::setActiveDataStructure(DataStructurePtr g)
325 {
326  if (d->_dataStructures.indexOf(g) != -1) {
327  d->_activeDataStructure = g;
328  emit activeDataStructureChanged(g);
329  d->_modified = true;
330  }
331 }
332 
333 DataStructurePtr Document::addDataStructure(const QString& name)
334 {
335 kDebug() << "add structure";
336  DataStructurePtr dataStructure = DataStructureBackendManager::self().createDataStructure(
337  this, d->_backend->internalName());
338  dataStructure->setName(name);
339  return addDataStructure(dataStructure);
340 }
341 
342 DataStructurePtr Document::addDataStructure(DataStructurePtr dataStructure)
343 {
344  // find unused name
345  QList<QString> usedNames;
346  foreach(DataStructurePtr ds, d->_dataStructures) {
347  usedNames.append(ds->name());
348  }
349  // Change unique data structure name if the currently set one is not ok.
350  // For at least one i in the following range, the name is not used, yet.
351  QString uniqueName = dataStructure->name();
352  if (uniqueName.isEmpty() || usedNames.contains(uniqueName)) {
353  for (int i = 0; i < dataStructures().length() + 1; ++i) {
354  uniqueName = QString("%1%2").arg(d->_backend->internalName()).arg(i);
355  if (!usedNames.contains(uniqueName)) {
356  break;
357  }
358  }
359  }
360 
361  dataStructure->setName(uniqueName);
362  d->_dataStructures.append(dataStructure);
363  d->_activeDataStructure = dataStructure;
364  d->_modified = true;
365 
366  connect(dataStructure.get(), SIGNAL(changed()), this, SLOT(setModified()));
367  connect(dataStructure.get(), SIGNAL(dataPositionChanged(QPointF)), this, SLOT(updateSceneRect(QPointF)));
368 
369  emit dataStructureCreated(dataStructure);
370  emit dataStructureListChanged();
371 
372  return dataStructure;
373 }
374 
375 void Document::save()
376 {
377  Q_ASSERT(!fileUrl().isEmpty());
378  DocumentManager::self().saveDocumentAs(this, KUrl::fromLocalFile(fileUrl()));
379 }
380 
381 void Document::saveAs(const QString& fileUrl)
382 {
383  DocumentManager::self().saveDocumentAs(this, KUrl::fromLocalFile(fileUrl));
384 }
385 
386 QString Document::fileUrl() const
387 {
388  return d->_lastSavedDocumentPath;
389 }
390 
391 void Document::setFileUrl(const KUrl& fileUrl)
392 {
393  d->_lastSavedDocumentPath = fileUrl.toLocalFile();
394 }
395 
396 void Document::remove(DataStructurePtr dataStructure)
397 {
398  d->_dataStructures.removeOne(dataStructure);
399  if (d->_dataStructures.count() != 0) {
400  setActiveDataStructure(d->_dataStructures.count() - 1);
401  } else {
402  d->_activeDataStructure.reset();
403  }
404  d->_modified = true;
405  emit dataStructureListChanged();
406 }
407 
408 void Document::clear()
409 {
410  // remove data structures
411  d->_activeDataStructure.reset();
412  foreach (const DataStructurePtr &dataStructure, d->_dataStructures) {
413  dataStructure->remove();
414  }
415  d->_dataStructures.clear();
416 
417  // remove types
418  for (QMap<int,DataTypePtr>::const_iterator iter= d->_dataTypes.constBegin(); iter != d->_dataTypes.constEnd(); ++iter) {
419  emit(dataTypeRemoved(iter.key()));
420  d->_dataTypes[iter.key()]->remove();
421  }
422  d->_dataTypes.clear();
423 
424  for (QMap<int,PointerTypePtr>::const_iterator iter= d->_pointerTypes.constBegin(); iter != d->_pointerTypes.constEnd(); ++iter) {
425  emit(pointerTypeRemoved(iter.key()));
426  d->_pointerTypes[iter.key()]->remove();
427  }
428  d->_pointerTypes.clear();
429 }
430 
431 DataStructurePtr Document::activeDataStructure() const
432 {
433  return d->_activeDataStructure;
434 }
435 
436 DataStructureBackendInterface * Document::backend() const
437 {
438  return d->_backend;
439 }
440 
441 void Document::setBackend(const QString &pluginIdentifier)
442 {
443  DataStructureBackendInterface * plugin = DataStructureBackendManager::self().backend(pluginIdentifier);
444  if (plugin) {
445  d->_backend = plugin;
446  }
447 }
DataType.h
Document::removeDataType
bool removeDataType(int dataType)
removes this data type and all data elements of this type
Definition: Document.cpp:175
Document::engineBackend
QtScriptBackend * engineBackend() const
Definition: Document.cpp:239
Document::registerDataType
int registerDataType(const QString &name, int identifier=0)
Register new type for data elements.
Definition: Document.cpp:124
ConcurrentHelpClasses.h
DataStructureBackendManager::activeBackend
DataStructureBackendInterface * activeBackend() const
Returns the currently active data structure backend.
Definition: DataStructureBackendManager.cpp:275
Document::sceneRectChanged
void sceneRectChanged(const QRectF &)
DocumentManager.h
DocumentManager::self
static DocumentManager & self()
Definition: DocumentManager.cpp:57
PointerTypePtr
boost::shared_ptr< PointerType > PointerTypePtr
Definition: CoreTypes.h:37
Document::dataTypeCreated
void dataTypeCreated(int identifier)
DataStructurePtr
boost::shared_ptr< DataStructure > DataStructurePtr
Definition: CoreTypes.h:38
Document::changeBackend
void changeBackend()
Change data structure backend of this document to currently active backend.
Definition: Document.cpp:101
Document::~Document
~Document()
Definition: Document.cpp:118
Document::setModified
void setModified(const bool mod=true)
Definition: Document.cpp:96
Document::updateSceneRect
void updateSceneRect(const QPointF &position)
Updates scene rect according to given position.
Definition: Document.cpp:277
Document::setName
void setName(const QString &name)
Definition: Document.cpp:245
QtScriptBackend.h
QObject
Data.h
DataStructureBackendManager::self
static DataStructureBackendManager & self()
Returns self reference to backend manager.
Definition: DataStructureBackendManager.cpp:233
DataStructureBackendInterface.h
Document.h
PointerGraphicsUpdated
Definition: ConcurrentHelpClasses.h:63
DocumentManager::saveDocumentAs
void saveDocumentAs(Document *document, const KUrl &documentUrl)
Save graph document document at url documentUrl.
Definition: DocumentManager.cpp:263
Document::isModified
bool isModified() const
Definition: Document.cpp:303
Document::updateGraphics
void updateGraphics(DataTypePtr dataType)
Definition: Document.cpp:258
DataStructure.h
Document::setBackend
void setBackend(const QString &pluginIdentifier)
Set data structure plugin for this document.
Definition: Document.cpp:441
Document::cleanUpBeforeConvert
virtual void cleanUpBeforeConvert()
clear data that only is useful for a type of data structure and that cannot be converted to others fr...
Definition: Document.cpp:308
Document::addDataStructure
DataStructurePtr addDataStructure(const QString &name=QString())
Add data structure to graph document with name name.
Definition: Document.cpp:333
Document::iconPackage
QString iconPackage() const
Definition: Document.cpp:170
Document::registerPointerType
int registerPointerType(const QString &name, int identifier=0)
Register new type for pointers.
Definition: Document.cpp:142
Document::activeDataStructure
DataStructurePtr activeDataStructure() const
Definition: Document.cpp:431
Document::pointerTypeCreated
void pointerTypeCreated(int identifier)
Document::setActiveDataStructure
void setActiveDataStructure(int index)
Sets the active data structure of graph document with index index in the data structure list...
Definition: Document.cpp:315
Document::dataStructureListChanged
void dataStructureListChanged()
DataType::create
static DataTypePtr create(Document *document, int identifier)
Create data type objects.
Definition: DataType.cpp:63
Document::clear
void clear()
Remove everything contained at this document.
Definition: Document.cpp:408
QtScriptBackend
This class provides the script backend for script executions.
Definition: QtScriptBackend.h:40
Document::save
void save()
Save graph document in former file.
Definition: Document.cpp:375
Document::activeDataStructureChanged
void activeDataStructureChanged(DataStructurePtr g)
Document::pointerType
PointerTypePtr pointerType(int pointerType) const
Definition: Document.cpp:207
Document::remove
void remove(DataStructurePtr dataStructure)
Definition: Document.cpp:396
Document::dataStructures
QList< DataStructurePtr > & dataStructures() const
Definition: Document.cpp:227
Pointer.h
Document::pointerTypeRemoved
void pointerTypeRemoved(int identifier)
Document::pointerTypeList
QList< int > pointerTypeList() const
Getter for all registered pointer types.
Definition: Document.cpp:165
PointerType::create
static PointerTypePtr create(Document *document, int identifier)
Create pointer type objects.
Definition: PointerType.cpp:62
Document::dataType
DataTypePtr dataType(int dataType) const
Definition: Document.cpp:197
Document::dataStructureCreated
void dataStructureCreated(DataStructurePtr g)
PointerType.h
DataTypePtr
boost::shared_ptr< DataType > DataTypePtr
Definition: CoreTypes.h:36
Document::groupType
int groupType()
Returns data type for element groups.
Definition: Document.cpp:217
Document::dataTypeList
QList< int > dataTypeList() const
Getter for all registered data types.
Definition: Document.cpp:160
Document::backend
DataStructureBackendInterface * backend() const
Definition: Document.cpp:436
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
Document::nameChanged
void nameChanged(QString name)
DataStructureBackendInterface
Definition: DataStructureBackendInterface.h:42
Document::name
QString name() const
Definition: Document.cpp:253
Document::removePointerType
bool removePointerType(int pointerType)
Removes this pointer type and all data elements of this type.
Definition: Document.cpp:186
DataGraphicsUpdated
Definition: ConcurrentHelpClasses.h:71
Document::isValidIdentifier
static bool isValidIdentifier(const QString &identifier)
Evaluates given string and returns true if identifier is valid, otherwise returns false...
Definition: Document.cpp:232
Document::fileUrl
QString fileUrl() const
Definition: Document.cpp:386
Document::sceneRect
QRectF sceneRect() const
Definition: Document.cpp:272
Document::dataTypeRemoved
void dataTypeRemoved(int identifier)
DataStructureBackendManager.h
DocumentManager::registerSharedRenderer
QSvgRenderer * registerSharedRenderer(const QString &iconPackage)
Definition: DocumentManager.cpp:293
Document::Document
Document(const QString &name, QObject *parent=0)
Definition: Document.cpp:75
Document::saveAs
void saveAs(const QString &fileUrl)
Save graph document under the given fileUrl.
Definition: Document.cpp:381
Document::setFileUrl
void setFileUrl(const KUrl &fileUrl)
Set file path used for saving.
Definition: Document.cpp:391
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-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:42:25 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
  • kstars
  • libkdeedu
  •   keduvocdocument
  • 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