• 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
  • LoadSave
RocsGraphFileFormatPlugin.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Rocs.
3  Copyright 2010-2011 Tomaz Canabrava <tomaz.canabrava@gmail.com>
4  Copyright 2010 Wagner Reck <wagner.reck@gmail.com>
5  Copyright 2012 Andreas Cord-Landwehr <cola@uni-paderborn.de>
6 
7  This program is free software; you can redistribute it and/or
8  modify it under the terms of the GNU General Public License as
9  published by the Free Software Foundation; either version 2 of
10  the License, or (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #include "RocsGraphFileFormatPlugin.h"
22 #include "Document.h"
23 #include <KAboutData>
24 #include <KGenericFactory>
25 #include <KUrl>
26 #include <KSaveFile>
27 #include <QFile>
28 #include <DataStructure.h>
29 #include <Data.h>
30 #include <Pointer.h>
31 #include <DataType.h>
32 #include <PointerType.h>
33 #include <Modifiers/Topology.h>
34 #include <DataStructureBackendManager.h>
35 #include <DataStructureBackendInterface.h>
36 
37 static const KAboutData pluginAboutData("rocs_rocsgraphfileformat",
38  0,
39  ki18nc("@title Displayed plugin name", "Rocs Graph File Backend"),
40  "0.2",
41  ki18n("Read and write Rocs Graph Files"),
42  KAboutData::License_GPL_V2);
43 
44 class RocsGraphFileFormatPluginPrivate
45 {
46 public:
47  RocsGraphFileFormatPluginPrivate() :
48  _buffer()
49  {}
50 
51  QString _buffer;
52 };
53 
54 
55 RocsGraphFileFormatPlugin::RocsGraphFileFormatPlugin(QObject *parent)
56  : GraphFilePluginInterface(&pluginAboutData, parent)
57 {
58  d = new RocsGraphFileFormatPluginPrivate;
59 }
60 
61 
62 RocsGraphFileFormatPlugin::~RocsGraphFileFormatPlugin()
63 {
64 }
65 
66 
67 const QStringList RocsGraphFileFormatPlugin::extensions() const
68 {
69  return QStringList()
70  << i18n("*.graph|Rocs Graph File Format") + '\n';
71 }
72 
73 
74 void RocsGraphFileFormatPlugin::readFile()
75 {
76  // This is a kind of a hack and should be solved better:
77  // Document has no setter for the current plugin but on creation it gets created
78  // with the plugin that is currently set as DataStructureBackendManager::actualPlugin.
79  DataStructureBackendManager::self().activeBackend();
80  Document* document = new Document("Untitled");
81 
82  QFile fileHandle(file().toLocalFile());
83  document->setFileUrl(file());
84  if (!fileHandle.open(QIODevice::ReadOnly | QIODevice::Text)) {
85  setError(CouldNotOpenFile, i18n("Could not open file \"%1\" in read mode: %2", file().toLocalFile(), fileHandle.errorString()));
86  delete document;
87  return;
88  }
89  DataStructurePtr tmpDataStructure;
90  QObject *tmpObject = 0;
91  QMap<int, DataPtr> dataMap;
92 
93  QTextStream in(&fileHandle);
94  in.setCodec("UTF-8");
95 
96  while (!in.atEnd()) {
97  QString str = in.readLine().simplified();
98 
99  if (str.startsWith('#')) {
100  continue;
101  } else if (str.startsWith(QLatin1String("[Document Properties]"))) {
102 
103  QString dataLine = in.readLine().simplified();
104  while (!in.atEnd() && !dataLine.isEmpty()) {
105  if (dataLine.startsWith(QLatin1String("DataStructurePlugin :"))) {
106  // set plugin by unique plugin identifier
107  QString pluginIdentifier = dataLine.section(' ', 2);
108  document->setBackend(pluginIdentifier);
109  } else if (!dataLine.isEmpty()) {
110  break; // go to the last if and finish populating.
111  }
112  dataLine = in.readLine().simplified();
113  }
114  tmpObject = document;
115  } else if (str.startsWith(QLatin1String("[DataStructure"))) {
116  QString gName = str.section(' ', 1, 1);
117  gName.remove(']');
118  tmpDataStructure = document->addDataStructure(gName.toAscii());
119  tmpObject = tmpDataStructure.get();
120  }
121 
122  // plugin specific settings for data structure
123  else if (str.startsWith(QLatin1String("X-plugin-")) && tmpObject && dynamic_cast<DataStructure*>(tmpObject)) {
124  QString identifier = str.section(':', 0, 0).trimmed().remove("X-plugin-");
125  QString property = str.section(':', 1, 1).trimmed();
126  dynamic_cast<DataStructure*>(tmpObject)->getDataStructure()->setPluginProperty(identifier, property);
127  }
128 
129  else if (str.startsWith(QLatin1String("[DataType"))) {
130  QString identifier = str.section(' ', 1);
131  identifier.remove(']');
132  int tmpDataTypeId = identifier.toInt();
133  if (tmpDataTypeId != 0) { // if == 0, this is default and default is automatically created
134  tmpDataTypeId = document->registerDataType(QString(), identifier.toInt());
135  if (tmpDataTypeId != identifier.toInt()) {
136  kWarning() << "Could not register already used data type << " << identifier.toInt()
137  << ": use identifier " << tmpDataTypeId << " instead.";
138  }
139  }
140  DataTypePtr tmpDataType = document->dataType(tmpDataTypeId);
141 
142  QString dataLine = in.readLine().simplified();
143  while (!in.atEnd() && !dataLine.isEmpty()) {
144  if (dataLine.startsWith(QLatin1String("Name :"))) tmpDataType->setName(dataLine.section(' ', 2));
145  else if (dataLine.startsWith(QLatin1String("IconName :"))) {
146  QString iconString = dataLine.section(' ', 2);
147  // remove rocs_ prefix
148  tmpDataType->setIcon(iconString.remove("rocs_"));
149  } else if (dataLine.startsWith(QLatin1String("Properties :"))) {
150  QStringList properties = dataLine.section(' ', 2).split(',');
151  foreach(const QString& property, properties) {
152  if (!property.isEmpty()) {
153  tmpDataType->addProperty(property.section('=',0,0),property.section('=',1));
154  }
155  }
156  } else if (dataLine.startsWith(QLatin1String("Color :"))) tmpDataType->setDefaultColor(QColor(dataLine.section(' ', 2)));
157  else if (!dataLine.isEmpty()) break; // go to the last if and finish populating.
158  dataLine = in.readLine().simplified();
159  }
160  }
161 
162  else if (str.startsWith(QLatin1String("[PointerType"))) {
163  QString identifier = str.section(' ', 1);
164  identifier.remove(']');
165  int tmpPointerTypeId = identifier.toInt();
166  if (tmpPointerTypeId != 0) { // if == 0, this is default and default is automatically created
167  tmpPointerTypeId = document->registerPointerType(QString(), identifier.toInt());
168  if (tmpPointerTypeId != identifier.toInt()) {
169  kWarning() << "Could not register already used pointer type << " << identifier.toInt()
170  << ": use identifier " << tmpPointerTypeId << " instead.";
171  }
172  }
173  PointerTypePtr tmpPointerType = document->pointerType(tmpPointerTypeId);
174 
175  QString dataLine = in.readLine().simplified();
176  while (!in.atEnd() && !dataLine.isEmpty()) {
177  if (dataLine.startsWith(QLatin1String("Name :"))) {
178  tmpPointerType->setName(dataLine.section(' ', 2));
179  } else if (dataLine.startsWith(QLatin1String("Color :"))) {
180  tmpPointerType->setDefaultColor(QColor(dataLine.section(' ', 2)));
181  } else if (dataLine.startsWith(QLatin1String("Direction :"))) {
182  if (dataLine.section(' ', 2) == "bidirectional") {
183  tmpPointerType->setDirection(PointerType::Bidirectional);
184  } else if (dataLine.section(' ', 2) == "unidirectional") {
185  tmpPointerType->setDirection(PointerType::Unidirectional);
186  }
187  else {
188  kWarning() << "Direction unset, use default direction of this data type backend.";
189  }
190  } else if (dataLine.startsWith(QLatin1String("LineStyle :"))) {
191  tmpPointerType->setLineStyle(Qt::PenStyle(dataLine.section(' ', 2).toInt()));
192  } else if (dataLine.startsWith(QLatin1String("Properties :"))) {
193  QStringList properties = dataLine.section(' ', 2).split(',');
194  foreach(const QString& property, properties) {
195  if (!property.isEmpty()) {
196  tmpPointerType->addProperty(property.section('=',0,0),property.section('=',1));
197  }
198  }
199  } else if (!dataLine.isEmpty()) {
200  break; // go to the last if and finish populating.
201  }
202  dataLine = in.readLine().simplified();
203  }
204  }
205 
206  else if (str.startsWith(QLatin1String("[Data "))) {
207  DataPtr tmpData;
208 
209  QString dataLine = in.readLine().simplified();
210  int type = 0;
211  qreal posX = 0;
212  qreal posY = 0;
213  QString value = "";
214  QString color = "";
215  QString name = "";
216  while (!in.atEnd() && !dataLine.isEmpty()) {
217  if (dataLine.startsWith(QLatin1String("x :"))) posX = dataLine.section(' ', 2).toFloat();
218  else if (dataLine.startsWith(QLatin1String("y :"))) posY = dataLine.section(' ', 2).toFloat();
219  else if (dataLine.startsWith(QLatin1String("type :"))) type = dataLine.section(' ', 2).toInt();
220  else if (dataLine.startsWith(QLatin1String("value :"))) value = dataLine.section(' ', 2);
221  else if (dataLine.startsWith(QLatin1String("color :"))) color = dataLine.section(' ', 2);
222  else if (dataLine.startsWith(QLatin1String("name :"))) name = dataLine.section(' ', 2);
223  else if (!dataLine.isEmpty()) break; // go to the last if and finish populating.
224  dataLine = in.readLine().simplified();
225  }
226  if (document->dataTypeList().contains(type)) {
227  tmpData = tmpDataStructure->createData(name, type);
228  } else {
229  kDebug() << "Create data element of type 0, since type " << type << " was not registered.";
230  tmpData = tmpDataStructure->createData(name, 0);
231  }
232  if (tmpData) {
233  tmpData->setColor(color);
234  tmpData->setPos(posX, posY);
235 
236  // add to data element map
237  QString identifier = str.section(' ', 1);
238  identifier.remove(']');
239  dataMap.insert(identifier.toInt(), tmpData);
240  tmpObject = tmpData.get();
241  }
242  }
243 
244  else if (str.startsWith(QLatin1String("[Pointer "))) {
245  PointerPtr tmpPointer;
246  QString eName = str.section(' ', 1, 1);
247  eName.remove(']');
248 
249  QString nameFrom = eName.section("->", 0, 0);
250  QString nameTo = eName.section("->", 1, 1);
251 
252  QString dataLine = in.readLine().simplified();
253  int width = 0;
254  QString value = "";
255  int type = 0;
256  QString color = "";
257  while (!in.atEnd() && !dataLine.isEmpty()) {
258  if (dataLine.startsWith(QLatin1String("width :"))) width = dataLine.section(' ', 2).toInt();
259  else if (dataLine.startsWith(QLatin1String("value :"))) value = dataLine.section(' ', 2);
260  else if (dataLine.startsWith(QLatin1String("type :"))) type = dataLine.section(' ', 2).toInt();
261  else if (dataLine.startsWith(QLatin1String("color :"))) color = dataLine.section(' ', 2);
262  else if (!dataLine.isEmpty()) break; // go to the last if and finish populating.
263  dataLine = in.readLine().simplified();
264  }
265  if (document->pointerTypeList().contains(type)) {
266  tmpPointer = tmpDataStructure->createPointer(dataMap[nameFrom.toInt()],dataMap[nameTo.toInt()], type);
267  } else {
268  kDebug() << "Create pointer of type 0, since type " << type << " was not registered.";
269  tmpPointer = tmpDataStructure->createPointer(dataMap[nameFrom.toInt()],dataMap[nameTo.toInt()], 0);
270  }
271  if (tmpPointer) {
272  tmpPointer->setWidth(width);
273  tmpPointer->setColor(color);
274  tmpObject = tmpPointer.get();
275  }
276  }
277 
278  else if (str.startsWith(QLatin1String("[Group"))) {
279  /*QString gName = str.section(" ",1,1);
280  gName.remove(']');
281  tmpGroup = tmpDataStructure->addGroup(gName); */
282  }
283 
284  else if (str.contains(':')) {
285  QString propertyName = str.section(':', 0, 0).trimmed();
286  QString propertyValue = str.section(':', 1, 1).trimmed();
287  if (!propertyName.isEmpty()) {
288  tmpObject->setProperty(propertyName.toUtf8() , propertyValue);
289  }
290  }
291  }
292  setGraphDocument(document);
293  setError(None);
294 }
295 
296 void RocsGraphFileFormatPlugin::writeFile(Document &graph)
297 {
298  KSaveFile saveFile(!file().toLocalFile().endsWith(".graph") ? QString("%1.graph").arg(file().toLocalFile()) : file().toLocalFile());
299 
300  if (!saveFile.open()) {
301  setError(FileIsReadOnly, i18n("Could not open file \"%1\" in write mode: %2", file().fileName(), saveFile.errorString()));
302  return;
303  }
304 
305  QTextStream stream(&saveFile);
306  stream.setCodec("UTF-8");
307  // TODO test for successful serialization
308  serialize(graph);
309  stream << d->_buffer;
310 
311  if (!saveFile.finalize()) {
312  setError(FileIsReadOnly, i18n("Could not write data, aborting. Error: %1.", saveFile.errorString()));
313  return;
314  }
315 
316  setError(None);
317 }
318 
319 
320 QString RocsGraphFileFormatPlugin::serialize(const Document &document)
321 {
322  d->_buffer.clear();
323 
324  d->_buffer = QString("[Document Properties] \n")
325  % QString("DataStructurePlugin : ") % DataStructureBackendManager::self().activeBackend()->internalName() % QChar('\n')
326  % QChar('\n');
327 
328  foreach(int dataTypeIdentifier, document.dataTypeList()) {
329  QStringList properties;
330  foreach (const QString& property, document.dataType(dataTypeIdentifier)->properties()) {
331  properties.append(property + QString('=') + document.dataType(dataTypeIdentifier)->propertyDefaultValue(property).toString());
332  }
333 
334  d->_buffer += QString("[DataType %1]").arg(QString::number(dataTypeIdentifier)) % QChar('\n')
335  % QString("Name : ") % document.dataType(dataTypeIdentifier)->name() % QChar('\n')
336  % QString("IconName : ") % document.dataType(dataTypeIdentifier)->iconName() % QChar('\n')
337  % QString("Color : ") % document.dataType(dataTypeIdentifier)->defaultColor().name() % QChar('\n')
338  % QString("Properties : ") % properties.join(QChar(','))
339  % QChar('\n');
340  d->_buffer += QChar('\n');
341  }
342 
343  foreach(int pointerTypeIdentifier, document.pointerTypeList()) {
344  QStringList properties;
345  foreach (const QString& property, document.pointerType(pointerTypeIdentifier)->properties()) {
346  properties.append(property + QString('=') + document.pointerType(pointerTypeIdentifier)->propertyDefaultValue(property).toString());
347  }
348 
349  // set direction identifier
350  QString direction = (document.pointerType(pointerTypeIdentifier)->direction() == PointerType::Bidirectional)
351  ? "bidirectional"
352  : "unidirectional";
353 
354  d->_buffer += QString("[PointerType %1]").arg(QString::number(pointerTypeIdentifier)) % QChar('\n')
355  % QString("Name : ") % document.pointerType(pointerTypeIdentifier)->name() % QChar('\n')
356  % QString("Color : ") % document.pointerType(pointerTypeIdentifier)->defaultColor().name() % QChar('\n')
357  % QString("LineStyle : ") % QString::number(document.pointerType(pointerTypeIdentifier)->lineStyle()) % QChar('\n')
358  % QString("Direction : ") % direction % QChar('\n')
359  % QString("Properties : ") % properties.join(QChar(','))
360  % QChar('\n');
361  d->_buffer += QChar('\n');
362  }
363 
364  // iterate over all data structures
365  QList<DataStructurePtr>::const_iterator dataStructure = document.dataStructures().constBegin();
366  int identifier=0;
367  while (dataStructure != document.dataStructures().constEnd()) {
368  d->_buffer += QString("[DataStructure %1] \n").arg(identifier++).toUtf8();
369  QMap<QString, QString> properties = (*dataStructure)->pluginProperties();
370  QMap<QString, QString>::const_iterator propertyIter = properties.constBegin();
371  while (propertyIter != properties.constEnd()) {
372  d->_buffer += QString("X-plugin-%1 : %2").arg(propertyIter.key()).arg(propertyIter.value()) % QChar('\n');
373  ++propertyIter;
374  }
375 
376  serializeProperties(dataStructure->get());
377 
378  foreach(int type, document.dataTypeList()) {
379  foreach(DataPtr n, (*dataStructure)->dataList(type)) {
380  d->_buffer += QString("[Data %1]\n").arg(QString::number(n->identifier()));
381  d->_buffer += QString("type : ") % QString::number(n->dataType()) % QChar('\n');
382  serializeProperties(n.get());
383  }
384  }
385 
386  foreach(int type, document.pointerTypeList()) {
387  foreach(PointerPtr e, (*dataStructure)->pointers(type)) {
388  d->_buffer += QString("[Pointer %1->%2]\n").
389  arg(QString::number(e->from()->identifier())).
390  arg(QString::number(e->to()->identifier())).toUtf8();
391  d->_buffer += QString("type : ") % QString::number(e->pointerType()) % QChar('\n');
392  serializeProperties(e.get());
393  }
394  }
395  ++dataStructure;
396  }
397  kDebug() << "------- /// BEGIN internal file format /// -------";
398  kDebug() << d->_buffer;
399  kDebug() << "------- /// internal file format END /// -------";
400 
401  return d->_buffer;
402 }
403 
404 
405 void RocsGraphFileFormatPlugin::serializeProperties(QObject *o)
406 {
407  const QMetaObject *metaObject = o->metaObject();
408  int propertyCount = metaObject->propertyCount();
409 
410  for (int i = 0; i < propertyCount; ++i) {
411  QMetaProperty metaProperty = metaObject->property(i);
412  const char *name = metaProperty.name();
413  QVariant value = o->property(name);
414 
415  if (QString("objectName").compare(metaProperty.name()) == 0) {
416  continue;
417  } else if (QString("name").compare(metaProperty.name()) == 0) {
418  QString namevalue = QString("%1 : %2 \n").arg(name).arg(value.toString());
419  }
420 
421  d->_buffer += QString("%1 : %2 \n").arg(name, value.toString());
422  }
423 
424  QList<QByteArray> propertyNames = o->dynamicPropertyNames();
425  foreach(const QByteArray & name, propertyNames) {
426  QVariant value = o->property(name);
427  d->_buffer += QString("%1 : %2 \n").arg(name, value.toString()).toUtf8();
428  }
429 
430  d->_buffer += '\n';
431 }
DataStructure::setPluginProperty
virtual void setPluginProperty(const QString &, const QString &)
Set plugin specific properties of data structure.
Definition: DataStructure.cpp:585
DataType.h
RocsGraphFileFormatPlugin::~RocsGraphFileFormatPlugin
~RocsGraphFileFormatPlugin()
Definition: RocsGraphFileFormatPlugin.cpp:62
Document::registerDataType
int registerDataType(const QString &name, int identifier=0)
Register new type for data elements.
Definition: Document.cpp:124
DataStructureBackendManager::activeBackend
DataStructureBackendInterface * activeBackend() const
Returns the currently active data structure backend.
Definition: DataStructureBackendManager.cpp:275
GraphFilePluginInterface::None
Definition: GraphFilePluginInterface.h:51
PointerType::Bidirectional
Definition: PointerType.h:48
DataStructure
Definition: DataStructure.h:43
Topology.h
PointerTypePtr
boost::shared_ptr< PointerType > PointerTypePtr
Definition: CoreTypes.h:37
DataStructurePtr
boost::shared_ptr< DataStructure > DataStructurePtr
Definition: CoreTypes.h:38
GmlParser::document
Document * document
Definition: GmlGrammar.cpp:40
RocsGraphFileFormatPlugin::extensions
virtual const QStringList extensions() const
File extensions that are common for this file type.
Definition: RocsGraphFileFormatPlugin.cpp:67
RocsGraphFileFormatPlugin.h
RocsGraphFileFormatPlugin::writeFile
virtual void writeFile(Document &graph)
Writes given graph document to formerly specified file.
Definition: RocsGraphFileFormatPlugin.cpp:296
QObject
pluginAboutData
static const KAboutData pluginAboutData("rocs_rocsgraphfileformat", 0, ki18nc("@title Displayed plugin name","Rocs Graph File Backend"),"0.2", ki18n("Read and write Rocs Graph Files"), KAboutData::License_GPL_V2)
Data.h
DataStructureBackendManager::self
static DataStructureBackendManager & self()
Returns self reference to backend manager.
Definition: DataStructureBackendManager.cpp:233
DataStructureBackendInterface.h
Document.h
PointerType::Unidirectional
Definition: PointerType.h:47
PointerPtr
boost::shared_ptr< Pointer > PointerPtr
Definition: CoreTypes.h:35
DataStructure.h
Document::setBackend
void setBackend(const QString &pluginIdentifier)
Set data structure plugin for this document.
Definition: Document.cpp:441
GraphFilePluginInterface::setError
void setError(Error error, QString message=QString())
Definition: GraphFilePluginInterface.cpp:83
RocsGraphFileFormatPlugin::readFile
virtual void readFile()
Open given file and imports it into internal format.
Definition: RocsGraphFileFormatPlugin.cpp:74
Document::addDataStructure
DataStructurePtr addDataStructure(const QString &name=QString())
Add data structure to graph document with name name.
Definition: Document.cpp:333
Document::registerPointerType
int registerPointerType(const QString &name, int identifier=0)
Register new type for pointers.
Definition: Document.cpp:142
Document
Definition: Document.h:41
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
RocsGraphFileFormatPlugin::RocsGraphFileFormatPlugin
RocsGraphFileFormatPlugin(QObject *parent)
Definition: RocsGraphFileFormatPlugin.cpp:55
Pointer.h
GraphFilePluginInterface::FileIsReadOnly
Definition: GraphFilePluginInterface.h:53
DataPtr
boost::shared_ptr< Data > DataPtr
Definition: CoreTypes.h:34
GraphFilePluginInterface::CouldNotOpenFile
Definition: GraphFilePluginInterface.h:54
Document::pointerTypeList
QList< int > pointerTypeList() const
Getter for all registered pointer types.
Definition: Document.cpp:165
Document::dataType
DataTypePtr dataType(int dataType) const
Definition: Document.cpp:197
PointerType.h
DataTypePtr
boost::shared_ptr< DataType > DataTypePtr
Definition: CoreTypes.h:36
DataStructureBackendInterface::internalName
QString internalName()
return the internal name from plugin.
Definition: DataStructureBackendInterface.cpp:63
Document::dataTypeList
QList< int > dataTypeList() const
Getter for all registered data types.
Definition: Document.cpp:160
GraphFilePluginInterface::setGraphDocument
void setGraphDocument(Document *document)
Definition: GraphFilePluginInterface.cpp:108
DataStructureBackendManager.h
GraphFilePluginInterface::file
const KUrl & file() const
Definition: GraphFilePluginInterface.cpp:120
GraphFilePluginInterface
This class provides an interface for graph file format plugins.
Definition: GraphFilePluginInterface.h:42
Document::setFileUrl
void setFileUrl(const KUrl &fileUrl)
Set file path used for saving.
Definition: Document.cpp:391
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:42:26 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