19#include "kivio_arrowhead.h"
20#include "kivio_common.h"
21#include "kivio_painter.h"
22#include "kivio_point.h"
23#include "kivio_fill_style.h"
27#include <KoZoomHandler.h>
29KivioArrowHead::KivioArrowHead()
38KivioArrowHead::~KivioArrowHead()
42TQDomElement KivioArrowHead::saveXML( TQDomDocument &doc )
44 TQDomElement e = doc.createElement(
"KivioArrowHead");
46 XmlWriteFloat( e,
"cut", m_cut );
47 XmlWriteFloat( e,
"w", m_w );
48 XmlWriteFloat( e,
"l", m_l );
49 XmlWriteInt( e,
"type", m_type );
54bool KivioArrowHead::loadXML(
const TQDomElement &e )
56 m_cut = XmlReadFloat( e,
"cut", 0.0f );
57 m_w = XmlReadFloat( e,
"w", 10.0f );
58 m_l = XmlReadFloat( e,
"l", 10.0f );
59 m_type = XmlReadInt( e,
"type", m_type );
64void KivioArrowHead::setType(
int t)
75 case kahtForwardSlash:
80 case kahtCrowFootPipe:
81 case kahtMidForwardSlash:
82 case kahtMidBackSlash:
87 case kahtArrowTriangleSolid:
88 case kahtArrowTriangleHollow:
89 case kahtDoubleTriangleSolid:
90 case kahtDoubleTriangleHollow:
91 case kahtDiamondSolid:
92 case kahtDiamondHollow:
95 m_cut = KIVIO_CUT_LENGTH;
105float KivioArrowHead::cut()
107 if( m_cut == KIVIO_CUT_LENGTH )
110 else if( m_cut == KIVIO_CUT_HALF_LENGTH )
130void KivioArrowHead::paint( KivioPainter *painter,
float x,
float y,
float vecX,
float vecY, KoZoomHandler* zoomHandler )
132 KivioArrowHeadData d;
139 d.zoomHandler = zoomHandler;
148 paintArrowLine( &d );
151 case kahtArrowTriangleSolid:
152 paintArrowTriangle( &d,
true );
155 case kahtArrowTriangleHollow:
156 paintArrowTriangle( &d,
false );
159 case kahtDoubleTriangleSolid:
160 paintDoubleTriangle( &d,
true );
163 case kahtDoubleTriangleHollow:
164 paintDoubleTriangle( &d,
false );
167 case kahtForwardSlash:
168 paintForwardSlash( &d );
172 paintBackSlash( &d );
179 case kahtMidForwardSlash:
180 paintMidForwardSlash( &d );
183 case kahtMidBackSlash:
184 paintMidBackSlash( &d );
191 case kahtDiamondSolid:
192 paintDiamond( &d,
true );
195 case kahtDiamondHollow:
196 paintDiamond( &d,
false );
207 case kahtCrowFootPipe:
208 paintCrowFootPipe( &d );
224void KivioArrowHead::paintArrowLine( KivioArrowHeadData *d )
226 KivioPainter *painter = d->painter;
228 float vecX = d->vecX;
229 float vecY = d->vecY;
233 KoZoomHandler* zoomHandler = d->zoomHandler;
238 length = sqrt( vecX*vecX + vecY*vecY );
240 nvecX = - vecX / length;
241 nvecY = - vecY / length;
246 TQPtrList<KivioPoint>l;
247 l.setAutoDelete(
true);
252 _x = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
253 _y = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
255 l.append(
new KivioPoint( _x, _y ) );
257 _x = zoomHandler->zoomItX(d->x);
258 _y = zoomHandler->zoomItY(d->y);
260 l.append(
new KivioPoint( _x, _y ) );
266 _x = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
267 _y = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
269 l.append(
new KivioPoint( _x, _y ) );
272 painter->drawPolyline( &l );
275void KivioArrowHead::paintArrowTriangle( KivioArrowHeadData *d,
bool solid )
277 KivioPainter *painter = d->painter;
278 TQColor cbg = painter->bgColor();
281 painter->setBGColor(painter->fgColor());
284 float vecX = d->vecX;
285 float vecY = d->vecY;
289 KoZoomHandler* zoomHandler = d->zoomHandler;
294 length = sqrt( vecX*vecX + vecY*vecY );
296 nvecX = - vecX / length;
297 nvecY = - vecY / length;
302 TQPtrList<KivioPoint>l;
303 l.setAutoDelete(
true);
305 float _x = zoomHandler->zoomItX(d->x);
306 float _y = zoomHandler->zoomItY(d->y);
308 l.append(
new KivioPoint( _x, _y ) );
310 _x = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
311 _y = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
313 l.append(
new KivioPoint( _x, _y ) );
318 _x = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
319 _y = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
321 l.append(
new KivioPoint( _x, _y ) );
323 l.append(
new KivioPoint( zoomHandler->zoomItX(d->x), zoomHandler->zoomItY(d->y) ) );
325 painter->drawPolygon( &l );
326 painter->setBGColor(cbg);
329void KivioArrowHead::paintDoubleTriangle( KivioArrowHeadData *d,
bool solid )
331 KivioPainter *painter = d->painter;
332 TQColor cbg = painter->bgColor();
335 painter->setBGColor(painter->fgColor());
338 float vecX = d->vecX;
339 float vecY = d->vecY;
343 KoZoomHandler* zoomHandler = d->zoomHandler;
348 length = sqrt( vecX*vecX + vecY*vecY );
350 nvecX = - vecX / length;
351 nvecY = - vecY / length;
356 TQPtrList<KivioPoint> l1;
357 l1.setAutoDelete(
true);
358 TQPtrList<KivioPoint> l2;
359 l2.setAutoDelete(
true);
361 float _x = zoomHandler->zoomItX(d->x);
362 float _y = zoomHandler->zoomItY(d->y);
363 l1.append(
new KivioPoint( _x, _y ) );
365 _x = zoomHandler->zoomItX(d->x + nvecX * (m_l / 2.0f));
366 _y = zoomHandler->zoomItY(d->y + nvecY * (m_l / 2.0f));
367 l2.append(
new KivioPoint( _x, _y ) );
369 _x = zoomHandler->zoomItX((d->x + nvecX * (m_l / 2.0f)) + pvecX*(m_w/2.0f));
370 _y = zoomHandler->zoomItY((d->y + nvecY * (m_l / 2.0f)) + pvecY*(m_w/2.0f));
371 l1.append(
new KivioPoint( _x, _y ) );
373 _x = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
374 _y = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
375 l2.append(
new KivioPoint( _x, _y ) );
380 _x = zoomHandler->zoomItX((d->x + nvecX * (m_l / 2.0f)) + pvecX*(m_w/2.0f));
381 _y = zoomHandler->zoomItY((d->y + nvecY * (m_l / 2.0f)) + pvecY*(m_w/2.0f));
382 l1.append(
new KivioPoint( _x, _y ) );
384 _x = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
385 _y = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
386 l2.append(
new KivioPoint( _x, _y ) );
388 l1.append(
new KivioPoint( zoomHandler->zoomItX(d->x), zoomHandler->zoomItY(d->y) ) );
390 _x = zoomHandler->zoomItX(d->x + nvecX * (m_l / 2.0f));
391 _y = zoomHandler->zoomItY(d->y + nvecY * (m_l / 2.0f));
392 l2.append(
new KivioPoint( _x, _y ) );
394 painter->drawPolygon( &l1 );
395 painter->drawPolygon( &l2 );
396 painter->setBGColor(cbg);
399void KivioArrowHead::paintForwardSlash( KivioArrowHeadData *d )
401 KivioPainter *painter = d->painter;
403 float vecX = d->vecX;
404 float vecY = d->vecY;
406 KoZoomHandler* zoomHandler = d->zoomHandler;
411 float length = sqrt( vecX*vecX + vecY*vecY );
413 nvecX = - vecX / length;
414 nvecY = - vecY / length;
419 int x1 = zoomHandler->zoomItX((d->x + nvecX * (m_l/2.0f)) + pvecX*(m_w/2.0f));
420 int y1 = zoomHandler->zoomItY((d->y + nvecY * (m_l/2.0f)) + pvecY*(m_w/2.0f));
421 int x2 = zoomHandler->zoomItX((d->x - nvecX * (m_l/2.0f)) - pvecX*(m_w/2.0f));
422 int y2 = zoomHandler->zoomItY((d->y - nvecY * (m_l/2.0f)) - pvecY*(m_w/2.0f));
424 painter->drawLine(x1, y1, x2, y2);
427void KivioArrowHead::paintBackSlash( KivioArrowHeadData *d )
429 KivioPainter *painter = d->painter;
431 float vecX = d->vecX;
432 float vecY = d->vecY;
434 KoZoomHandler* zoomHandler = d->zoomHandler;
439 float length = sqrt( vecX*vecX + vecY*vecY );
441 nvecX = - vecX / length;
442 nvecY = - vecY / length;
447 int x1 = zoomHandler->zoomItX((d->x - nvecX * (m_l/2.0f)) + pvecX*(m_w/2.0f));
448 int y1 = zoomHandler->zoomItY((d->y - nvecY * (m_l/2.0f)) + pvecY*(m_w/2.0f));
449 int x2 = zoomHandler->zoomItX((d->x + nvecX * (m_l/2.0f)) - pvecX*(m_w/2.0f));
450 int y2 = zoomHandler->zoomItY((d->y + nvecY * (m_l/2.0f)) - pvecY*(m_w/2.0f));
452 painter->drawLine(x1, y1, x2, y2);
455void KivioArrowHead::paintPipe( KivioArrowHeadData *d )
457 KivioPainter *painter = d->painter;
459 float vecX = d->vecX;
460 float vecY = d->vecY;
462 KoZoomHandler* zoomHandler = d->zoomHandler;
467 float length = sqrt( vecX*vecX + vecY*vecY );
469 nvecX = - vecX / length;
470 nvecY = - vecY / length;
475 int x1 = zoomHandler->zoomItX(d->x + pvecX*(m_w/2.0f));
476 int y1 = zoomHandler->zoomItY(d->y + pvecY*(m_w/2.0f));
477 int x2 = zoomHandler->zoomItX(d->x - pvecX*(m_w/2.0f));
478 int y2 = zoomHandler->zoomItY(d->y - pvecY*(m_w/2.0f));
480 painter->drawLine(x1, y1, x2, y2);
483void KivioArrowHead::paintDiamond( KivioArrowHeadData *d,
bool solid )
485 KivioPainter *painter = d->painter;
486 TQColor cbg = painter->bgColor();
489 painter->setBGColor(painter->fgColor());
492 float vecX = d->vecX;
493 float vecY = d->vecY;
495 KoZoomHandler* zoomHandler = d->zoomHandler;
500 float length = sqrt( vecX*vecX + vecY*vecY );
502 nvecX = - vecX / length;
503 nvecY = - vecY / length;
508 TQPtrList<KivioPoint> l;
509 l.setAutoDelete(
true);
511 float _x = zoomHandler->zoomItX(d->x);
512 float _y = zoomHandler->zoomItY(d->y);
513 l.append(
new KivioPoint( _x, _y ) );
515 _x = zoomHandler->zoomItX((d->x + nvecX * (m_l/2.0f)) - pvecX*(m_w/2.0f));
516 _y = zoomHandler->zoomItY((d->y + nvecY * (m_l/2.0f)) - pvecY*(m_w/2.0f));
517 l.append(
new KivioPoint( _x, _y ) );
519 _x = zoomHandler->zoomItX((d->x + nvecX * m_l));
520 _y = zoomHandler->zoomItY((d->y + nvecY * m_l));
521 l.append(
new KivioPoint( _x, _y ) );
523 _x = zoomHandler->zoomItX((d->x + nvecX * (m_l/2.0f)) + pvecX*(m_w/2.0f));
524 _y = zoomHandler->zoomItY((d->y + nvecY * (m_l/2.0f)) + pvecY*(m_w/2.0f));
525 l.append(
new KivioPoint( _x, _y ) );
527 _x = zoomHandler->zoomItX(d->x);
528 _y = zoomHandler->zoomItY(d->y);
529 l.append(
new KivioPoint( _x, _y ) );
531 painter->drawPolygon( &l );
532 painter->setBGColor(cbg);
535void KivioArrowHead::paintCircle( KivioArrowHeadData *d,
bool solid )
537 KivioPainter *painter = d->painter;
538 TQColor cbg = painter->bgColor();
541 painter->setBGColor(painter->fgColor());
544 float vecX = d->vecX;
545 float vecY = d->vecY;
547 KoZoomHandler* zoomHandler = d->zoomHandler;
552 float length = sqrt( vecX*vecX + vecY*vecY );
554 nvecX = - vecX / length;
555 nvecY = - vecY / length;
560 int x = zoomHandler->zoomItX(d->x + nvecX * (m_l / 2.0f));
561 int y = zoomHandler->zoomItY(d->y + nvecY * (m_l / 2.0f));
562 int w = zoomHandler->zoomItY(m_w);
563 int h = zoomHandler->zoomItX(m_l);
565 painter->drawEllipse(x, y, w, h);
566 painter->setBGColor(cbg);
569void KivioArrowHead::paintCrowFoot( KivioArrowHeadData *d )
571 KivioPainter *painter = d->painter;
573 float vecX = d->vecX;
574 float vecY = d->vecY;
578 KoZoomHandler* zoomHandler = d->zoomHandler;
583 length = sqrt( vecX*vecX + vecY*vecY );
585 nvecX = - vecX / length;
586 nvecY = - vecY / length;
591 TQPtrList<KivioPoint>l;
592 l.setAutoDelete(
true);
597 _x = zoomHandler->zoomItX(d->x + pvecX*(m_w/2.0f));
598 _y = zoomHandler->zoomItY(d->y + pvecY*(m_w/2.0f));
600 l.append(
new KivioPoint( _x, _y ) );
602 _x = zoomHandler->zoomItX(d->x + nvecX * m_l);
603 _y = zoomHandler->zoomItY(d->y + nvecY * m_l);
605 l.append(
new KivioPoint( _x, _y ) );
611 _x = zoomHandler->zoomItX(d->x + pvecX*(m_w/2.0f));
612 _y = zoomHandler->zoomItY(d->y + pvecY*(m_w/2.0f));
614 l.append(
new KivioPoint( _x, _y ) );
617 painter->drawPolyline( &l );
620void KivioArrowHead::paintFork( KivioArrowHeadData *d )
622 KivioPainter *painter = d->painter;
624 float vecX = d->vecX;
625 float vecY = d->vecY;
629 KoZoomHandler* zoomHandler = d->zoomHandler;
634 length = sqrt( vecX*vecX + vecY*vecY );
636 nvecX = - vecX / length;
637 nvecY = - vecY / length;
642 TQPtrList<KivioPoint>l;
643 l.setAutoDelete(
true);
648 _x = zoomHandler->zoomItX(d->x + pvecX*(m_w/2.0f));
649 _y = zoomHandler->zoomItY(d->y + pvecY*(m_w/2.0f));
651 l.append(
new KivioPoint( _x, _y ) );
653 _x = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
654 _y = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
656 l.append(
new KivioPoint( _x, _y ) );
661 _x = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
662 _y = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
664 l.append(
new KivioPoint( _x, _y ) );
666 _x = zoomHandler->zoomItX(d->x + pvecX*(m_w/2.0f));
667 _y = zoomHandler->zoomItY(d->y + pvecY*(m_w/2.0f));
669 l.append(
new KivioPoint( _x, _y ) );
672 painter->drawPolyline( &l );
675void KivioArrowHead::paintCrowFootPipe( KivioArrowHeadData *d )
677 KivioPainter *painter = d->painter;
679 float vecX = d->vecX;
680 float vecY = d->vecY;
682 KoZoomHandler* zoomHandler = d->zoomHandler;
687 float length = sqrt( vecX*vecX + vecY*vecY );
689 nvecX = - vecX / length;
690 nvecY = - vecY / length;
695 int x1 = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
696 int y1 = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
697 int x2 = zoomHandler->zoomItX((d->x + nvecX * m_l) - pvecX*(m_w/2.0f));
698 int y2 = zoomHandler->zoomItY((d->y + nvecY * m_l) - pvecY*(m_w/2.0f));
700 painter->drawLine(x1, y1, x2, y2);
704void KivioArrowHead::paintMidForwardSlash( KivioArrowHeadData *d )
706 KivioPainter *painter = d->painter;
708 float vecX = d->vecX;
709 float vecY = d->vecY;
711 KoZoomHandler* zoomHandler = d->zoomHandler;
716 float length = sqrt( vecX*vecX + vecY*vecY );
718 nvecX = - vecX / length;
719 nvecY = - vecY / length;
724 int x1 = zoomHandler->zoomItX(d->x + pvecX*(m_w/2.0f));
725 int y1 = zoomHandler->zoomItY(d->y + pvecY*(m_w/2.0f));
726 int x2 = zoomHandler->zoomItX((d->x + nvecX * m_l) - pvecX*(m_w/2.0f));
727 int y2 = zoomHandler->zoomItY((d->y + nvecY * m_l) - pvecY*(m_w/2.0f));
729 painter->drawLine(x1, y1, x2, y2);
732void KivioArrowHead::paintMidBackSlash( KivioArrowHeadData *d )
734 KivioPainter *painter = d->painter;
736 float vecX = d->vecX;
737 float vecY = d->vecY;
739 KoZoomHandler* zoomHandler = d->zoomHandler;
744 float length = sqrt( vecX*vecX + vecY*vecY );
746 nvecX = - vecX / length;
747 nvecY = - vecY / length;
752 int x1 = zoomHandler->zoomItX((d->x + nvecX * m_l) + pvecX*(m_w/2.0f));
753 int y1 = zoomHandler->zoomItY((d->y + nvecY * m_l) + pvecY*(m_w/2.0f));
754 int x2 = zoomHandler->zoomItX(d->x - pvecX*(m_w/2.0f));
755 int y2 = zoomHandler->zoomItY(d->y - pvecY*(m_w/2.0f));
757 painter->drawLine(x1, y1, x2, y2);
760void KivioArrowHead::paintMidPipe( KivioArrowHeadData *d )
762 KivioPainter *painter = d->painter;
764 float vecX = d->vecX;
765 float vecY = d->vecY;
767 KoZoomHandler* zoomHandler = d->zoomHandler;
772 float length = sqrt( vecX*vecX + vecY*vecY );
774 nvecX = - vecX / length;
775 nvecY = - vecY / length;
780 int x1 = zoomHandler->zoomItX((d->x + nvecX * (m_l/2.0f)) + pvecX*(m_w/2.0f));
781 int y1 = zoomHandler->zoomItY((d->y + nvecY * (m_l/2.0f)) + pvecY*(m_w/2.0f));
782 int x2 = zoomHandler->zoomItX((d->x + nvecX * (m_l/2.0f)) - pvecX*(m_w/2.0f));
783 int y2 = zoomHandler->zoomItY((d->y + nvecY * (m_l/2.0f)) - pvecY*(m_w/2.0f));
785 painter->drawLine(x1, y1, x2, y2);