21#include "sml_connector.h"
23#include "kivio_common.h"
24#include "kivio_connector_target.h"
25#include "kivio_layer.h"
26#include "kivio_line_style.h"
27#include "kivio_page.h"
28#include "kivio_painter.h"
29#include "kivio_stencil.h"
30#include "kivio_stencil_spawner.h"
31#include "kivio_stencil_spawner_info.h"
32#include "kivio_stencil_spawner_set.h"
33#include "kivio_text_style.h"
34#include "kivio_shape.h"
35#include "kivio_shape_data.h"
36#include "kivio_point.h"
43#include <KoZoomHandler.h>
44#include <kiconloader.h>
46static KivioStencilSpawnerInfo sinfo = KivioStencilSpawnerInfo(
"Ian Reinhart Geiser",
"SML Connector",
"SML Connector",
"SML Based Connector",
"0.1",
"http://localhost/",
"",
"off" );
47#include <kgenericfactory.h>
49K_EXPORT_COMPONENT_FACTORY( sml_connector, KGenericFactory<KivioSMLConnectorFactory>(
"KivioSMLConnectorFactory" ) )
51KivioSMLConnectorFactory::KivioSMLConnectorFactory( TQObject *parent, const
char* name, const TQStringList& args ) :
52 KivioStencilFactory( parent, name, args )
54 kdDebug(43000) <<
"new sml stencil factory: " << endl;
57KivioStencil *KivioSMLConnectorFactory::NewStencil(
const TQString& name )
59 return new KivioSMLConnector( name );
62KivioStencil *KivioSMLConnectorFactory::NewStencil()
64 return new KivioSMLConnector(
"basic_line" );
68TQPixmap *KivioSMLConnectorFactory::GetIcon()
70 return & BarIcon(
"SML_conn" );
73KivioStencilSpawnerInfo *KivioSMLConnectorFactory::GetSpawnerInfo()
78KivioSMLConnector::KivioSMLConnector(
const TQString &name )
79 : Kivio1DStencil(), m_name( name )
82 m_pStart->setPosition( 0.0f, 0.0f,
false );
83 m_pEnd->setPosition( 72.0f, 72.0f,
false );
85 m_startAH =
new KivioArrowHead();
86 m_endAH =
new KivioArrowHead();
90 m_pCanProtect->clearBit( kpAspect );
91 m_pCanProtect->clearBit( kpWidth );
92 m_pCanProtect->clearBit( kpHeight );
93 m_pCanProtect->clearBit( kpX );
94 m_pCanProtect->clearBit( kpY );
97 setType( kstConnector );
105KivioSMLConnector::~KivioSMLConnector()
111void KivioSMLConnector::setStartPoint(
double x,
double y )
113 m_pStart->setPosition( x, y,
false );
114 m_pStart->disconnect();
118 m_pTextConn->setPosition( ( m_pEnd->x() + m_pStart->x() ) / 2.0f,
119 ( m_pEnd->y() + m_pStart->y() ) / 2.0f,
124 m_pConnectorPoints ->first() ->setX( x );
125 m_pConnectorPoints ->first() ->setY( y );
129void KivioSMLConnector::setEndPoint(
double x,
double y )
131 m_pEnd->setPosition( x, y,
false );
132 m_pEnd->disconnect();
133 m_pConnectorPoints ->last() ->setX( x );
134 m_pConnectorPoints ->last() ->setY( y );
137KivioCollisionType KivioSMLConnector::checkForCollision( KivioPoint *p,
double threshold )
139 const double end_thresh = 4.0f;
144 KivioConnectorPoint *pPoint;
146 int i = kctCustom + 1;
147 pPoint = m_pConnectorPoints->first();
150 if ( px >= pPoint->x() - end_thresh &&
151 px <= pPoint->x() + end_thresh &&
152 py >= pPoint->y() - end_thresh &&
153 py <= pPoint->y() + end_thresh )
155 return ( KivioCollisionType ) i;
159 pPoint = m_pConnectorPoints->next();
163 if ( collisionLine( m_pStart->x(), m_pStart->y(),
164 m_pEnd->x(), m_pEnd->y(),
174KivioStencil *KivioSMLConnector::duplicate()
176 KivioSMLConnector * pStencil =
new KivioSMLConnector( m_name );
182 pStencil->setStartAHType( m_startAH->type() );
183 pStencil->setStartAHWidth( m_startAH->width() );
184 pStencil->setStartAHLength( m_startAH->length() );
186 pStencil->setEndAHType( m_endAH->type() );
187 pStencil->setEndAHWidth( m_endAH->width() );
188 pStencil->setEndAHLength( m_endAH->length() );
190 *( pStencil->protection() ) = *m_pProtection;
191 *( pStencil->canProtect() ) = *m_pCanProtect;
226void KivioSMLConnector::paint( KivioIntraStencilData *pData )
228 KivioPainter * painter = pData->painter;
229 KoZoomHandler* zoomHandler = pData->zoomHandler;
230 double x1, y1, x2, y2;
235 painter->setFGColor( m_pLineStyle->color() );
236 painter->setLineWidth( zoomHandler->zoomItY( m_pLineStyle->width() ) );
238 x1 = zoomHandler->zoomItX( m_pStart->x() );
239 x2 = zoomHandler->zoomItX( m_pEnd->x() );
241 y1 = zoomHandler->zoomItY( m_pStart->y() );
242 y2 = zoomHandler->zoomItY( m_pEnd->y() );
246 vecX = m_pEnd->x() - m_pStart->x();
247 vecY = m_pEnd->y() - m_pStart->y();
250 len = sqrt( vecX * vecX + vecY * vecY );
257 x1 += vecX * zoomHandler->zoomItX( m_startAH->cut() );
258 y1 += vecY * zoomHandler->zoomItY( m_startAH->cut() );
260 x2 -= vecX * zoomHandler->zoomItX( m_endAH->cut() );
261 y2 -= vecY * zoomHandler->zoomItY( m_endAH->cut() );
268 TQPtrList <KivioPoint> *pNewPoints =
new TQPtrList<KivioPoint>;
269 pNewPoints->setAutoDelete(
true );
271 pNewPoints->append(
new KivioPoint( zoomHandler->zoomItX( m_pStart->x() ),
272 zoomHandler->zoomItY( m_pStart->y() )));
274 KivioConnectorPoint *pPoint = m_PointList.first();
277 KivioPoint *pNewPoint =
new KivioPoint( zoomHandler->zoomItX( pPoint->x() ),
278 zoomHandler->zoomItY( pPoint->y() ));
279 pNewPoints->append( pNewPoint );
281 pPoint = m_PointList.next();
284 pNewPoints->append(
new KivioPoint( zoomHandler->zoomItX( m_pEnd->x() ),
285 zoomHandler->zoomItY( m_pEnd->y() )));
286 painter = pData->painter;
287 double lineWidth = m_pLineStyle ->width();
288 painter->setLineWidth( zoomHandler->zoomItY( lineWidth ) );
289 painter->setFGColor( m_pLineStyle ->color() );
291 painter->drawOpenPath( pNewPoints );
297 painter->setBGColor( m_pFillStyle->color() );
299 m_startAH->paint( painter, m_pStart->x(), m_pStart->y(), -vecX, -vecY, zoomHandler );
300 m_endAH->paint( painter, m_pEnd->x(), m_pEnd->y(), vecX, vecY, zoomHandler );
307void KivioSMLConnector::paintOutline( KivioIntraStencilData *pData )
312bool KivioSMLConnector::saveCustom( TQDomElement &e, TQDomDocument &doc )
314 kdDebug(43000) <<
"Save custom " << endl;
315 e.appendChild( saveArrowHeads( doc ) );
318 KivioConnectorPoint *p = m_PointList.first();
321 TQDomElement pt = p->saveXML( doc );
323 p = m_PointList.next();
328bool KivioSMLConnector::loadCustom(
const TQDomElement &e )
330 kdDebug(43000) <<
"Load custom " << endl;
334 node = e.firstChild();
335 while ( !node.isNull() )
337 name = node.nodeName();
338 if ( name ==
"KivioArrowHeads" )
340 loadArrowHeads( node.toElement() );
342 else if ( name ==
"KivioShape" )
345 TQDomNode pts = node.firstChild();
346 while ( !pts.isNull() )
348 KivioConnectorPoint * pt =
new KivioConnectorPoint();
349 pt->loadXML( pts.toElement() );
350 m_pConnectorPoints->append( pt );
351 m_PointList.append( pt );
352 pts = pts.nextSibling();
355 node = node.nextSibling();
363TQDomElement KivioSMLConnector::saveArrowHeads( TQDomDocument &doc )
365 TQDomElement e = doc.createElement(
"KivioArrowHeads" );
367 e.appendChild( m_startAH->saveXML( doc ) );
368 e.appendChild( m_endAH->saveXML( doc ) );
373bool KivioSMLConnector::loadArrowHeads(
const TQDomElement &e )
380 node = e.firstChild();
381 while ( !node.isNull() )
383 nodeName = node.nodeName();
384 arrowE = node.toElement();
386 if ( nodeName ==
"KivioArrowHead" )
390 m_startAH->loadXML( arrowE );
396 m_endAH->loadXML( arrowE );
400 node = node.nextSibling();
407bool KivioSMLConnector::loadPath(
const TQString &file )
409 kdDebug(43000) <<
"Loading :" << file << endl;
412 m_PointList.append(m_pStart);
414 KivioConnectorPoint *pt =
new KivioConnectorPoint(
this,
false);
415 pt->setPosition(m_pStart->x()+10,m_pStart->y()+10,
false);
417 m_pConnectorPoints->append(pt);
419 pt =
new KivioConnectorPoint(
this,
false);
420 pt->setPosition(m_pStart->x()+20,m_pStart->y()+20,
false);
421 m_PointList.append( pt );
422 m_pConnectorPoints->append(pt);
424 pt =
new KivioConnectorPoint(
this,
false);
425 pt->setPosition(m_pStart->x()+30,m_pStart->y()+30,
false);
426 m_PointList.append( pt );
427 m_pConnectorPoints->append(pt);
434#include "sml_connector.moc"