summaryrefslogtreecommitdiffstats
path: root/kivio/kiviopart/kiviosdk/kivio_shape_data.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kivio/kiviopart/kiviosdk/kivio_shape_data.cpp')
-rw-r--r--kivio/kiviopart/kiviosdk/kivio_shape_data.cpp563
1 files changed, 563 insertions, 0 deletions
diff --git a/kivio/kiviopart/kiviosdk/kivio_shape_data.cpp b/kivio/kiviopart/kiviosdk/kivio_shape_data.cpp
new file mode 100644
index 00000000..ed974871
--- /dev/null
+++ b/kivio/kiviopart/kiviosdk/kivio_shape_data.cpp
@@ -0,0 +1,563 @@
+/*
+ * Kivio - Visual Modelling and Flowcharting
+ * Copyright (C) 2000-2001 theKompany.com & Dave Marotti
+ *
+ * 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 "kivio_common.h"
+#include "kivio_fill_style.h"
+#include "kivio_line_style.h"
+#include "kivio_point.h"
+#include "kivio_shape_data.h"
+#include "kivio_text_style.h"
+
+#include <qpainter.h>
+#include <kdebug.h>
+
+/*
+ * Struct for holding information about a shape type
+ */
+struct KivioShapeTypeInfo
+{
+ const char *name;
+ KivioShapeData::KivioShapeType type;
+};
+
+/*
+ * Array of shape info used for loading/saving.
+ */
+static const int numShapeInfo = 12;
+static struct KivioShapeTypeInfo shapeInfo[] = {
+ { "Arc", KivioShapeData::kstArc },
+ { "Pie", KivioShapeData::kstPie },
+ { "LineArray", KivioShapeData::kstLineArray },
+ { "Polyline", KivioShapeData::kstPolyline },
+ { "Polygon", KivioShapeData::kstPolygon },
+ { "Bezier", KivioShapeData::kstBezier },
+ { "Rectangle", KivioShapeData::kstRectangle },
+ { "RoundRectangle", KivioShapeData::kstRoundRectangle },
+ { "Ellipse", KivioShapeData::kstEllipse },
+ { "OpenPath", KivioShapeData::kstOpenPath },
+ { "ClosedPath", KivioShapeData::kstClosedPath },
+ { "TextBox", KivioShapeData::kstTextBox }
+};
+
+
+/*****************
+ * FIXME
+ *
+ * Down the road, this will be phased out because of the KivioTextStyle
+ * class. But it's here for now to keep backwards compatibility with
+ * beta 2 -- even though noone should be using it for anything important!!!
+ ****************/
+KivioTextShapeData::KivioTextShapeData()
+{
+ m_text = "";
+ m_textFont = QFont("Times");
+ m_textColor = QColor(0,0,0);
+ m_isHtml = false;
+ m_hTextAlign = Qt::AlignHCenter;
+ m_vTextAlign = Qt::AlignVCenter;
+}
+
+
+KivioShapeData::KivioShapeData()
+ : m_pOriginalPointList(NULL),
+ m_pFillStyle(NULL)
+{
+ m_pOriginalPointList = new QPtrList<KivioPoint>;
+ m_pOriginalPointList->setAutoDelete(true);
+
+ m_pFillStyle = new KivioFillStyle();
+ m_pLineStyle = new KivioLineStyle();
+// m_fgColor = QColor( 0, 0, 0 );
+
+ m_shapeType = kstNone;
+ m_name = "";
+// m_lineWidth = 1.0f;
+
+ m_pTextData = NULL;
+
+ m_position.set( 0.0f, 0.0f );
+ m_dimensions.set( 72.0f, 72.0f );
+}
+
+KivioShapeData::KivioShapeData( const KivioShapeData &source )
+ : m_pOriginalPointList(NULL),
+ m_pFillStyle(NULL)
+{
+ // Allocate a new point list
+ KivioPoint *pPoint;
+ m_pOriginalPointList = new QPtrList<KivioPoint>;
+ m_pOriginalPointList->setAutoDelete(true);
+
+ // Copy over the point list
+ pPoint = source.m_pOriginalPointList->first();
+ while( pPoint )
+ {
+ m_pOriginalPointList->append( new KivioPoint( *pPoint ) );
+ pPoint = source.m_pOriginalPointList->next();
+ }
+
+ // Copy the fill/line styles
+ m_pFillStyle = new KivioFillStyle( *(source.m_pFillStyle) );
+ m_pLineStyle = new KivioLineStyle( *(source.m_pLineStyle) );
+
+ // Copy the fg color
+ //m_fgColor = source.m_fgColor;
+
+ // Copy the rest
+ m_shapeType = source.m_shapeType;
+ m_name = QString(source.m_name);
+ //m_lineWidth = source.m_lineWidth;
+
+ // Copy the position and size
+ source.m_position.copyInto( &m_position );
+ source.m_dimensions.copyInto( &m_dimensions );
+
+ // If this is a text shape, allocate a text data struct and copy the info
+ if( m_shapeType == kstTextBox )
+ {
+ m_pTextData = new KivioTextStyle();
+
+ source.m_pTextData->copyInto( m_pTextData );
+/*
+ m_pTextData->m_text = ((KivioShapeData)source).text();
+ m_pTextData->m_isHtml = ((KivioShapeData)source).isHtml();
+ m_pTextData->m_hTextAlign = ((KivioShapeData)source).hTextAlign();
+ m_pTextData->m_vTextAlign = ((KivioShapeData)source).vTextAlign();
+ m_pTextData->m_textFont = ((KivioShapeData)source).textFont();
+ m_pTextData->m_textColor = ((KivioShapeData)source).textColor();
+*/
+ }
+ else
+ m_pTextData = NULL;
+
+}
+
+
+KivioShapeData::~KivioShapeData()
+{
+ if( m_pOriginalPointList )
+ {
+ delete m_pOriginalPointList;
+ m_pOriginalPointList = NULL;
+ }
+
+ if( m_pFillStyle )
+ {
+ delete m_pFillStyle;
+ m_pFillStyle = NULL;
+ }
+
+ if( m_pLineStyle )
+ {
+ delete m_pLineStyle;
+ m_pLineStyle = NULL;
+ }
+
+ if( m_pTextData )
+ {
+ delete m_pTextData;
+ m_pTextData = NULL;
+ }
+}
+
+
+void KivioShapeData::copyInto( KivioShapeData *pTarget ) const
+{
+ KivioPoint *pPoint;
+
+ if( !pTarget )
+ return;
+
+ // Delete the old point list
+ if( pTarget->m_pOriginalPointList )
+ {
+ delete pTarget->m_pOriginalPointList;
+ pTarget->m_pOriginalPointList = NULL;
+ }
+
+ // Create a new point list and copy it over
+ pTarget->m_pOriginalPointList = new QPtrList<KivioPoint>;
+ pTarget->m_pOriginalPointList->setAutoDelete(true);
+ pPoint = m_pOriginalPointList->first();
+ while( pPoint )
+ {
+ pTarget->m_pOriginalPointList->append( new KivioPoint( *pPoint ) );
+ pPoint = m_pOriginalPointList->next();
+ }
+
+ // Copy the fill/line styles
+ m_pFillStyle->copyInto( pTarget->m_pFillStyle );
+ m_pLineStyle->copyInto( pTarget->m_pLineStyle );
+
+ // Copy the fg color
+ //pTarget->m_fgColor = m_fgColor;
+
+ // Copy the rest
+ pTarget->m_shapeType = m_shapeType;
+ pTarget->m_name = QString(m_name);
+ //pTarget->m_lineWidth = m_lineWidth;
+
+ m_position.copyInto( &(pTarget->m_position) );
+ m_dimensions.copyInto( &(pTarget->m_dimensions) );
+
+
+ // If this is a textbox, allocate & copy
+ if( m_shapeType == kstTextBox )
+ {
+ if( !pTarget->m_pTextData )
+ {
+ pTarget->m_pTextData = new KivioTextStyle();
+ }
+
+ if( m_pTextData )
+ {
+ m_pTextData->copyInto( pTarget->m_pTextData );
+ }
+ else
+ {
+ kdWarning(43000) << "KivioShapeData::copyInto() - Shape is of type text-box, but our text data doens't exist." << endl;
+ pTarget->m_pTextData->setText("");
+ pTarget->m_pTextData->setIsHtml(false);
+ pTarget->m_pTextData->setHTextAlign(Qt::AlignHCenter);
+ pTarget->m_pTextData->setVTextAlign(Qt::AlignVCenter);
+ pTarget->m_pTextData->setFont( QFont("Times",12) );
+ pTarget->m_pTextData->setColor( QColor(0,0,0) );
+ }
+ }
+ else
+ {
+ if( pTarget->m_pTextData )
+ {
+ delete pTarget->m_pTextData;
+ pTarget->m_pTextData = NULL;
+ }
+ }
+}
+
+
+/**
+ * Load this object from an XML element
+ *
+ */
+bool KivioShapeData::loadXML( const QDomElement &e )
+{
+ QDomNode node;
+ QDomElement ele;
+
+ // Maintain backwards compatibility with the eariler betas. They saved
+ // fg color and line style in this node.
+ m_pLineStyle->setColor( XmlReadColor( e, "fgColor", QColor(0,0,0) ) );
+ m_pLineStyle->setWidth( XmlReadFloat( e, "lineWidth", 1.0f ) );
+
+
+ node = e.firstChild();
+ while( !node.isNull() )
+ {
+ QString nodeName = node.nodeName();
+ ele = node.toElement();
+
+ if( nodeName == "KivioLineStyle" )
+ {
+ m_pLineStyle->loadXML( ele );
+ }
+ else if( nodeName == "KivioFillStyle" )
+ {
+ m_pFillStyle->loadXML( ele );
+ }
+ else if( nodeName == "KivioTextStyle" )
+ {
+
+ // First make sure we are a text box
+ if( m_shapeType == kstTextBox )
+ {
+ // If we don't have text data, allocate it
+ if( !m_pTextData )
+ m_pTextData = new KivioTextStyle();
+
+ m_pTextData->loadXML( ele );
+
+ } // end if m_shapeType==kstTextBox
+ }
+ else if( nodeName == "KivioText" )
+ {
+ // First make sure we are a text box
+ if( m_shapeType == kstTextBox )
+ {
+ KivioTextShapeData *pData = new KivioTextShapeData;
+
+ pData->m_text = XmlReadString( ele, "text", "" );
+ pData->m_isHtml = (bool)XmlReadInt( ele, "isHtml", (int)false );
+
+ pData->m_hTextAlign = XmlReadInt( ele, "hTextAlign", Qt::AlignHCenter );
+ pData->m_vTextAlign = XmlReadInt( ele, "vTextAlign", Qt::AlignVCenter );
+
+ // Search for the font
+ QDomNode innerNode = ele.firstChild();
+ while( !innerNode.isNull() )
+ {
+ QString innerName = innerNode.nodeName();
+ QDomElement innerE = innerNode.toElement();
+
+ if( innerName == "TextFont" )
+ {
+ pData->m_textFont.setFamily( XmlReadString(innerE, "family", "times") );
+ pData->m_textFont.setPointSize( XmlReadInt(innerE, "size", 12 ) );
+ pData->m_textFont.setBold( (bool)XmlReadInt( innerE, "bold", 12 ) );
+ pData->m_textFont.setItalic( (bool)XmlReadInt( innerE, "italic", 12 ) );
+ pData->m_textFont.setUnderline( (bool)XmlReadInt( innerE, "underline", 12 ) );
+ pData->m_textFont.setStrikeOut( (bool)XmlReadInt( innerE, "strikeOut", 12 ) );
+ pData->m_textFont.setFixedPitch( (bool)XmlReadInt( innerE, "fixedPitch", false ) );
+ pData->m_textColor = XmlReadColor( innerE, "color", QColor(0,0,0) );
+ }
+
+ innerNode = innerNode.nextSibling();
+ }
+
+ // Now convert it to a KivioTextStyle
+ if( !m_pTextData )
+ m_pTextData = new KivioTextStyle();
+
+ m_pTextData->setText( pData->m_text );
+ m_pTextData->setHTextAlign( pData->m_hTextAlign );
+ m_pTextData->setVTextAlign( pData->m_vTextAlign );
+ m_pTextData->setFont( pData->m_textFont );
+ m_pTextData->setColor( pData->m_textColor );
+
+ } // end if m_shapeType==kstTextBox
+ else
+ {
+ kdDebug(43000) << "KivioShapeData::loadXML() - Loading KivioText, but this is not a textbox!" << endl;
+ }
+ }
+
+ node = node.nextSibling();
+ }
+
+ return true;
+}
+
+/**
+ * Save this object to an XML element
+ *
+ */
+QDomElement KivioShapeData::saveXML( QDomDocument &doc )
+{
+ QDomElement e = doc.createElement("KivioShapeData");
+
+ // FIXME: Do we need to save m_pOriginalPointList
+
+ // We save all this, but we won't necessarily load it back.
+
+ // The positions
+ QDomElement posE = doc.createElement("Position");
+ XmlWriteFloat( posE, "x", m_position.x() );
+ XmlWriteFloat( posE, "y", m_position.y() );
+ e.appendChild( posE );
+
+ // The dimensions
+ QDomElement dimE = doc.createElement("Dimension");
+ XmlWriteFloat( dimE, "w", m_dimensions.x() );
+ XmlWriteFloat( dimE, "h", m_dimensions.y() );
+ e.appendChild( dimE );
+
+ // The FGColor
+// QDomElement foreE = doc.createElement("Foreground");
+// XmlWriteUInt( foreE, "color", m_fgColor.rgb() );
+// XmlWriteFloat( foreE, "lineWidth", m_lineWidth );
+// e.appendChild( foreE );
+ QDomElement foreE = m_pLineStyle->saveXML( doc );
+ e.appendChild( foreE );
+
+
+ // Save if we are a text box etc...
+ if( m_shapeType == kstTextBox )
+ {
+ if( m_pTextData )
+ {
+ e.appendChild( m_pTextData->saveXML(doc) );
+ /*
+ // The text & formatting
+ QDomElement textE = doc.createElement("KivioText");
+ XmlWriteString( textE, "text", m_pTextData->m_text );
+ XmlWriteInt( textE, "isHtml", m_pTextData->m_isHtml );
+ XmlWriteInt( textE, "hTextAlign", m_pTextData->m_hTextAlign );
+ XmlWriteInt( textE, "vTextAlign", m_pTextData->m_vTextAlign );
+
+ // Text font & color
+ QDomElement innerTextE = doc.createElement("TextFont");
+ XmlWriteString( innerTextE, "family", m_pTextData->m_textFont.family() );
+ XmlWriteColor( innerTextE, "color", m_pTextData->m_textColor );
+ XmlWriteInt( innerTextE, "size", m_pTextData->m_textFont.pointSize() );
+ XmlWriteInt( innerTextE, "bold", m_pTextData->m_textFont.bold() );
+ XmlWriteInt( innerTextE, "italic", m_pTextData->m_textFont.italic() );
+ XmlWriteInt( innerTextE, "underline", m_pTextData->m_textFont.underline() );
+ XmlWriteInt( innerTextE, "strikeOut", m_pTextData->m_textFont.strikeOut() );
+ XmlWriteInt( innerTextE, "fixedPitch", m_pTextData->m_textFont.fixedPitch() );
+
+ textE.appendChild( innerTextE );
+ e.appendChild( textE );
+ */
+ }
+ }
+
+
+
+ // The BGFillStyle
+ e.appendChild( m_pFillStyle->saveXML( doc ) );
+
+ // Shape type & name are stored in the shape node
+ //XmlWriteInt( e, "shapeType", m_shapeType );
+ //XmlWriteString( e, "name", m_name );
+
+ return e;
+}
+
+
+KivioShapeData::KivioShapeType KivioShapeData::shapeTypeFromString( const QString &str )
+{
+
+ for( int i=0; i<numShapeInfo; i++ )
+ {
+ if( str.compare( shapeInfo[i].name )==0 )
+ return shapeInfo[i].type;
+ }
+
+ return kstNone;
+}
+
+void KivioShapeData::setShapeType( KivioShapeType st )
+{
+ m_shapeType = st;
+
+ // If it is a text box, make sure we have text data
+ if( st == kstTextBox )
+ {
+ if( !m_pTextData )
+ m_pTextData = new KivioTextStyle();
+ }
+ else // Otherwise, make sure we DON'T have it.
+ {
+ if( m_pTextData )
+ {
+ delete m_pTextData;
+ m_pTextData = NULL;
+ }
+ }
+}
+
+
+QString KivioShapeData::text()
+{
+ if( m_pTextData )
+ return m_pTextData->text();
+
+ return QString("");
+}
+
+void KivioShapeData::setText( const QString &newText )
+{
+ if( m_pTextData )
+ {
+ m_pTextData->setText(newText);
+ }
+}
+
+bool KivioShapeData::isHtml() const
+{
+ if( m_pTextData )
+ return m_pTextData->isHtml();
+
+ return false;
+}
+
+void KivioShapeData::setIsHtml( bool b )
+{
+ if( m_pTextData )
+ m_pTextData->setIsHtml(b);
+}
+
+int KivioShapeData::hTextAlign() const
+{
+ if( m_pTextData )
+ return m_pTextData->hTextAlign();
+
+ return Qt::AlignHCenter;
+}
+
+void KivioShapeData::setHTextAlign( int i )
+{
+ if( m_pTextData )
+ m_pTextData->setHTextAlign(i);
+}
+
+int KivioShapeData::vTextAlign() const
+{
+ if( m_pTextData )
+ return m_pTextData->vTextAlign();
+
+ return Qt::AlignVCenter;
+}
+
+void KivioShapeData::setVTextAlign( int i )
+{
+ if( m_pTextData )
+ m_pTextData->setVTextAlign(i);
+}
+
+QFont KivioShapeData::textFont()
+{
+ if( m_pTextData )
+ return m_pTextData->font();
+
+ return QFont("Times");
+}
+
+void KivioShapeData::setTextFont( const QFont &f )
+{
+ if( m_pTextData )
+ m_pTextData->setFont(f);
+}
+
+QColor KivioShapeData::textColor()
+{
+ if( m_pTextData )
+ return m_pTextData->color();
+
+ return QColor(0,0,0);
+}
+
+void KivioShapeData::setTextColor( QColor c )
+{
+ if( m_pTextData )
+ m_pTextData->setColor(c);
+}
+
+void KivioShapeData::setTextStyle( KivioTextStyle *pStyle )
+{
+ if( m_pTextData )
+ {
+ pStyle->copyInto( m_pTextData );
+ }
+}
+
+void KivioShapeData::setLineStyle(KivioLineStyle ls)
+{
+ if(m_pLineStyle) {
+ ls.copyInto(m_pLineStyle);
+ }
+}