39#include "kivio_arrowhead.h"
40#include "kivio_base_connector_stencil.h"
41#include "kivio_common.h"
42#include "kivio_connector_point.h"
43#include "kivio_custom_drag_data.h"
44#include "kivio_fill_style.h"
45#include "kivio_intra_stencil_data.h"
46#include "kivio_layer.h"
47#include "kivio_line_style.h"
48#include "kivio_page.h"
49#include "kivio_painter.h"
50#include "kivio_point.h"
51#include "kivio_stencil.h"
54#include <KoZoomHandler.h>
62KivioBaseConnectorStencil::KivioBaseConnectorStencil()
65 m_pFillStyle =
new KivioFillStyle();
66 m_pLineStyle =
new KivioLineStyle();
68 m_pConnectorPoints =
new TQPtrList<KivioConnectorPoint>;
69 m_pConnectorPoints->setAutoDelete(
true);
77KivioBaseConnectorStencil::~KivioBaseConnectorStencil()
81 delete m_pConnectorPoints;
84void KivioBaseConnectorStencil::setFGColor( TQColor c )
86 m_pLineStyle->setColor(c);
89TQColor KivioBaseConnectorStencil::fgColor()
91 return m_pLineStyle->color();
94void KivioBaseConnectorStencil::setLineWidth(
double f )
96 m_pLineStyle->setWidth(f);
99double KivioBaseConnectorStencil::lineWidth()
101 return m_pLineStyle->width();
104void KivioBaseConnectorStencil::setBGColor( TQColor c )
106 m_pFillStyle->setColor(c);
109TQColor KivioBaseConnectorStencil::bgColor()
111 return m_pFillStyle->color();
118void KivioBaseConnectorStencil::setX(
double x )
124 KivioConnectorPoint *p = m_pConnectorPoints->first();
127 p->setX( p->x() + dx,
false );
130 p = m_pConnectorPoints->next();
137void KivioBaseConnectorStencil::setY(
double y )
143 KivioConnectorPoint *p = m_pConnectorPoints->first();
146 p->setY( p->y() + dy,
false );
149 p = m_pConnectorPoints->next();
155void KivioBaseConnectorStencil::setPosition(
double x,
double y )
163 KivioConnectorPoint *p = m_pConnectorPoints->first();
166 p->setPosition( p->x()+dx, p->y()+dy,
false );
169 p = m_pConnectorPoints->next();
182void KivioBaseConnectorStencil::setStartPoint(
double ,
double )
190void KivioBaseConnectorStencil::setEndPoint(
double ,
double )
198void KivioBaseConnectorStencil::paint( KivioIntraStencilData * )
203void KivioBaseConnectorStencil::paintOutline( KivioIntraStencilData *pData )
209void KivioBaseConnectorStencil::paintConnectorTargets( KivioIntraStencilData * )
213void KivioBaseConnectorStencil::paintSelectionHandles( KivioIntraStencilData *pData )
216 const double HW = 6.0f;
217 const double HWP1 = HW+1.0f;
220 const double HWo2 = HW/2.0f;
223 KoZoomHandler* zoomHandler = pData->zoomHandler;
224 KivioPainter *painter = pData->painter;
227 painter->setLineWidth(1.0f);
228 painter->setFGColor(TQColor(0,0,0));
230 KivioConnectorPoint *p = m_pConnectorPoints->first();
233 x1 = zoomHandler->zoomItX(p->x()) - HWo2;
234 y1 = zoomHandler->zoomItY(p->y()) - HWo2;
237 painter->setBGColor(TQColor(200,0,0));
239 painter->setBGColor(TQColor(0,200,0));
241 painter->fillRect( x1, y1, HWP1, HWP1 );
243 p = m_pConnectorPoints->next();
252KivioCollisionType KivioBaseConnectorStencil::checkForCollision( KoPoint *,
double )
272void KivioBaseConnectorStencil::customDrag( KivioCustomDragData *pData )
274 double _x = pData->x;
275 double _y = pData->y;
278 KivioConnectorPoint *p;
281 p = m_pConnectorPoints->at(
id - (kctCustom+1));
285 kdDebug(43000) <<
"KivioBaseConnectorStencil::customDrag() - KivioConnectorPoint id: " << (
id - (kctCustom+1)) <<
" not found\n" << endl;
289 p->setPosition( _x, _y,
true );
292 KivioLayer *pCurLayer = pData->page->curLayer();
293 KivioLayer *pLayer = pData->page->firstLayer();
298 if( pLayer!=pCurLayer )
300 if( pLayer->connectable()==
false || pLayer->visible()==
false )
302 pLayer = pData->page->nextLayer();
308 if( pLayer->connectPointToTarget( p, 8.0f ) )
313 pLayer = pData->page->nextLayer();
325void KivioBaseConnectorStencil::updateGeometry()
327 double minX, minY, maxX, maxY;
329 minX = 1000000000000.0f;
331 maxX = -100000000000.0f;
334 KivioConnectorPoint *p;
335 p = m_pConnectorPoints->first();
347 p = m_pConnectorPoints->next();
352 m_w = maxX - minX + 1.0f;
353 m_h = maxY - minY + 1.0f;
359bool KivioBaseConnectorStencil::loadXML(
const TQDomElement & )
364TQDomElement KivioBaseConnectorStencil::saveXML( TQDomDocument & )
366 return TQDomElement();
371KivioStencil *KivioBaseConnectorStencil::duplicate()
378bool KivioBaseConnectorStencil::boolAllTrue(
bool *boolArray,
int count )
382 for( i=0; i<count; i++ )
384 if( boolArray[i]==
false )
391bool KivioBaseConnectorStencil::boolContainsFalse(
bool *boolArray,
int count )
395 for( i=0; i<count; i++ )
397 if( boolArray[i]==
false )
405void KivioBaseConnectorStencil::searchForConnections( KivioPage *pPage )
407 bool *done =
new bool[ m_pConnectorPoints->count() ];
411 for( i=0; i<(int)m_pConnectorPoints->count(); i++ )
414 KivioConnectorPoint *p;
417 p = m_pConnectorPoints->first();
420 if( p->targetId() == -1 )
424 p = m_pConnectorPoints->next();
429 if( boolAllTrue( done, m_pConnectorPoints->count() ) )
437 KivioLayer *pLayer = pPage->firstLayer();
438 while( pLayer && ( boolContainsFalse(done, m_pConnectorPoints->count()) ) )
440 KivioStencil *pStencil = pLayer->firstStencil();
442 while( pStencil && ( boolContainsFalse(done, m_pConnectorPoints->count()) ) )
445 if( pStencil !=
this )
451 p = m_pConnectorPoints->first();
455 p->targetId() != -1 )
457 if( pStencil->connectToTarget( p, p->targetId() ) )
464 p = m_pConnectorPoints->next();
469 pStencil = pLayer->nextStencil();
472 pLayer = pPage->nextLayer();
482int KivioBaseConnectorStencil::resizeHandlePositions()
484 return (
int)krhpNone;
487TQDomElement KivioBaseConnectorStencil::saveConnectors( TQDomDocument &doc )
489 TQDomElement eConns = doc.createElement(
"KivioConnectors");
491 KivioConnectorPoint *p;
492 p = m_pConnectorPoints->first();
495 eConns.appendChild( p->saveXML(doc) );
497 p = m_pConnectorPoints->next();
503bool KivioBaseConnectorStencil::loadConnectors(
const TQDomElement &e )
505 m_pConnectorPoints->clear();
507 KivioConnectorPoint *p;
509 TQDomNode node = e.firstChild();
513 while( !node.isNull() )
515 e2 = node.toElement();
516 name = e2.nodeName();
518 if( name ==
"KivioConnectorPoint" )
520 p =
new KivioConnectorPoint();
524 m_pConnectorPoints->append( p );
528 node = node.nextSibling();
534TQDomElement KivioBaseConnectorStencil::saveProperties( TQDomDocument &doc )
536 TQDomElement propE = doc.createElement(
"KivioConnectorProperties");
538 propE.appendChild( m_pLineStyle->saveXML( doc ) );
540 propE.appendChild( m_pFillStyle->saveXML( doc ) );
545bool KivioBaseConnectorStencil::loadProperties(
const TQDomElement &e )
550 node = e.firstChild();
551 while( !node.isNull() )
553 nodeName = node.nodeName();
554 if( nodeName ==
"KivioFillStyle" )
556 m_pFillStyle->loadXML( node.toElement() );
558 else if( nodeName ==
"KivioLineStyle" )
560 m_pLineStyle->loadXML( node.toElement() );
563 node = node.nextSibling();