You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kivio/kiviopart/kiviosdk/kivio_sml_stencil.cpp

2229 lines
54 KiB

/*
* Kivio - Visual Modelling and Flowcharting
* Copyright (C) 2000-2003 theKompany.com & Dave Marotti
* Peter Simonsson
*
* 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 "kivioglobal.h"
#include "kivio_common.h"
#include "kivio_connector_point.h"
#include "kivio_connector_target.h"
#include "kivio_fill_style.h"
#include "kivio_intra_stencil_data.h"
#include "kivio_line_style.h"
#include "kivio_painter.h"
#include "kivio_screen_painter.h"
#include "kivio_shape.h"
#include "kivio_shape_data.h"
#include "kivio_sml_stencil.h"
#include "kivio_dia_stencil_spawner.h"
#include "kivio_sml_stencil_spawner.h"
#include "kivio_stencil_spawner.h"
#include "kivio_stencil_spawner_info.h"
#include "kivio_stencil_spawner_set.h"
#include <qdom.h>
#include <qpainter.h>
#include <qbrush.h>
#include <qcolor.h>
#include <qpalette.h>
#include <qrect.h>
#include <qbitmap.h>
#include <kdebug.h>
#include <KoGlobal.h>
#include <math.h>
#include <KoZoomHandler.h>
/**
* Default constructor
*
* Allocates a new shape list, connector targets, and original connector targets.
*/
KivioSMLStencil::KivioSMLStencil()
: KivioStencil(),
m_pShapeList(NULL),
m_pSubSelection(NULL),
m_pConnectorTargets(NULL)
{
m_pShapeList = new QPtrList<KivioShape>;
m_pShapeList->setAutoDelete(true);
m_pConnectorTargets = new QPtrList<KivioConnectorTarget>;
m_pConnectorTargets->setAutoDelete(true);
}
/**
* Destructor
*
* Deletes the allocated objects.
*/
KivioSMLStencil::~KivioSMLStencil()
{
delete m_pShapeList;
m_pShapeList = 0;
delete m_pConnectorTargets;
m_pConnectorTargets = 0;
m_pSubSelection = 0;
}
/**
* Loads a KivioSMLStencil from an XML node.
*/
bool KivioSMLStencil::loadXML( const QDomElement &e )
{
QDomNode node;
QDomElement ele;
node = e.firstChild();
while( !node.isNull() )
{
QString nodeName = node.nodeName();
ele = node.toElement();
if( nodeName == "Position" )
{
m_x = XmlReadFloat( ele, "x", 0.0f );
m_y = XmlReadFloat( ele, "y", 0.0f );
}
else if( nodeName == "Dimension" )
{
m_w = XmlReadFloat( ele, "w", 0.0f );
m_h = XmlReadFloat( ele, "h", 0.0f );
}
else if( nodeName == "KivioShape" )
{
// Locate the shape we are supposed to load into
KivioShape *pShape = locateShape( XmlReadString( ele, "name", "" ) );
if(pShape) {
pShape->loadXML( ele );
}
}
else if( nodeName == "KivioConnectorTargetList" )
{
loadConnectorTargetListXML( ele );
}
node = node.nextSibling();
}
return true;
}
/**
* Help function for loading from an XML node.
*/
void KivioSMLStencil::loadConnectorTargetListXML( const QDomElement &e )
{
QDomNode node;
QDomElement ele;
QString nodeName;
KivioConnectorTarget *pTarget;
pTarget = m_pConnectorTargets->first();
node = e.firstChild();
while( !node.isNull() && pTarget)
{
nodeName = node.nodeName();
ele = node.toElement();
if( nodeName == "KivioConnectorTarget" )
{
pTarget->loadXML( ele );
pTarget->setOffsets((pTarget->x() - x()) / w(), (pTarget->y() - y()) / h());
pTarget = m_pConnectorTargets->next();
}
node = node.nextSibling();
}
while(!node.isNull()) {
nodeName = node.nodeName();
ele = node.toElement();
if( nodeName == "KivioConnectorTarget" )
{
pTarget = new KivioConnectorTarget();
pTarget->loadXML( ele );
pTarget->setOffsets((pTarget->x() - x()) / w(), (pTarget->y() -y()) / h());
m_pConnectorTargets->append(pTarget);
}
node = node.nextSibling();
}
}
/**
* Locates a shape in the shape list by name.
*/
KivioShape *KivioSMLStencil::locateShape( const QString &name )
{
KivioShape *pShape;
if( name.isEmpty() )
return NULL;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->name() == name )
{
return pShape;
}
pShape = m_pShapeList->next();
}
return NULL;
}
/**
* Saves this object to an XMLELement
*/
QDomElement KivioSMLStencil::saveXML( QDomDocument &doc )
{
QDomElement e = doc.createElement("KivioSMLStencil");
XmlWriteString( e, "id", m_pSpawner->info()->id() );
XmlWriteString( e, "setId", m_pSpawner->set()->id() );
// The positions
QDomElement posE = doc.createElement("Position");
XmlWriteFloat( posE, "x", m_x );
XmlWriteFloat( posE, "y", m_y );
e.appendChild( posE );
// The dimensions
QDomElement dimE = doc.createElement("Dimension");
XmlWriteFloat( dimE, "w", m_w );
XmlWriteFloat( dimE, "h", m_h );
e.appendChild( dimE );
// Save the target list
QDomElement clE = doc.createElement("KivioConnectorTargetList");
QDomElement targetE;
KivioConnectorTarget *pTarget = m_pConnectorTargets->first();
while( pTarget )
{
targetE = pTarget->saveXML( doc );
clE.appendChild( targetE );
pTarget = m_pConnectorTargets->next();
}
e.appendChild( clE );
// The shape list
KivioShape *pShape = m_pShapeList->first();
while( pShape )
{
e.appendChild( pShape->saveXML(doc ) );
pShape = m_pShapeList->next();
}
return e;
}
/**
* Duplicates this object.
*
* Duplicates all aspects of this object except for the
* stencil connected to the targets.
*/
KivioStencil *KivioSMLStencil::duplicate()
{
KivioSMLStencil *pNewStencil = new KivioSMLStencil();
KivioStencil *pReturn;
KivioShape *pShape, *pNewShape;
pNewStencil->m_x = m_x;
pNewStencil->m_y = m_y;
pNewStencil->m_w = m_w;
pNewStencil->m_h = m_h;
pNewStencil->m_rotation = m_rotation;
pNewStencil->m_pSpawner = m_pSpawner;
// Copy the shape list
pShape = m_pShapeList->first();
while( pShape )
{
pNewShape = new KivioShape( *pShape );
pNewStencil->m_pShapeList->append( pNewShape );
pShape = m_pShapeList->next();
}
// Copy the Connector Targets
KivioConnectorTarget *pTarget = m_pConnectorTargets->first();
while( pTarget ) //&& pOriginal )
{
pNewStencil->m_pConnectorTargets->append( pTarget->duplicate() );
pTarget = m_pConnectorTargets->next();
}
*(pNewStencil->protection()) = *m_pProtection;
*(pNewStencil->canProtect()) = *m_pCanProtect;
pReturn = pNewStencil;
return pReturn;
}
/**
* Paint the outline of the stencil.
*/
void KivioSMLStencil::paintOutline( KivioIntraStencilData *pData )
{
KivioShape *pShape;
KivioShapeData *pShapeData;
m_zoomHandler = pData->zoomHandler;
pData->painter->saveState();
pData->painter->setTranslation(m_zoomHandler->zoomItX(m_x), m_zoomHandler->zoomItY(m_y));
rotatePainter(pData); // Rotate the painter if needed
pShape = m_pShapeList->first();
while( pShape )
{
pShapeData = pShape->shapeData();
switch( pShapeData->shapeType() )
{
case KivioShapeData::kstArc:
drawOutlineArc( pShape, pData );
break;
case KivioShapeData::kstPie:
drawOutlinePie( pShape, pData );
break;
case KivioShapeData::kstLineArray:
drawOutlineLineArray( pShape, pData );
break;
case KivioShapeData::kstPolyline:
drawOutlinePolyline( pShape, pData );
break;
case KivioShapeData::kstPolygon:
drawOutlinePolygon( pShape, pData );
break;
case KivioShapeData::kstBezier:
drawOutlineBezier( pShape, pData );
break;
case KivioShapeData::kstRectangle:
drawOutlineRectangle( pShape, pData );
break;
case KivioShapeData::kstRoundRectangle:
drawOutlineRoundRectangle( pShape, pData );
break;
case KivioShapeData::kstEllipse:
drawOutlineEllipse( pShape, pData );
break;
case KivioShapeData::kstOpenPath:
drawOutlineOpenPath( pShape, pData );
break;
case KivioShapeData::kstClosedPath:
drawOutlineClosedPath( pShape, pData );
break;
case KivioShapeData::kstTextBox:
drawOutlineTextBox( pShape, pData );
break;
case KivioShapeData::kstNone:
default:
kdDebug(43000) << "*** KivioShape::Paint AHHHHH!!! NO SHAPE!" << endl;
break;
}
pShape = m_pShapeList->next();
}
pData->painter->restoreState();
// Now iterate through anything connected to it drawing it as an outline
KivioConnectorTarget *pTarget;
pTarget = m_pConnectorTargets->first();
while( pTarget )
{
pTarget->paintOutline( pData );
pTarget = m_pConnectorTargets->next();
}
}
void KivioSMLStencil::drawOutlineArc( KivioShape *pShape, KivioIntraStencilData *pData )
{
double _a, _l, _x, _y, _w, _h, defWidth, defHeight;
KivioPainter *painter;
KivioShapeData *pShapeData;
KivioPoint *pPosition, *pDimensions;
KivioPoint *pPoint;
pShapeData = pShape->shapeData();
pPosition = pShapeData->position();
pDimensions = pShapeData->dimensions();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
_x = m_zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = m_zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = m_zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
pPoint = pShapeData->pointList()->first();
_a = m_zoomHandler->zoomItX(pPoint->x());
_l = m_zoomHandler->zoomItY(pPoint->y());
painter = pData->painter;
painter->drawArc( _x, _y, _w, _h, _a, _l );
}
void KivioSMLStencil::drawOutlineBezier( KivioShape *pShape, KivioIntraStencilData *pData )
{
KivioPainter *painter;
KivioShapeData *pShapeData = pShape->shapeData();
double defWidth = m_pSpawner->defWidth();
double defHeight = m_pSpawner->defHeight();
painter = pData->painter;
pShapeData = pShape->shapeData();
KivioPoint *pPoint, *pPoint2, *pPoint3, *pPoint4;
QPtrList <KivioPoint> *pPointList = pShapeData->pointList();
QPointArray controlPoints( 4 );
pPoint = pPointList->first();
pPoint2 = pPointList->next();
pPoint3 = pPointList->next();
pPoint4 = pPointList->next();
controlPoints.setPoint( 0, m_zoomHandler->zoomItX((pPoint->x() / defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint->y()/defHeight)*m_h) );
controlPoints.setPoint( 1, m_zoomHandler->zoomItX((pPoint2->x() / defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint2->y()/defHeight)*m_h));
controlPoints.setPoint( 2, m_zoomHandler->zoomItX((pPoint3->x() / defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint3->y()/defHeight)*m_h));
controlPoints.setPoint( 3, m_zoomHandler->zoomItX((pPoint4->x() / defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint4->y()/defHeight)*m_h));
painter = pData->painter;
painter->drawBezier( controlPoints );
}
void KivioSMLStencil::drawOutlineOpenPath( KivioShape *pShape, KivioIntraStencilData *pData )
{
KivioPainter *painter;
KivioShapeData *pShapeData = pShape->shapeData();
KivioPoint *pPoint, *pNewPoint;
double defWidth = m_pSpawner->defWidth();
double defHeight = m_pSpawner->defHeight();
QPtrList <KivioPoint> *pPointList = pShapeData->pointList();
QPtrList <KivioPoint> *pNewPoints = new QPtrList<KivioPoint>;
pNewPoints->setAutoDelete(true);
pPoint = pPointList->first();
while( pPoint )
{
pNewPoint = new KivioPoint( m_zoomHandler->zoomItX((pPoint->x()/defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint->y()/defHeight)*m_h),
pPoint->pointType() );
pNewPoints->append(pNewPoint);
pPoint = pPointList->next();
}
painter = pData->painter;
painter->drawOpenPath( pNewPoints );
delete pNewPoints;
}
void KivioSMLStencil::drawOutlineClosedPath( KivioShape *pShape, KivioIntraStencilData *pData )
{
KivioPainter *painter;
KivioShapeData *pShapeData = pShape->shapeData();
KivioPoint *pPoint, *pNewPoint;
double defWidth = m_pSpawner->defWidth();
double defHeight = m_pSpawner->defHeight();
QPtrList <KivioPoint> *pPointList = pShapeData->pointList();
QPtrList <KivioPoint> *pNewPoints = new QPtrList<KivioPoint>;
pNewPoints->setAutoDelete(true);
pPoint = pPointList->first();
while( pPoint )
{
pNewPoint = new KivioPoint( m_zoomHandler->zoomItX((pPoint->x()/defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint->y()/defHeight)*m_h),
pPoint->pointType() );
pNewPoints->append(pNewPoint);
pPoint = pPointList->next();
}
painter = pData->painter;
painter->drawOpenPath( pNewPoints );
delete pNewPoints;
}
void KivioSMLStencil::drawOutlineEllipse( KivioShape *pShape, KivioIntraStencilData *pData )
{
double _x, _y, _w, _h, defWidth, defHeight;
KivioPainter *painter;
KivioShapeData *pShapeData;
KivioPoint *pPosition, *pDimensions;
pShapeData = pShape->shapeData();
pPosition = pShapeData->position();
pDimensions = pShapeData->dimensions();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
_x = m_zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = m_zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = m_zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
painter = pData->painter;
painter->setFGColor( QColor(0, 0, 0) );
painter->drawEllipse( _x, _y, _w, _h );
}
void KivioSMLStencil::drawOutlineLineArray( KivioShape *pShape, KivioIntraStencilData *pData )
{
double _x, _y, defWidth, defHeight;
KivioPainter *painter;
KivioShapeData *pShapeData;
QPtrList <KivioPoint> *pList;
pShapeData = pShape->shapeData();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
pList = pShapeData->pointList();
QPointArray arr( pList->count() );
KivioPoint *pPoint;
int i=0;
pPoint = pList->first();
while( pPoint )
{
_x = m_zoomHandler->zoomItX((pPoint->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPoint->y() / defHeight) * m_h);
arr.setPoint( i, (int)_x, (int)_y );
i++;
pPoint = pList->next();
}
painter = pData->painter;
painter->drawLineArray( arr );
}
void KivioSMLStencil::drawOutlineRectangle( KivioShape *pShape, KivioIntraStencilData *pData )
{
double _x, _y, _w, _h, defWidth, defHeight;
KivioPainter *painter;
KivioShapeData *pShapeData;
KivioPoint *pPosition, *pDimensions;
pShapeData = pShape->shapeData();
pPosition = pShapeData->position();
pDimensions = pShapeData->dimensions();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
_x = m_zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = m_zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = m_zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
painter = pData->painter;
painter->setFGColor( QColor(0, 0, 0) );
painter->drawRect( _x, _y, _w, _h );
}
void KivioSMLStencil::drawOutlineRoundRectangle( KivioShape *pShape, KivioIntraStencilData *pData )
{
double _rx, _ry, _x, _y, _w, _h, defWidth, defHeight;
KivioPainter *painter;
KivioShapeData *pShapeData;
KivioPoint *pPosition, *pDimensions;
pShapeData = pShape->shapeData();
pPosition = pShapeData->position();
pDimensions = pShapeData->dimensions();
KivioPoint *pPoint;
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
pPoint = pShapeData->pointList()->first();
_rx = m_zoomHandler->zoomItX(pPoint->x());
_ry = m_zoomHandler->zoomItY(pPoint->y());
_x = m_zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = m_zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = m_zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
painter = pData->painter;
painter->setFGColor( QColor(0, 0, 0) );
painter->drawRoundRect( _x, _y, _w, _h, _rx, _ry );
}
void KivioSMLStencil::drawOutlinePie( KivioShape *, KivioIntraStencilData * )
{
}
void KivioSMLStencil::drawOutlinePolygon( KivioShape *pShape, KivioIntraStencilData *pData )
{
double _x, _y, defWidth, defHeight;
KivioPainter *painter;
KivioShapeData *pShapeData;
QPtrList <KivioPoint> *pList;
pShapeData = pShape->shapeData();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
pList = pShapeData->pointList();
QPointArray arr( pList->count() );
KivioPoint *pPoint;
int i=0;
pPoint = pList->first();
while( pPoint )
{
_x = m_zoomHandler->zoomItX((pPoint->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPoint->y() / defHeight) * m_h);
arr.setPoint( i, (int)_x, (int)_y );
i++;
pPoint = pList->next();
}
painter = pData->painter;
painter->drawPolyline( arr );
}
void KivioSMLStencil::drawOutlinePolyline( KivioShape *pShape, KivioIntraStencilData *pData )
{
double _x, _y, defWidth, defHeight;
KivioPainter *painter;
KivioShapeData *pShapeData;
QPtrList <KivioPoint> *pList;
pShapeData = pShape->shapeData();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
pList = pShapeData->pointList();
QPointArray arr( pList->count() );
KivioPoint *pPoint;
int i=0;
pPoint = pList->first();
while( pPoint )
{
_x = m_zoomHandler->zoomItX((pPoint->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPoint->y() / defHeight) * m_h);
arr.setPoint( i, (int)_x, (int)_y );
i++;
pPoint = pList->next();
}
painter = pData->painter;
painter->drawPolyline( arr );
}
void KivioSMLStencil::drawOutlineTextBox( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth = m_pSpawner->defWidth();
double defHeight = m_pSpawner->defHeight();
int _x, _y, _w, _h;
KivioShapeData *pShapeData = pShape->shapeData();
KivioPoint *pPosition = pShapeData->position();
KivioPoint *pDimensions = pShapeData->dimensions();
KivioPainter *painter = pData->painter;
KoZoomHandler* zoomHandler = pData->zoomHandler;
if( pShapeData->text().length() <= 0 ) {
return;
}
_x = zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
QPixmap pix(_w, _h);
pix.fill();
QPainter p(&pix);
QFont f = pShapeData->textFont();
f.setPointSizeFloat(f.pointSizeFloat() * (((float)zoomHandler->zoom()) / 100.0));
p.setFont( f );
p.setPen( QColor(0, 0, 0) );
int tf = pShapeData->vTextAlign() | pShapeData->hTextAlign();
p.drawText( 0, 0, _w, _h, tf | Qt::WordBreak, pShapeData->text() );
QBitmap mask;
mask = pix;
pix.setMask(mask);
painter->drawPixmap(_x, _y, pix);
}
/**
* Paints the stencil
*/
void KivioSMLStencil::paint( KivioIntraStencilData *pData )
{
KivioShape *pShape;
KivioShapeData *pShapeData;
m_zoomHandler = pData->zoomHandler;
pData->painter->saveState();
pData->painter->setTranslation(m_zoomHandler->zoomItX(m_x), m_zoomHandler->zoomItY(m_y));
rotatePainter(pData); // Rotate the painter if needed
pShape = m_pShapeList->first();
while( pShape )
{
pShapeData = pShape->shapeData();
switch( pShapeData->shapeType() )
{
case KivioShapeData::kstArc:
drawArc( pShape, pData );
break;
case KivioShapeData::kstPie:
drawPie( pShape, pData );
break;
case KivioShapeData::kstLineArray:
drawLineArray( pShape, pData );
break;
case KivioShapeData::kstPolyline:
drawPolyline( pShape, pData );
break;
case KivioShapeData::kstPolygon:
drawPolygon( pShape, pData );
break;
case KivioShapeData::kstBezier:
drawBezier( pShape, pData );
break;
case KivioShapeData::kstRectangle:
drawRectangle( pShape, pData );
break;
case KivioShapeData::kstRoundRectangle:
drawRoundRectangle( pShape, pData );
break;
case KivioShapeData::kstEllipse:
drawEllipse( pShape, pData );
break;
case KivioShapeData::kstOpenPath:
drawOpenPath( pShape, pData );
break;
case KivioShapeData::kstClosedPath:
drawClosedPath( pShape, pData );
break;
case KivioShapeData::kstTextBox:
drawTextBox( pShape, pData );
break;
case KivioShapeData::kstNone:
default:
break;
}
pShape = m_pShapeList->next();
}
pData->painter->restoreState();
}
/**
* Paints the connector targets of this stencil.
*/
void KivioSMLStencil::paintConnectorTargets( KivioIntraStencilData *pData )
{
// We don't draw these if we are selected!!!
//if( isSelected() == true ) {
// return;
//}
QPixmap targetPic;
KivioPainter *painter;
int x, y;
// Obtain the graphic used for KivioConnectorTargets
targetPic = Kivio::connectorTargetPixmap();
m_zoomHandler = pData->zoomHandler;
painter = pData->painter;
KivioConnectorTarget *pTarget;
pTarget = m_pConnectorTargets->first();
while( pTarget )
{
x = m_zoomHandler->zoomItX(pTarget->x());
y = m_zoomHandler->zoomItY(pTarget->y());
painter->drawPixmap( x-3, y-3, targetPic );
pTarget = m_pConnectorTargets->next();
}
}
void KivioSMLStencil::drawArc( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth, defHeight;
int _a, _l, _x, _y, _w, _h;
KivioPainter *painter;
KivioShapeData *pShapeData;
KivioPoint *pPosition, *pDimensions;
KivioPoint *pPoint;
pShapeData = pShape->shapeData();
pPosition = pShapeData->position();
pDimensions = pShapeData->dimensions();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
_x = m_zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = m_zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = m_zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
pPoint = pShapeData->pointList()->first();
_a = m_zoomHandler->zoomItX(pPoint->x());
_l = m_zoomHandler->zoomItY(pPoint->y());
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
switch( pShapeData->fillStyle()->colorStyle() )
{
case KivioFillStyle::kcsNone: // Hollow
painter->drawArc( _x, _y, _w, _h, _a, _l );
break;
case KivioFillStyle::kcsSolid: // Solid fill
case KivioFillStyle::kcsGradient: // Gradient
painter->setFillStyle( pShapeData->fillStyle() );
painter->drawArc( _x, _y, _w, _h, _a, _l );
break;
case KivioFillStyle::kcsPixmap:
default:
break;
}
}
void KivioSMLStencil::drawBezier( KivioShape *pShape, KivioIntraStencilData *pData )
{
KivioPainter *painter;
KivioShapeData *pShapeData = pShape->shapeData();
double defWidth = m_pSpawner->defWidth();
double defHeight = m_pSpawner->defHeight();
painter = pData->painter;
pShapeData = pShape->shapeData();
KivioPoint *pPoint, *pPoint2, *pPoint3, *pPoint4;
QPtrList <KivioPoint> *pPointList = pShapeData->pointList();
QPointArray controlPoints( 4 );
pPoint = pPointList->first();
pPoint2 = pPointList->next();
pPoint3 = pPointList->next();
pPoint4 = pPointList->next();
controlPoints.setPoint( 0, m_zoomHandler->zoomItX((pPoint->x() / defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint->y()/defHeight)*m_h));
controlPoints.setPoint( 1, m_zoomHandler->zoomItX((pPoint2->x() / defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint2->y()/defHeight)*m_h));
controlPoints.setPoint( 2, m_zoomHandler->zoomItX((pPoint3->x() / defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint3->y()/defHeight)*m_h));
controlPoints.setPoint( 3, m_zoomHandler->zoomItX((pPoint4->x() / defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint4->y()/defHeight)*m_h));
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
painter->drawBezier( controlPoints );
}
void KivioSMLStencil::drawOpenPath( KivioShape *pShape, KivioIntraStencilData *pData )
{
KivioPainter *painter;
KivioShapeData *pShapeData = pShape->shapeData();
KivioPoint *pPoint, *pNewPoint;
double defWidth = m_pSpawner->defWidth();
double defHeight = m_pSpawner->defHeight();
QPtrList <KivioPoint> *pPointList = pShapeData->pointList();
QPtrList <KivioPoint> *pNewPoints = new QPtrList<KivioPoint>;
pNewPoints->setAutoDelete(true);
pPoint = pPointList->first();
while( pPoint )
{
pNewPoint = new KivioPoint( m_zoomHandler->zoomItX((pPoint->x()/defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint->y()/defHeight)*m_h),
pPoint->pointType() );
pNewPoints->append(pNewPoint);
pPoint = pPointList->next();
}
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
painter->drawOpenPath( pNewPoints );
delete pNewPoints;
}
void KivioSMLStencil::drawClosedPath( KivioShape *pShape, KivioIntraStencilData *pData )
{
KivioPainter *painter;
KivioShapeData *pShapeData = pShape->shapeData();
KivioPoint *pPoint, *pNewPoint;
double defWidth = m_pSpawner->defWidth();
double defHeight = m_pSpawner->defHeight();
QPtrList <KivioPoint> *pPointList = pShapeData->pointList();
QPtrList <KivioPoint> *pNewPoints = new QPtrList<KivioPoint>;
pNewPoints->setAutoDelete(true);
pPoint = pPointList->first();
while( pPoint )
{
pNewPoint = new KivioPoint( m_zoomHandler->zoomItX((pPoint->x()/defWidth)*m_w),
m_zoomHandler->zoomItY((pPoint->y()/defHeight)*m_h),
pPoint->pointType() );
pNewPoints->append(pNewPoint);
pPoint = pPointList->next();
}
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
switch( pShapeData->fillStyle()->colorStyle() )
{
case KivioFillStyle::kcsNone: // Hollow
painter->drawOpenPath( pNewPoints );
break;
case KivioFillStyle::kcsSolid: // Solid fill
case KivioFillStyle::kcsGradient: // Gradient
painter->setFillStyle( pShapeData->fillStyle() );
painter->drawClosedPath( pNewPoints );
break;
case KivioFillStyle::kcsPixmap:
default:
break;
}
delete pNewPoints;
}
void KivioSMLStencil::drawPie( KivioShape *, KivioIntraStencilData * )
{
}
void KivioSMLStencil::drawEllipse( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth, defHeight;
int _x, _y, _w, _h;
KivioPainter *painter;
KivioShapeData *pShapeData;
KivioPoint *pPosition, *pDimensions;
pShapeData = pShape->shapeData();
pPosition = pShapeData->position();
pDimensions = pShapeData->dimensions();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
_x = m_zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = m_zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = m_zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
switch( pShapeData->fillStyle()->colorStyle() )
{
case KivioFillStyle::kcsNone: // Hollow
painter->drawEllipse( _x, _y, _w, _h );
break;
case KivioFillStyle::kcsSolid: // Solid fill
case KivioFillStyle::kcsGradient: // Gradient
painter->setFillStyle( pShapeData->fillStyle() );
painter->fillEllipse( _x, _y, _w, _h );
break;
case KivioFillStyle::kcsPixmap:
default:
break;
}
}
void KivioSMLStencil::drawLineArray( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth, defHeight;
int _x, _y;
KivioPainter *painter;
KivioShapeData *pShapeData;
QPtrList <KivioPoint> *pList;
pShapeData = pShape->shapeData();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
pList = pShapeData->pointList();
QPointArray arr( pList->count() );
KivioPoint *pPoint;
int i=0;
pPoint = pList->first();
while( pPoint )
{
_x = m_zoomHandler->zoomItX((pPoint->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPoint->y() / defHeight) * m_h);
arr.setPoint( i, _x, _y );
i++;
pPoint = pList->next();
}
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
painter->drawLineArray( arr );
}
void KivioSMLStencil::drawRectangle( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth, defHeight;
int _x, _y, _w, _h;
KivioPainter *painter;
KivioShapeData *pShapeData;
KivioPoint *pPosition, *pDimensions;
pShapeData = pShape->shapeData();
pPosition = pShapeData->position();
pDimensions = pShapeData->dimensions();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
_x = m_zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = m_zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = m_zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
switch( pShapeData->fillStyle()->colorStyle() )
{
case KivioFillStyle::kcsNone: // Hollow
painter->drawRect( _x, _y, _w, _h );
break;
case KivioFillStyle::kcsSolid: // Solid fill
case KivioFillStyle::kcsGradient: // Gradient
painter->setFillStyle( pShapeData->fillStyle() );
painter->fillRect( _x, _y, _w, _h );
break;
case KivioFillStyle::kcsPixmap:
default:
break;
}
}
void KivioSMLStencil::drawRoundRectangle( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth, defHeight;
int _rx, _ry, _x, _y, _w, _h;
KivioPainter *painter;
KivioShapeData *pShapeData;
KivioPoint *pPosition, *pDimensions;
KivioPoint *pPoint;
pShapeData = pShape->shapeData();
pPosition = pShapeData->position();
pDimensions = pShapeData->dimensions();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
_x = m_zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
_w = m_zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
_h = m_zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
pPoint = pShapeData->pointList()->first();
_rx = m_zoomHandler->zoomItX(pPoint->x());
_ry = m_zoomHandler->zoomItY(pPoint->y());
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
switch( pShapeData->fillStyle()->colorStyle() )
{
case KivioFillStyle::kcsNone: // Hollow
painter->drawRoundRect( _x, _y, _w, _h, _rx, _ry );
break;
case KivioFillStyle::kcsSolid: // Solid fill
case KivioFillStyle::kcsGradient: // Gradient
painter->setFillStyle( pShapeData->fillStyle() );
painter->fillRoundRect( _x, _y, _w, _h, _rx, _ry );
break;
case KivioFillStyle::kcsPixmap:
default:
break;
}
}
void KivioSMLStencil::drawPolygon( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth, defHeight;
int _x, _y;
KivioPainter *painter;
KivioShapeData *pShapeData;
QPtrList <KivioPoint> *pList;
pShapeData = pShape->shapeData();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
pList = pShapeData->pointList();
QPointArray arr( pList->count() );
KivioPoint *pPoint;
int i=0;
pPoint = pList->first();
while( pPoint )
{
_x = m_zoomHandler->zoomItX((pPoint->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPoint->y() / defHeight) * m_h);
arr.setPoint( i, _x, _y );
i++;
pPoint = pList->next();
}
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
switch( pShapeData->fillStyle()->colorStyle() )
{
case KivioFillStyle::kcsNone: // Hollow
painter->drawPolygon(arr);
break;
case KivioFillStyle::kcsSolid: // Solid fill
case KivioFillStyle::kcsGradient: // Gradient
painter->setFillStyle( pShapeData->fillStyle() );
painter->drawPolygon(arr);
break;
case KivioFillStyle::kcsPixmap:
default:
break;
}
}
void KivioSMLStencil::drawPolyline( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth, defHeight;
int _x, _y;
KivioPainter *painter;
KivioShapeData *pShapeData;
QPtrList <KivioPoint> *pList;
pShapeData = pShape->shapeData();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
pList = pShapeData->pointList();
QPointArray arr( pList->count() );
KivioPoint *pPoint;
int i=0;
pPoint = pList->first();
while( pPoint )
{
_x = m_zoomHandler->zoomItX((pPoint->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPoint->y() / defHeight) * m_h);
arr.setPoint( i, _x, _y );
i++;
pPoint = pList->next();
}
painter = pData->painter;
painter->setLineStyle(pShapeData->lineStyle());
double lineWidth = pShapeData->lineStyle()->width();
painter->setLineWidth(m_zoomHandler->zoomItY(lineWidth));
painter->drawPolyline(arr);
}
void KivioSMLStencil::drawTextBox( KivioShape *pShape, KivioIntraStencilData *pData )
{
double defWidth = m_pSpawner->defWidth();
double defHeight = m_pSpawner->defHeight();
KivioShapeData *pShapeData = pShape->shapeData();
KivioPoint *pPosition = pShapeData->position();
KivioPoint *pDimensions = pShapeData->dimensions();
KivioPainter *painter = pData->painter;
KoZoomHandler* zoomHandler = pData->zoomHandler;
if(pShapeData->text().isEmpty()) {
return;
}
int _x = zoomHandler->zoomItX((pPosition->x() / defWidth) * m_w);
int _y = zoomHandler->zoomItY((pPosition->y() / defHeight) * m_h);
int _w = zoomHandler->zoomItX((pDimensions->x() / defWidth) * m_w) + 1;
int _h = zoomHandler->zoomItY((pDimensions->y() / defHeight) * m_h) + 1;
QFont f = pShapeData->textFont();
f.setPointSizeFloat(f.pointSizeFloat() * (((float)zoomHandler->zoom()) / 100.0));
painter->setFont( f );
painter->setTextColor( pShapeData->textColor() );
int tf = pShapeData->vTextAlign() | pShapeData->hTextAlign();
painter->drawText( _x, _y, _w, _h, tf | Qt::WordBreak, pShapeData->text() );
// TODO Implement richtext support
}
/**
* Set the fg color of this stencil.
*/
void KivioSMLStencil::setFGColor( QColor c )
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
pShape->shapeData()->lineStyle()->setColor( c );
pShape = m_pShapeList->next();
}
}
/**
* Set the bg color of this stencil.
*/
void KivioSMLStencil::setBGColor( QColor c )
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
pShape->shapeData()->fillStyle()->setColor( c );
pShape = m_pShapeList->next();
}
}
void KivioSMLStencil::setFillPattern(int p)
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
pShape->shapeData()->fillStyle()->setBrushStyle( static_cast<Qt::BrushStyle>(p) );
pShape = m_pShapeList->next();
}
}
/**
* Set the text color of this stencil.
*/
void KivioSMLStencil::setTextColor( QColor c )
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
pShape->shapeData()->setTextColor( c );
pShape = m_pShapeList->next();
}
}
/**
* Set the text font of this stencil
*/
void KivioSMLStencil::setTextFont( const QFont &f )
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
pShape->shapeData()->setTextFont( f );
pShape = m_pShapeList->next();
}
}
/**
* Set the line width of this stencil.
*/
void KivioSMLStencil::setLineWidth( double f )
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
pShape->shapeData()->lineStyle()->setWidth( f );
pShape = m_pShapeList->next();
}
}
void KivioSMLStencil::setLinePattern(int p)
{
KivioShape *pShape = m_pShapeList->first();
while( pShape )
{
pShape->shapeData()->lineStyle()->setStyle( p );
pShape = m_pShapeList->next();
}
}
/**
* Attempts to connect a KivioConnectorPoint to this stencil.
*
* This function will attempt to locate a KivioConnectorTarget in this
* stencil with-in a given threshold. If it finds it, it will connect
* the point to it, and return the target of the connection.
*/
KivioConnectorTarget *KivioSMLStencil::connectToTarget( KivioConnectorPoint *p, double threshHold )
{
double px = p->x();
double py = p->y();
double tx, ty;
KivioConnectorTarget *pTarget = m_pConnectorTargets->first();
while( pTarget )
{
tx = pTarget->x();
ty = pTarget->y();
if( px >= tx - threshHold &&
px <= tx + threshHold &&
py >= ty - threshHold &&
py <= ty + threshHold )
{
// setTarget calls pTarget->addConnectorPoint() and removes
// any previous connections from p
p->setTarget( pTarget );
return pTarget;
}
pTarget = m_pConnectorTargets->next();
}
return NULL;
}
KoPoint KivioSMLStencil::snapToTarget( const KoPoint& p, double thresh, bool& hit )
{
KoPoint retVal = p;
double tx, ty;
hit = false;
KivioConnectorTarget *pTarget = m_pConnectorTargets->first();
while( pTarget )
{
tx = pTarget->x();
ty = pTarget->y();
if( retVal.x() >= tx - thresh &&
retVal.x() <= tx + thresh &&
retVal.y() >= ty - thresh &&
retVal.y() <= ty + thresh )
{
retVal.setX(tx);
retVal.setY(ty);
hit = true;
}
pTarget = m_pConnectorTargets->next();
}
return retVal;
}
/**
* Connects a KivioConnectorPoint to this stencil via targetID.
*
* This function is called during loads, *ONLY* loads.
*/
KivioConnectorTarget *KivioSMLStencil::connectToTarget( KivioConnectorPoint *p, int /*targetID*/ )
{
int id = p->targetId();
KivioConnectorTarget *pTarget = m_pConnectorTargets->first();
while( pTarget )
{
if( pTarget->id() == id )
{
p->setTarget(pTarget);
return pTarget;
}
pTarget = m_pConnectorTargets->next();
}
return NULL;
}
/**
* Updates the geometry of this stencil.
*
* This function rearranges the KivioConnectorTargets to reflect
* that of the width/height/position.
*/
void KivioSMLStencil::updateGeometry()
{
//kdDebug(43000) << "m_x = " << m_x << " m_y = " << m_y << endl;
QWMatrix m;
m.translate(m_x, m_y);
m.translate(m_w / 2.0, m_h / 2.0);
m.rotate(m_rotation);
m.translate(-m_w / 2.0, -m_h / 2.0);
KivioConnectorTarget* pTarget = m_pConnectorTargets->first();
while( pTarget )
{
double _x = pTarget->xOffset() * m_w;
double _y = pTarget->yOffset() * m_h;
double newX = _x * m.m11() + _y * m.m21() + m.dx();
double newY = _x * m.m12() + _y * m.m22() + m.dy();
pTarget->setPosition( newX, newY );
pTarget = m_pConnectorTargets->next();
}
}
/**
* Gets the font of this stencil
*/
QFont KivioSMLStencil::textFont()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox )
{
return pShape->shapeData()->textFont();
}
pShape = m_pShapeList->next();
}
//return QFont("times",12);
return KoGlobal::defaultFont();
}
QColor KivioSMLStencil::textColor()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox )
{
return pShape->shapeData()->textColor();
}
pShape = m_pShapeList->next();
}
return QColor(0, 0, 0);
}
/**
* Sets the horizontal alignemnt of this stencil.
*/
void KivioSMLStencil::setHTextAlign(int i)
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox )
pShape->shapeData()->setHTextAlign( i );
pShape = m_pShapeList->next();
}
}
/**
* Set the vertical alignment of this stencil
*/
void KivioSMLStencil::setVTextAlign(int i)
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox )
pShape->shapeData()->setVTextAlign( i );
pShape = m_pShapeList->next();
}
}
/**
* Get the horizontal alignment of this stencil.
*/
int KivioSMLStencil::hTextAlign()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox )
{
return pShape->shapeData()->hTextAlign();
}
pShape = m_pShapeList->next();
}
return 1;
}
/**
* Get the vertical text alignment of this stencil.
*/
int KivioSMLStencil::vTextAlign()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox )
{
return pShape->shapeData()->vTextAlign();
}
pShape = m_pShapeList->next();
}
return 1;
}
/**
* Get the text of this stencil
*/
QString KivioSMLStencil::text()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox )
{
return pShape->shapeData()->text();
}
pShape = m_pShapeList->next();
}
return QString("");
}
/**
* Set the text of this stencil
*/
void KivioSMLStencil::setText( const QString &t )
{
KivioShape *pShape;
pShape = m_pShapeList->first();
while( pShape )
{
if( pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox )
{
pShape->shapeData()->setText(t);
}
pShape = m_pShapeList->next();
}
}
/**
* Get the line width of this stencil
*/
double KivioSMLStencil::lineWidth()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
if( pShape )
return pShape->shapeData()->lineStyle()->width();
return 1.0f;
}
int KivioSMLStencil::linePattern()
{
KivioShape *pShape = m_pShapeList->first();
if( pShape )
return pShape->shapeData()->lineStyle()->style();
return 1;
}
/**
* Get the Fg color of a stencil
*/
QColor KivioSMLStencil::fgColor()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
if( pShape )
return pShape->shapeData()->lineStyle()->color();
return QColor(0,0,0);
}
/**
* Get the bg color of this stencil.
*/
QColor KivioSMLStencil::bgColor()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
if( pShape )
return pShape->shapeData()->fillStyle()->color();
return QColor(0,0,0);
}
int KivioSMLStencil::fillPattern()
{
KivioShape *pShape;
pShape = m_pShapeList->first();
if( pShape )
return pShape->shapeData()->fillStyle()->brushStyle();
return 1;
}
/**
* Generates the ids for anything needed by this stencil
*/
int KivioSMLStencil::generateIds( int nextAvailable )
{
KivioConnectorTarget *pTarget = m_pConnectorTargets->first();
// Iterate through all the targets
while( pTarget )
{
// If this target has something connected to it
if( pTarget->hasConnections() )
{
// Set it's id to the next available id
pTarget->setId( nextAvailable );
// Increment the next available id
nextAvailable++;
}
else
{
// Otherwise mark it as unused (-1)
pTarget->setId( -1 );
}
pTarget = m_pConnectorTargets->next();
}
// Return the next availabe id
return nextAvailable;
}
/**
* Check for a collision in this stencil.
*/
KivioCollisionType KivioSMLStencil::checkForCollision( KoPoint *pPoint, double )
{
KivioCollisionType type = kctNone;
QWMatrix m;
m.translate(m_x, m_y);
m.translate(m_w / 2.0, m_h / 2.0);
m.rotate(m_rotation);
m.translate(-m_w / 2.0, -m_h / 2.0);
KoPoint pPoints[4];
pPoints[0].setX(0 * m.m11() + 0 * m.m21() + m.dx());
pPoints[0].setY(0 * m.m12() + 0 * m.m22() + m.dy());
pPoints[1].setX(m_w * m.m11() + 0 * m.m21() + m.dx());
pPoints[1].setY(m_w * m.m12() + 0 * m.m22() + m.dy());
pPoints[2].setX(m_w * m.m11() + m_h * m.m21() + m.dx());
pPoints[2].setY(m_w * m.m12() + m_h * m.m22() + m.dy());
pPoints[3].setX(0 * m.m11() + m_h * m.m21() + m.dx());
pPoints[3].setY(0 * m.m12() + m_h * m.m22() + m.dy());
if(PointInPoly(pPoints, 4, pPoint)) {
type = kctBody;
}
return type;
}
bool KivioSMLStencil::checkCollisionArc( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionBezier( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionOpenPath( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionClosedPath( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionPie( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionEllipse( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionLineArray( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionRectangle( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionRoundRectangle( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionPolygon( KivioShape *pShape, KoPoint *pCheckPoint )
{
double _x, _y, defWidth, defHeight;
KivioShapeData *pShapeData;
QPtrList<KivioPoint> *pList;
KoPoint *pPoints;
pShapeData = pShape->shapeData();
defWidth = m_pSpawner->defWidth();
defHeight = m_pSpawner->defHeight();
pList = pShapeData->pointList();
pPoints = new KoPoint[pList->count()];
KivioPoint *pPoint;
int i=0;
pPoint = pList->first();
while( pPoint )
{
_x = m_zoomHandler->zoomItX((pPoint->x() / defWidth) * m_w);
_y = m_zoomHandler->zoomItY((pPoint->y() / defHeight) * m_h);
pPoints[i].setX(_x);
pPoints[i].setY(_y);
i++;
pPoint = pList->next();
}
if( PointInPoly( pPoints, i, pCheckPoint ) )
{
delete [] pPoints;
return true;
}
delete [] pPoints;
return false;
}
bool KivioSMLStencil::checkCollisionPolyline( KivioShape *, KoPoint * )
{
return false;
}
bool KivioSMLStencil::checkCollisionTextBox( KivioShape *, KoPoint * )
{
return false;
}
/**
* Return a set of bits representing what resize handles are available.
*/
int KivioSMLStencil::resizeHandlePositions()
{
// Calculate the resize handle positions
int mask = KIVIO_RESIZE_HANDLE_POSITION_ALL;
if( m_pProtection->at( kpWidth ) )
{
mask &= ~(krhpNE | krhpNW | krhpSW | krhpSE | krhpE | krhpW);
}
if( m_pProtection->at( kpHeight ) )
{
mask &= ~(krhpNE | krhpNW | krhpSW | krhpSE | krhpN | krhpS);
}
if( m_pProtection->at( kpAspect ) )
{
mask = KIVIO_RESIZE_HANDLE_POSITION_CORNERS;
}
return mask;
}
KivioLineStyle KivioSMLStencil::lineStyle()
{
KivioShape *pShape = m_pShapeList->first();
if( pShape )
return *(pShape->shapeData()->lineStyle());
return KivioLineStyle();
}
void KivioSMLStencil::setLineStyle(KivioLineStyle ls)
{
KivioShape *pShape = m_pShapeList->first();
while( pShape )
{
pShape->shapeData()->setLineStyle(ls);;
pShape = m_pShapeList->next();
}
}
QString KivioSMLStencil::getTextBoxName(const KoPoint& p)
{
KivioShape* pShape = m_pShapeList->first();
KivioShape* first = 0;
KoPoint pos = p;
// Calculate the rotation...
QWMatrix m;
m.translate(m_x, m_y);
m.translate(m_w / 2.0, m_h / 2.0);
m.rotate(m_rotation);
m.translate(-m_w / 2.0, -m_h / 2.0);
while(pShape)
{
if(pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox)
{
double x = pShape->shapeData()->x();
double y = pShape->shapeData()->y();
double x2 = pShape->shapeData()->w() + x;
double y2 = pShape->shapeData()->h() + y;
// Create the rotated rectangle
KoPoint pPoints[4];
pPoints[0].setX(x * m.m11() + y * m.m21() + m.dx());
pPoints[0].setY(x * m.m12() + y * m.m22() + m.dy());
pPoints[1].setX(x2 * m.m11() + y * m.m21() + m.dx());
pPoints[1].setY(x2 * m.m12() + y * m.m22() + m.dy());
pPoints[2].setX(x2 * m.m11() + y2 * m.m21() + m.dx());
pPoints[2].setY(x2 * m.m12() + y2 * m.m22() + m.dy());
pPoints[3].setX(x * m.m11() + y2 * m.m21() + m.dx());
pPoints[3].setY(x * m.m12() + y2 * m.m22() + m.dy());
if(PointInPoly(pPoints, 4, &pos)) {
return pShape->shapeData()->name();
}
if(!first) {
first = pShape;
}
}
pShape = m_pShapeList->next();
}
if(first) {
return first->shapeData()->name();
}
return QString::null;
}
void KivioSMLStencil::setText(const QString& text, const QString& name)
{
KivioShape* pShape = m_pShapeList->first();
while(pShape)
{
if(pShape->shapeData()->name() == name)
{
pShape->shapeData()->setText(text);
return;
}
pShape = m_pShapeList->next();
}
}
QString KivioSMLStencil::text(const QString& name)
{
KivioShape* pShape = m_pShapeList->first();
while(pShape)
{
if(pShape->shapeData()->name() == name)
{
return pShape->shapeData()->text();
}
pShape = m_pShapeList->next();
}
return QString::null;
}
void KivioSMLStencil::addConnectorTarget(const KoPoint& p)
{
KivioConnectorTarget* target = new KivioConnectorTarget(p.x(), p.y(), (p.x() - x())/ w(), (p.y() - y())/ h());
m_pConnectorTargets->append(target);
}
void KivioSMLStencil::removeConnectorTarget(const KoPoint& pos)
{
KivioConnectorTarget* target = m_pConnectorTargets->first();
while(target)
{
if(target->position() == pos)
{
m_pConnectorTargets->remove(target);
return;
}
target = m_pConnectorTargets->next();
}
}
bool KivioSMLStencil::hasTextBox() const
{
KivioShape* pShape = m_pShapeList->first();
while(pShape) {
if(pShape->shapeData()->shapeType() == KivioShapeData::kstTextBox) {
return true;
}
pShape = m_pShapeList->next();
}
return false;
}
QColor KivioSMLStencil::textColor(const QString& textBoxName)
{
KivioShape* shape = locateShape(textBoxName);
if(!shape)
return textColor();
return shape->shapeData()->textColor();
}
void KivioSMLStencil::setTextColor(const QString& textBoxName, const QColor& color)
{
KivioShape* shape = locateShape(textBoxName);
// If we didn't find the shape set the color stencil wide
if(!shape) {
setTextColor(color);
return;
}
shape->shapeData()->setTextColor(color);
}
QFont KivioSMLStencil::textFont(const QString& textBoxName)
{
KivioShape* shape = locateShape(textBoxName);
if(!shape)
return textFont();
return shape->shapeData()->textFont();
}
void KivioSMLStencil::setTextFont(const QString& textBoxName, const QFont& font)
{
KivioShape* shape = locateShape(textBoxName);
if(!shape) {
setTextFont(font);
return;
}
shape->shapeData()->setTextFont(font);
}
int KivioSMLStencil::hTextAlign(const QString& textBoxName)
{
KivioShape* shape = locateShape(textBoxName);
if(!shape)
return hTextAlign();
return shape->shapeData()->hTextAlign();
}
int KivioSMLStencil::vTextAlign(const QString& textBoxName)
{
KivioShape* shape = locateShape(textBoxName);
if(!shape)
return vTextAlign();
return shape->shapeData()->vTextAlign();
}
void KivioSMLStencil::setHTextAlign(const QString& textBoxName, int align)
{
KivioShape* shape = locateShape(textBoxName);
if(!shape) {
setHTextAlign(align);
return;
}
shape->shapeData()->setHTextAlign(align);
}
void KivioSMLStencil::setVTextAlign(const QString& textBoxName, int align)
{
KivioShape* shape = locateShape(textBoxName);
if(!shape) {
setVTextAlign(align);
return;
}
shape->shapeData()->setVTextAlign(align);
}