summaryrefslogtreecommitdiff
path: root/src/diagramdocument.cpp
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2008-12-07 17:52:36 +0100
committerLukáš Lalinský <lalinsky@gmail.com>2008-12-07 17:52:36 +0100
commit0092b62413fa6a5727530f0eb5c5044a322870d3 (patch)
tree78939cf9c2c03988ae05408f238bf5658a4002c7 /src/diagramdocument.cpp
parent6b42618de7c3be2681ad4e49eb412e56b700d59e (diff)
downloaddbmodel-0092b62413fa6a5727530f0eb5c5044a322870d3.tar.xz
Refactored XML processing, improved copy&paste, new file format
Diffstat (limited to 'src/diagramdocument.cpp')
-rw-r--r--src/diagramdocument.cpp148
1 files changed, 40 insertions, 108 deletions
diff --git a/src/diagramdocument.cpp b/src/diagramdocument.cpp
index b8ad744..d1ae22e 100644
--- a/src/diagramdocument.cpp
+++ b/src/diagramdocument.cpp
@@ -91,6 +91,7 @@ DiagramDocument::mousePressEvent(QGraphicsSceneMouseEvent *event)
m_trackingMoves = true;
if (m_mode == AddTable && event->button() == Qt::LeftButton) {
DatabaseTable *table = new DatabaseTable();
+ table->createId();
table->setPos(event->scenePos());
undoStack()->push(new AddItemCommand(this, table));
clearSelection();
@@ -135,6 +136,7 @@ DiagramDocument::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
DatabaseTable *target = qgraphicsitem_cast<DatabaseTable *>(itemAt(m_line->line().p2()));
if (source && target && source != target) {
DatabaseRelationship *relation = new DatabaseRelationship();
+ relation->createId();
relation->setSource(source);
relation->setTarget(target);
undoStack()->push(new AddItemCommand(this, relation));
@@ -185,73 +187,33 @@ DiagramDocument::findConnections(DiagramObject *object)
return result;
}
-void
-appendStringElement(QDomDocument &doc, QDomElement &parent, const QString &name, const QString &value)
-{
- if (!value.isEmpty()) {
- QDomElement element = doc.createElement(name);
- element.appendChild(doc.createTextNode(value));
- parent.appendChild(element);
- }
-}
-
-QString
-readStringElement(QDomElement &parent, const QString &name, const QString &defaultValue = QString())
-{
- QDomElement element = parent.firstChildElement(name);
- if (!element.isNull()) {
- return element.text();
- }
- return defaultValue;
-}
+#include "domutils.h"
void
DiagramDocument::save(const QString &fileName)
{
QDomDocument doc;
- QDomElement root = doc.createElement("database-model");
- doc.appendChild(root);
-
- QDomElement tableListElement = doc.createElement("table-list");
- root.appendChild(tableListElement);
-
- QList<DatabaseTable *> tables = itemsByType<DatabaseTable>();
- foreach (DatabaseTable *table, tables) {
- QDomElement tableElement = doc.createElement("table");
- tableListElement.appendChild(tableElement);
-
- QDomElement positionElement = doc.createElement("position");
- positionElement.setAttribute("x", table->pos().x());
- positionElement.setAttribute("y", table->pos().y());
- tableElement.appendChild(positionElement);
+ QDomProcessingInstruction xml = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
+ doc.appendChild(xml);
- QDomElement nameElement = doc.createElement("name");
- nameElement.appendChild(doc.createTextNode(table->name()));
- tableElement.appendChild(nameElement);
+ QDomElement root = doc.createElement("diagram");
+ root.setAttribute("xmlns", "http://oxygene.sk/ns/diagram/1/");
+ doc.appendChild(root);
- QDomElement columnListElement = doc.createElement("column-list");
- tableElement.appendChild(columnListElement);
+ QDomElement itemList = doc.createElement("item-list");
+ root.appendChild(itemList);
- foreach (Column *column, table->columnList()->columns()) {
- QDomElement columnElement = doc.createElement("column");
- columnListElement.appendChild(columnElement);
- appendStringElement(doc, columnElement, "name", column->name());
- appendStringElement(doc, columnElement, "data-type", column->dataType());
- appendStringElement(doc, columnElement, "required", column->isRequired() ? "yes" : QString());
- appendStringElement(doc, columnElement, "primary-key", column->isPrimaryKey() ? "yes" : QString());
- appendStringElement(doc, columnElement, "notes", column->notes());
- }
+ foreach (DiagramObject *item, itemsByType<DiagramObject>()) {
+ QDomElement element = doc.createElement("item");
+ itemList.appendChild(element);
+ item->saveToXml(doc, element);
}
-
- QDomElement relationListElement = doc.createElement("relation-list");
- root.appendChild(relationListElement);
- foreach (DatabaseRelationship *relation, itemsByType<DatabaseRelationship>()) {
- QDomElement relationElement = doc.createElement("relation");
- relationElement.setAttribute("from", QString::number(tables.indexOf(relation->sourceTable())));
- relationElement.setAttribute("to", QString::number(tables.indexOf(relation->targetTable())));
- relationListElement.appendChild(relationElement);
+ foreach (DiagramConnection *item, itemsByType<DiagramConnection>()) {
+ QDomElement element = doc.createElement("item");
+ itemList.appendChild(element);
+ item->saveToXml(doc, element);
}
QFile file(fileName);
@@ -264,6 +226,8 @@ DiagramDocument::save(const QString &fileName)
setFileName(fileName);
}
+#include "diagramitemregistry.h"
+
void
DiagramDocument::load(const QString &fileName)
{
@@ -273,61 +237,29 @@ DiagramDocument::load(const QString &fileName)
doc.setContent(&file);
file.close();
}
-
setFileName(fileName);
-
- QDomElement root = doc.firstChildElement("database-model");
-
- QList<DatabaseTable *> tables;
-
- QDomElement tableListElement = root.firstChildElement("table-list");
- QDomElement tableElement = tableListElement.firstChildElement("table");
- while (!tableElement.isNull()) {
- DatabaseTable *table = new DatabaseTable;
-
- QDomElement positionElement = tableElement.firstChildElement("position");
- if (!positionElement.isNull()) {
- QPoint pos;
- pos.setX(positionElement.attribute("x", "0").toInt());
- pos.setY(positionElement.attribute("y", "0").toInt());
- table->setPos(pos);
+ QDomElement root = doc.firstChildElement("diagram");
+ QDomElement itemListElement = root.firstChildElement("item-list");
+ QDomElement itemElement = itemListElement.firstChildElement("item");
+ while (!itemElement.isNull()) {
+ QString itemTypeName = itemElement.attribute("type");
+ DiagramItem *item = DiagramItemRegistry::createItem(itemTypeName);
+ if (item == NULL) {
+ qWarning() << "Unknown item type:" << itemTypeName;
}
-
- table->setName(readStringElement(tableElement, "name"));
-
- QDomElement columnListElement = tableElement.firstChildElement("column-list");
- QDomElement columnElement = columnListElement.firstChildElement("column");
- while (!columnElement.isNull()) {
- Column *column = new Column();
- column->setName(readStringElement(columnElement, "name"));
- column->setDataType(readStringElement(columnElement, "data-type"));
- column->setRequired(readStringElement(columnElement, "required") == "yes");
- column->setPrimaryKey(readStringElement(columnElement, "primary-key") == "yes");
- column->setNotes(readStringElement(columnElement, "notes"));
- table->columnList()->appendColumn(column);
- columnElement = columnElement.nextSiblingElement("column");
+ else {
+ item->loadFromXml(itemElement, this);
+ addItem(item);
}
-
- addItem(table);
- tables.append(table);
-
- tableElement = tableElement.nextSiblingElement("table");
+ itemElement = itemElement.nextSiblingElement("item");
}
+}
- QDomElement relationListElement = root.firstChildElement("relation-list");
- QDomElement relationElement = relationListElement.firstChildElement("relation");
- while (!relationElement.isNull()) {
- relationElement = relationElement.nextSiblingElement("relation");
- bool ok;
- int index0 = relationElement.attribute("from").toInt(&ok);
- if (ok) {
- int index1 = relationElement.attribute("to").toInt(&ok);
- if (ok) {
- DatabaseRelationship *relation = new DatabaseRelationship();
- relation->setSource(tables[index0]);
- relation->setTarget(tables[index1]);
- addItem(relation);
- }
- }
- }
+DiagramItem *
+DiagramDocument::itemById(const QUuid &id)
+{
+ foreach (DiagramItem *item, itemsByType<DiagramItem>())
+ if (item->id() == id)
+ return item;
+ return 0;
}