From 0092b62413fa6a5727530f0eb5c5044a322870d3 Mon Sep 17 00:00:00 2001 From: Lukáš Lalinský Date: Sun, 7 Dec 2008 17:52:36 +0100 Subject: Refactored XML processing, improved copy&paste, new file format --- src/diagramdocument.cpp | 148 +++++++++++++----------------------------------- 1 file changed, 40 insertions(+), 108 deletions(-) (limited to 'src/diagramdocument.cpp') 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(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 tables = itemsByType(); - 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()) { + 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()) { - 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()) { + 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 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()) + if (item->id() == id) + return item; + return 0; } -- cgit v1.2.3-54-g00ecf