/* * Kivio - Visual Modelling and Flowcharting * Copyright (C) 2001 Nikolas Zimmermann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "kivio_stencil.h" #include "kivio_dia_stencil_spawner.h" #include "diapathparser.h" KivioDiaStencilSpawner::KivioDiaStencilSpawner(KivioStencilSpawnerSet *p) : KivioStencilSpawner(p) { m_smlStencilSpawner = new KivioSMLStencilSpawner(p); } KivioDiaStencilSpawner::~KivioDiaStencilSpawner() { } TQDomElement KivioDiaStencilSpawner::saveXML(TQDomDocument &d) { return m_smlStencilSpawner->saveXML(d); } void KivioDiaStencilSpawner::calculateDimensions(float x, float y) { m_xlist.append(x); m_ylist.append(y); } float KivioDiaStencilSpawner::diaPointToKivio(float point, bool xpoint) { float returnPoint = 0.0; if(xpoint) { //if(m_lowestx < 0) returnPoint = point - m_lowestx; //else // returnPoint = (fabs(m_highestx) - fabs(m_lowestx)) - (fabs(m_highestx) + fabs(point)); } else { //if(m_lowesty < 0) returnPoint =point - m_lowesty; //else // returnPoint = (fabs(m_highesty) + fabs(m_lowesty)) - (fabs(m_highesty) + fabs(point)); } //kdDebug () << "Point " << point << " Return point " << returnPoint << endl; return returnPoint; } bool KivioDiaStencilSpawner::load(const TQString &file) { TQDomDocument dia("test"); TQDomDocument kivio("XML"); m_filename = file; TQFile f(file); if(f.open(IO_ReadOnly) == false) { kdDebug(43000) << "KivioDiaStencilSpawner::load() - Error opening stencil: " << file << endl; return false; } dia.setContent(&f); TQDomNode diaMain = dia.namedItem("tqshape"); // Set "creator" attribute TQDomElement firstElement = kivio.createElement("KivioShapeStencil"); firstElement.setAttribute("creator", "kiviodiafilter"); kivio.appendChild(firstElement); // Add KivioSMLStencilSpawnerInfo TQDomElement spawnerInfoElement = kivio.createElement("KivioSMLStencilSpawnerInfo"); TQDomElement authorInfoElement = kivio.createElement("Author"); authorInfoElement.setAttribute("data", "n/a"); TQDomElement titleInfoElement = kivio.createElement("Title"); titleInfoElement.setAttribute("data", diaMain.namedItem("name").toElement().text()); TQDomElement idInfoElement = kivio.createElement("Id"); idInfoElement.setAttribute("data", diaMain.namedItem("name").toElement().text()); TQDomElement descriptionInfoElement = kivio.createElement("Description"); descriptionInfoElement.setAttribute("data", diaMain.namedItem("description").toElement().text()); TQDomElement versionInfoElement = kivio.createElement("Version"); versionInfoElement.setAttribute("data", "1.0"); TQDomElement webInfoElement = kivio.createElement("Web"); webInfoElement.setAttribute("data", "http://"); TQDomElement emailInfoElement = kivio.createElement("Email"); emailInfoElement.setAttribute("data", "n/a"); TQDomElement copyrightInfoElement = kivio.createElement("Copyright"); copyrightInfoElement.setAttribute("data", "n/a"); TQDomElement autoUpdateInfoElement = kivio.createElement("AutoUpdate"); autoUpdateInfoElement.setAttribute("data", "off"); spawnerInfoElement.appendChild(authorInfoElement); spawnerInfoElement.appendChild(titleInfoElement); spawnerInfoElement.appendChild(idInfoElement); spawnerInfoElement.appendChild(descriptionInfoElement); spawnerInfoElement.appendChild(versionInfoElement); spawnerInfoElement.appendChild(webInfoElement); spawnerInfoElement.appendChild(emailInfoElement); spawnerInfoElement.appendChild(copyrightInfoElement); spawnerInfoElement.appendChild(autoUpdateInfoElement); kivio.documentElement().appendChild(spawnerInfoElement); m_xscale = m_yscale = 20.0f; // Add Dimensions TQDomElement dimensionsElement = kivio.createElement("Dimensions"); kivio.documentElement().appendChild(dimensionsElement); // Calculate Dimensions TQDomElement svgElement = diaMain.namedItem("svg:svg").toElement(); TQDomNode svgNode = svgElement.firstChild(); while(!svgNode.isNull()) { TQDomElement svgChild = svgNode.toElement(); if(!svgChild.isNull()) { if(svgChild.tagName() == "svg:rect") { // TODO: rx and ry -> rounded rects if(svgChild.hasAttribute("x") && svgChild.hasAttribute("y") && svgChild.hasAttribute("width") && svgChild.hasAttribute("height")) { calculateDimensions(svgChild.attribute("x").toFloat(), svgChild.attribute("y").toFloat()); calculateDimensions(svgChild.attribute("x").toFloat() + svgChild.attribute("width").toFloat(), svgChild.attribute("y").toFloat() + svgChild.attribute("height").toFloat()); } } else if(svgChild.tagName() == "svg:circle") { if(svgChild.hasAttribute("cx") && svgChild.hasAttribute("cy") && svgChild.hasAttribute("r")) { calculateDimensions((svgChild.attribute("cx").toFloat()) - (svgChild.attribute("r").toFloat()), (svgChild.attribute("cy").toFloat()) - (svgChild.attribute("r").toFloat())); calculateDimensions((svgChild.attribute("cx").toFloat()) + (svgChild.attribute("r").toFloat()), (svgChild.attribute("cy").toFloat()) + (svgChild.attribute("r").toFloat())); } } else if(svgChild.tagName() == "svg:ellipse") { if(svgChild.hasAttribute("cx") && svgChild.hasAttribute("cy") && svgChild.hasAttribute("rx") && svgChild.hasAttribute("ry")) { calculateDimensions((svgChild.attribute("cx").toFloat()) - (svgChild.attribute("rx").toFloat()), (svgChild.attribute("cy").toFloat()) - (svgChild.attribute("ry").toFloat())); calculateDimensions((svgChild.attribute("cx").toFloat()) + (svgChild.attribute("rx").toFloat()), (svgChild.attribute("cy").toFloat()) + (svgChild.attribute("ry").toFloat())); } } else if(svgChild.tagName() == "svg:line") { if(svgChild.hasAttribute("x1") && svgChild.hasAttribute("y1") && svgChild.hasAttribute("x2") && svgChild.hasAttribute("y2")) { calculateDimensions(svgChild.attribute("x1").toFloat(), svgChild.attribute("y1").toFloat()); calculateDimensions(svgChild.attribute("x2").toFloat(), svgChild.attribute("y2").toFloat()); } } else if(svgChild.tagName() == "svg:polyline") { if(svgChild.hasAttribute("points")) { TQStringList points = TQStringList::split(" ", svgChild.attribute("points")); for(TQStringList::Iterator it = points.begin(); it != points.end(); ++it) { TQString x, y; TQStringList parsed = TQStringList::split(",", (*it)); TQStringList::Iterator itp = parsed.begin(); x = (*itp); ++itp; y = (*itp); calculateDimensions(x.toFloat(), y.toFloat()); } } } else if(svgChild.tagName() == "svg:polygon") { if(svgChild.hasAttribute("points")) { TQStringList points = TQStringList::split(" ", svgChild.attribute("points")); for(TQStringList::Iterator it = points.begin(); it != points.end(); ++it) { TQString x, y; TQStringList parsed = TQStringList::split(",", (*it)); TQStringList::Iterator itp = parsed.begin(); x = (*itp); ++itp; y = (*itp); calculateDimensions(x.toFloat(), y.toFloat()); } } } else if(svgChild.tagName() == "svg:path") { if(svgChild.hasAttribute("d")) { DiaPointFinder *dpf = new DiaPointFinder(&m_xlist, &m_ylist); dpf->parseSVG(svgChild.attribute("d"), true); delete dpf; } } } svgNode = svgNode.nextSibling(); } TQValueList::Iterator itx = m_xlist.begin(); TQValueList::Iterator ity = m_ylist.begin(); m_highestx = *itx; m_lowestx = *itx; m_highesty = *ity; m_lowesty = *ity; ++itx; ++ity; for( ; itx != m_xlist.end(); ++itx) { m_highestx = TQMAX(m_highestx, *itx); m_lowestx = TQMIN(m_lowestx, *itx); } for( ; ity != m_ylist.end(); ++ity) { m_highesty = TQMAX(m_highesty, *ity); m_lowesty = TQMIN(m_lowesty, *ity); } //if( svgElement.hasAttribute("width") && svgElement.hasAttribute("height")) //{ // m_yscale = svgElement.attribute("height").toFloat()/(m_highesty - m_lowesty); // m_xscale = svgElement.attribute("width").toFloat()/(m_highestx - m_lowestx); //} //else { // scale the tqshape to be close to 30 by 30 m_yscale = 30.0/(m_highesty - m_lowesty); m_xscale = 30.0/(m_highestx - m_lowestx); } // Add KivioConnectorTarget's TQDomElement connectionsElement = diaMain.namedItem("connections").toElement(); TQDomNode connectionsNode = connectionsElement.firstChild(); while(!connectionsNode.isNull()) { TQDomElement connectionChild = connectionsNode.toElement(); if(!connectionChild.isNull()) { if(connectionChild.tagName() == "point") { if(connectionChild.hasAttribute("x") && connectionChild.hasAttribute("y")) { TQDomElement kivioConnectorTarget = kivio.createElement("KivioConnectorTarget"); kivioConnectorTarget.setAttribute("x", TQString::number(diaPointToKivio(connectionChild.attribute("x").toFloat(),true) * m_xscale)); kivioConnectorTarget.setAttribute("y", TQString::number(diaPointToKivio(connectionChild.attribute("y").toFloat(), false) * m_yscale)); kivio.documentElement().appendChild(kivioConnectorTarget); } } } connectionsNode = connectionsNode.nextSibling(); } // Add KivioShape's and convert to Kivio's Coordinate System svgNode = svgElement.firstChild(); int runs = 0; while(!svgNode.isNull()) { TQDomElement svgChild = svgNode.toElement(); if(!svgChild.isNull()) { if(svgChild.tagName() == "svg:rect") { runs++; // TODO: rx and ry -> rounded rects if(svgChild.hasAttribute("x") && svgChild.hasAttribute("y") && svgChild.hasAttribute("width") && svgChild.hasAttribute("height")) { TQDomElement kivioShape = kivio.createElement("KivioShape"); kivioShape.setAttribute("type", "Rectangle"); kivioShape.setAttribute("name", TQString::tqfromLatin1("Element") + TQString::number(runs)); kivioShape.setAttribute("x", TQString::number(diaPointToKivio(svgChild.attribute("x").toFloat(),true) * m_xscale)); kivioShape.setAttribute("y", TQString::number(diaPointToKivio(svgChild.attribute("y").toFloat(), false) * m_yscale)); kivioShape.setAttribute("w", TQString::number(svgChild.attribute("width").toFloat() * m_xscale)); kivioShape.setAttribute("h", TQString::number(svgChild.attribute("height").toFloat() * m_yscale)); kivio.documentElement().appendChild(kivioShape); } } else if(svgChild.tagName() == "svg:circle") { runs++; if(svgChild.hasAttribute("cx") && svgChild.hasAttribute("cy") && svgChild.hasAttribute("r")) { TQDomElement kivioShape = kivio.createElement("KivioShape"); kivioShape.setAttribute("type", "Ellipse"); kivioShape.setAttribute("name", TQString::tqfromLatin1("Element") + TQString::number(runs)); kivioShape.setAttribute("x", TQString::number((diaPointToKivio(svgChild.attribute("cx").toFloat() - svgChild.attribute("r").toFloat(),true) * m_xscale))); kivioShape.setAttribute("y", TQString::number((diaPointToKivio(svgChild.attribute("cy").toFloat() - svgChild.attribute("r").toFloat(), false) * m_yscale))); kivioShape.setAttribute("w", TQString::number(svgChild.attribute("r").toFloat() * m_xscale * 2)); kivioShape.setAttribute("h", TQString::number(svgChild.attribute("r").toFloat() * m_yscale * 2)); kivio.documentElement().appendChild(kivioShape); } } else if(svgChild.tagName() == "svg:ellipse") { runs++; if(svgChild.hasAttribute("cx") && svgChild.hasAttribute("cy") && svgChild.hasAttribute("rx") && svgChild.hasAttribute("ry")) { TQDomElement kivioShape = kivio.createElement("KivioShape"); kivioShape.setAttribute("type", "Ellipse"); kivioShape.setAttribute("name", TQString::tqfromLatin1("Element") + TQString::number(runs)); kivioShape.setAttribute("x", TQString::number((diaPointToKivio(svgChild.attribute("cx").toFloat() - svgChild.attribute("rx").toFloat(),true) * m_xscale))); kivioShape.setAttribute("y", TQString::number((diaPointToKivio(svgChild.attribute("cy").toFloat() - svgChild.attribute("ry").toFloat(), false) * m_yscale))); kivioShape.setAttribute("w", TQString::number(svgChild.attribute("rx").toFloat() * m_xscale * 2)); kivioShape.setAttribute("h", TQString::number(svgChild.attribute("ry").toFloat() * m_yscale * 2)); kivio.documentElement().appendChild(kivioShape); } } else if(svgChild.tagName() == "svg:line") { runs++; if(svgChild.hasAttribute("x1") && svgChild.hasAttribute("y1") && svgChild.hasAttribute("x2") && svgChild.hasAttribute("y2")) { TQDomElement kivioShape = kivio.createElement("KivioShape"); kivioShape.setAttribute("type", "LineArray"); kivioShape.setAttribute("name", TQString::tqfromLatin1("Element") + TQString::number(runs)); TQDomElement lineArrayElement = kivio.createElement("Line"); lineArrayElement.setAttribute("x1", TQString::number(diaPointToKivio(svgChild.attribute("x1").toFloat(),true) * m_xscale)); lineArrayElement.setAttribute("y1", TQString::number(diaPointToKivio(svgChild.attribute("y1").toFloat(), false) * m_yscale)); lineArrayElement.setAttribute("x2", TQString::number(diaPointToKivio(svgChild.attribute("x2").toFloat(),true) * m_xscale)); lineArrayElement.setAttribute("y2", TQString::number(diaPointToKivio(svgChild.attribute("y2").toFloat(), false) * m_yscale)); kivioShape.appendChild(lineArrayElement); kivio.documentElement().appendChild(kivioShape); } } else if(svgChild.tagName() == "svg:polyline") { runs++; if(svgChild.hasAttribute("points")) { TQDomElement kivioShape = kivio.createElement("KivioShape"); kivioShape.setAttribute("type", "Polyline"); kivioShape.setAttribute("name", TQString::tqfromLatin1("Element") + TQString::number(runs)); TQStringList points = TQStringList::split(" ", svgChild.attribute("points")); for(TQStringList::Iterator it = points.begin(); it != points.end(); ++it) { TQString x, y; TQStringList parsed = TQStringList::split(",", (*it)); TQStringList::Iterator itp = parsed.begin(); x = (*itp); ++itp; y = (*itp); TQDomElement kivioPointElement = kivio.createElement("KivioPoint"); kivioPointElement.setAttribute("x", TQString::number(diaPointToKivio(x.toFloat(),true) * m_xscale)); kivioPointElement.setAttribute("y", TQString::number(diaPointToKivio(y.toFloat(), false) * m_yscale)); kivioShape.appendChild(kivioPointElement); } kivio.documentElement().appendChild(kivioShape); } } else if(svgChild.tagName() == "svg:polygon") { runs++; if(svgChild.hasAttribute("points")) { TQDomElement kivioShape = kivio.createElement("KivioShape"); kivioShape.setAttribute("type", "Polygon"); kivioShape.setAttribute("name", TQString::tqfromLatin1("Element") + TQString::number(runs)); TQStringList points = TQStringList::split(" ", svgChild.attribute("points")); for(TQStringList::Iterator it = points.begin(); it != points.end(); ++it) { TQString x, y; TQStringList parsed = TQStringList::split(",", (*it)); TQStringList::Iterator itp = parsed.begin(); x = (*itp); ++itp; y = (*itp); TQDomElement kivioPointElement = kivio.createElement("KivioPoint"); kivioPointElement.setAttribute("x", TQString::number(diaPointToKivio(x.toFloat(),true) * m_xscale)); kivioPointElement.setAttribute("y", TQString::number(diaPointToKivio(y.toFloat(), false) * m_yscale)); kivioShape.appendChild(kivioPointElement); } kivio.documentElement().appendChild(kivioShape); } } else if(svgChild.tagName() == "svg:path") { runs++; bool isClosed; TQDomElement kivioShape = kivio.createElement("KivioShape"); if(svgChild.hasAttribute("d")) { if(svgChild.attribute("d").tqcontains('z') || svgChild.attribute("d").tqcontains('Z')) { isClosed = true; kivioShape.setAttribute("type", "ClosedPath"); } else { isClosed = false; kivioShape.setAttribute("type", "OpenPath"); } kivioShape.setAttribute("name", TQString::tqfromLatin1("Element") + TQString::number(runs)); DiaPathParser *dpp = new DiaPathParser(&kivio, &kivioShape, m_xscale, m_yscale, m_lowestx, m_lowesty); dpp->parseSVG(svgChild.attribute("d"), true); delete dpp; } if( svgChild.hasAttribute("style")) { // style="stroke: background; stroke-width: 0.8; stroke-miterlimit: 1; stroke-linecap: round; stroke-linejoin: round" // Supported: // stroke-width: // stroke-linejoin: milter, bevel, round // stroke-linecap: round, square, flat // fill: ? TQStringList styles = TQStringList::split(";", svgChild.attribute("style")); for( uint idx = 0; idx < styles.count(); idx++) { //kdDebug(43000) << "Style: " << styles[idx] << endl; if( isClosed && styles[idx].tqcontains("fill:")) { TQDomElement fillStyle = kivio.createElement("KivioFillStyle"); if( styles[idx].tqcontains("forground")) fillStyle.setAttribute("color", "#0000"); else if (styles[idx].tqcontains("background")) fillStyle.setAttribute("color", "#ffff"); fillStyle.setAttribute("colorStyle", "1"); kivioShape.appendChild(fillStyle); } } } kivio.documentElement().appendChild(kivioShape); } } svgNode = svgNode.nextSibling(); } // Apply width and height dimensionsElement.setAttribute("w", TQString::number((fabs(m_highestx - m_lowestx)) * m_xscale)); dimensionsElement.setAttribute("h", TQString::number((fabs(m_highesty - m_lowesty)) * m_yscale)); m_xlist.clear(); m_ylist.clear(); return loadXML(file, kivio); } bool KivioDiaStencilSpawner::loadXML(const TQString &file, TQDomDocument &d) { bool ret = m_smlStencilSpawner->loadXML(file, d); m_icon = *m_smlStencilSpawner->icon(); m_pSet = m_smlStencilSpawner->set(); m_pInfo = m_smlStencilSpawner->info(); m_defWidth = m_smlStencilSpawner->defWidth(); m_defHeight = m_smlStencilSpawner->defHeight(); return ret; } KivioStencil *KivioDiaStencilSpawner::newStencil() { KivioStencil *newStencil = m_smlStencilSpawner->newStencil(); newStencil->setSpawner(this); return newStencil; }