kivio

kivio_base_target_stencil.cpp
1#include "kivio_base_target_stencil.h"
2#include "kivio_common.h"
3#include "kivio_connector_point.h"
4#include "kivio_connector_target.h"
5#include "kivio_fill_style.h"
6#include "kivio_intra_stencil_data.h"
7#include "kivio_line_style.h"
8#include "kivio_painter.h"
9#include "kivio_stencil_spawner.h"
10#include "kivio_stencil_spawner_info.h"
11#include "kivio_stencil_spawner_set.h"
12#include "kivio_text_style.h"
13
14#include <KoZoomHandler.h>
15
16KivioBaseTargetStencil::KivioBaseTargetStencil()
17 : KivioStencil()
18{
19 m_pFillStyle = new KivioFillStyle();
20 m_pLineStyle = new KivioLineStyle();
21 m_pTextStyle = new KivioTextStyle();
22
23 m_pTargets = new TQPtrList<KivioConnectorTarget>;
24 m_pTargets->setAutoDelete(true);
25}
26
27KivioBaseTargetStencil::~KivioBaseTargetStencil()
28{
29 delete m_pFillStyle;
30 delete m_pLineStyle;
31 delete m_pTextStyle;
32 delete m_pTargets;
33}
34
35
36
37
39//
40// KivioLineStyle
41//
43TQColor KivioBaseTargetStencil::fgColor()
44{
45 return m_pLineStyle->color();
46}
47
48void KivioBaseTargetStencil::setFGColor( TQColor c )
49{
50 m_pLineStyle->setColor(c);
51}
52
53void KivioBaseTargetStencil::setLineWidth( double l )
54{
55 m_pLineStyle->setWidth(l);
56}
57
58double KivioBaseTargetStencil::lineWidth()
59{
60 return m_pLineStyle->width();
61}
62
63
64
66//
67// KivioFillStyle
68//
70void KivioBaseTargetStencil::setBGColor( TQColor c )
71{
72 m_pFillStyle->setColor(c);
73}
74
75TQColor KivioBaseTargetStencil::bgColor()
76{
77 return m_pFillStyle->color();
78}
79
80KivioFillStyle *KivioBaseTargetStencil::fillStyle()
81{
82 return m_pFillStyle;
83}
84
85
86
87
88
89
91//
92// KivioTextStyle
93//
95TQColor KivioBaseTargetStencil::textColor()
96{
97 return m_pTextStyle->color();
98}
99void KivioBaseTargetStencil::setTextColor( TQColor c )
100{
101 m_pTextStyle->setColor(c);
102}
103
104TQFont KivioBaseTargetStencil::textFont()
105{
106 return m_pTextStyle->font();
107}
108void KivioBaseTargetStencil::setTextFont( const TQFont &f )
109{
110 m_pTextStyle->setFont(f);
111}
112
113int KivioBaseTargetStencil::hTextAlign()
114{
115 return m_pTextStyle->hTextAlign();
116}
117
118int KivioBaseTargetStencil::vTextAlign()
119{
120 return m_pTextStyle->vTextAlign();
121}
122
123void KivioBaseTargetStencil::setHTextAlign(int a)
124{
125 m_pTextStyle->setHTextAlign(a);
126}
127
128void KivioBaseTargetStencil::setVTextAlign(int a)
129{
130 m_pTextStyle->setVTextAlign(a);
131}
132
133void KivioBaseTargetStencil::setText( const TQString &a )
134{
135 m_pTextStyle->setText(a);
136}
137
138TQString KivioBaseTargetStencil::text()
139{
140 return m_pTextStyle->text();
141}
142
143
144
146//
147// Paint Routines
148//
150
151void KivioBaseTargetStencil::paint( KivioIntraStencilData * )
152{
153 ;
154}
155
156void KivioBaseTargetStencil::paintOutline( KivioIntraStencilData * )
157{
158 ;
159}
160
161void KivioBaseTargetStencil::paintConnectorTargets( KivioIntraStencilData *pData )
162{
163 TQPixmap *targetPic;
164 KivioPainter *painter;
165 double x, y;
166
167 // We don't draw these if we are selected!!!
168 if( isSelected() == true )
169 return;
170
171 // Obtain the graphic used for KivioConnectorTargets
172 targetPic = KivioConfig::config()->connectorTargetPixmap();
173
174
175 KoZoomHandler* zoomHandler = pData->zoomHandler;
176 painter = pData->painter;
177
178 KivioConnectorTarget *pTarget;
179 pTarget = m_pTargets->first();
180 while( pTarget )
181 {
182 x = zoomHandler->zoomItX(pTarget->x());
183 y = zoomHandler->zoomItY(pTarget->y());
184
185 painter->drawPixmap( x-3, y-3, *targetPic );
186
187 pTarget = m_pTargets->next();
188 }
189}
190
191
192
193
194
196//
197// File I/O
198//
200bool KivioBaseTargetStencil::loadXML( const TQDomElement &e )
201{
202 TQDomNode node;
203 TQString name;
204
205 node = e.firstChild();
206 while( !node.isNull() )
207 {
208 name = node.nodeName();
209
210 if( name == "KivioStencilProperties" )
211 {
212 loadProperties(node.toElement());
213 }
214
215 node = node.nextSibling();
216 }
217
218 updateGeometry();
219
220 return true;
221}
222
223TQDomElement KivioBaseTargetStencil::createRootElement( TQDomDocument &doc )
224{
225 TQDomElement e = doc.createElement("KivioPluginStencil");
226
227 XmlWriteString( e, "id", m_pSpawner->info()->id() );
228 XmlWriteString( e, "setId", m_pSpawner->set()->id() );
229
230 return e;
231}
232
233TQDomElement KivioBaseTargetStencil::saveXML( TQDomDocument &doc )
234{
235 TQDomElement e = createRootElement( doc );
236
237 e.appendChild( saveProperties(doc) );
238
239 return e;
240}
241
242
243TQDomElement KivioBaseTargetStencil::saveProperties( TQDomDocument &doc )
244{
245 TQDomElement baseE = doc.createElement("KivioStencilProperties");
246
247 TQDomElement geoE = doc.createElement("Geometry");
248 XmlWriteFloat( geoE, "x", m_x );
249 XmlWriteFloat( geoE, "y", m_y );
250 XmlWriteFloat( geoE, "w", m_w );
251 XmlWriteFloat( geoE, "h", m_h );
252 baseE.appendChild( geoE );
253
254 baseE.appendChild( m_pLineStyle->saveXML(doc) );
255 baseE.appendChild( m_pFillStyle->saveXML(doc) );
256 baseE.appendChild( m_pTextStyle->saveXML(doc) );
257 baseE.appendChild( saveTargets(doc) );
258
259 // Only save custom data if this returns true (means there is custom data)
260 TQDomElement customE = doc.createElement("CustomData");
261 if( saveCustom( customE, doc )==true )
262 {
263 baseE.appendChild( customE );
264 }
265
266 return baseE;
267}
268
269bool KivioBaseTargetStencil::loadProperties( const TQDomElement &e )
270{
271 TQDomNode node;
272 TQDomElement nodeE;
273 TQString nodeName;
274
275 node = e.firstChild();
276 while( !node.isNull() )
277 {
278 nodeName = node.nodeName();
279 nodeE = node.toElement();
280
281 if( nodeName == "KivioFillStyle" )
282 {
283 m_pFillStyle->loadXML( node.toElement() );
284 }
285 else if( nodeName == "KivioLineStyle" )
286 {
287 m_pLineStyle->loadXML( node.toElement() );
288 }
289 else if( nodeName == "KivioTextStyle" )
290 {
291 m_pTextStyle->loadXML( node.toElement() );
292 }
293 else if( nodeName == "KivioTargetList" )
294 {
295 loadTargets( node.toElement() );
296 }
297 else if( nodeName == "CustomData" )
298 {
299 loadCustom( node.toElement() );
300 }
301 else if( nodeName == "Geometry" )
302 {
303 m_x = XmlReadFloat( nodeE, "x", 0.0f );
304 m_y = XmlReadFloat( nodeE, "y", 0.0f );
305 m_w = XmlReadFloat( nodeE, "w", 72.0f );
306 m_h = XmlReadFloat( nodeE, "h", 72.0f );
307 }
308
309 node = node.nextSibling();
310 }
311
312 return true;
313}
314
315bool KivioBaseTargetStencil::saveCustom( TQDomElement &, TQDomDocument & )
316{
317 return false;
318}
319
320bool KivioBaseTargetStencil::loadCustom( const TQDomElement & )
321{
322 return true;
323}
324
325TQDomElement KivioBaseTargetStencil::saveTargets( TQDomDocument &doc )
326{
327 KivioConnectorTarget *p;
328
329 TQDomElement e = doc.createElement("TargetList");
330
331 p = m_pTargets->first();
332 while( p )
333 {
334 e.appendChild( p->saveXML(doc) );
335
336 p = m_pTargets->next();
337 }
338
339 return e;
340}
341
342bool KivioBaseTargetStencil::loadTargets( const TQDomElement &e )
343{
344 KivioConnectorTarget *p;
345 TQDomNode node;
346 TQDomElement targetE;
347 TQString nodeName;
348
349 m_pTargets->clear();
350
351 node = e.firstChild();
352 while( !node.isNull() )
353 {
354 nodeName = node.nodeName();
355 targetE = node.toElement();
356
357 if( nodeName == "KivioConnectorTarget" )
358 {
359 p = new KivioConnectorTarget();
360 p->loadXML( targetE );
361 m_pTargets->append(p);
362 p = NULL;
363 }
364
365
366 node = node.nextSibling();
367 }
368
369
370 return true;
371}
372
373
374
376//
377// Geometry Routine
378//
380void KivioBaseTargetStencil::updateGeometry()
381{
382 ;
383}
384
385
386
387
389//
390// Target Routines
391//
393KivioConnectorTarget *KivioBaseTargetStencil::connectToTarget( KivioConnectorPoint *p, double threshHold)
394{
395 double px = p->x();
396 double py = p->y();
397
398 double tx, ty;
399
400 KivioConnectorTarget *pTarget = m_pTargets->first();
401 while( pTarget )
402 {
403 tx = pTarget->x();
404 ty = pTarget->y();
405
406
407 if( px >= tx - threshHold &&
408 px <= tx + threshHold &&
409 py >= ty - threshHold &&
410 py <= ty + threshHold )
411 {
412 // setTarget calls pTarget->addConnectorPoint() and removes
413 // any previous connections from p
414 p->setTarget( pTarget );
415 return pTarget;
416 }
417
418 pTarget = m_pTargets->next();
419 }
420
421 return NULL;
422}
423
424// we probably don't need targetID in the function since it's stored in p... but I don't remember so
425// i'm leaving it here for now.
426KivioConnectorTarget *KivioBaseTargetStencil::connectToTarget( KivioConnectorPoint *p, int /*targetID*/ )
427{
428 int id = p->targetId();
429
430 KivioConnectorTarget *pTarget = m_pTargets->first();
431 while( pTarget )
432 {
433 if( pTarget->id() == id )
434 {
435 p->setTarget(pTarget);
436
437 return pTarget;
438 }
439
440 pTarget = m_pTargets->next();
441 }
442
443 return NULL;
444}
445
446
447
448
450//
451// ID Generation
452//
454int KivioBaseTargetStencil::generateIds( int nextAvailable )
455{
456 KivioConnectorTarget *pTarget = m_pTargets->first();
457
458 // Iterate through all the targets
459 while( pTarget )
460 {
461 // If this target has something connected to it
462 if( pTarget->hasConnections() )
463 {
464 // Set it's id to the next available id
465 pTarget->setId( nextAvailable );
466
467 // Increment the next available id
468 nextAvailable++;
469 }
470 else
471 {
472 // Otherwise mark it as unused (-1)
473 pTarget->setId( -1 );
474 }
475
476 pTarget = m_pTargets->next();
477 }
478
479 // Return the next availabe id
480 return nextAvailable;
481}
482
483void KivioBaseTargetStencil::copyBasicInto( KivioBaseTargetStencil *pStencil )
484{
485 pStencil->setSpawner( m_pSpawner );
486
487 m_pFillStyle->copyInto( pStencil->m_pFillStyle );
488 m_pLineStyle->copyInto( pStencil->m_pLineStyle );
489 m_pTextStyle->copyInto( pStencil->m_pTextStyle );
490
491 // Copy the targets
492 KivioConnectorTarget *pSrcTarget, *pTgTarget;
493 pSrcTarget = m_pTargets->first();
494 pTgTarget = pStencil->m_pTargets->first();
495
496 while( pSrcTarget && pTgTarget )
497 {
498 pTgTarget->setPosition( pSrcTarget->x(), pSrcTarget->y() );
499
500 pSrcTarget = m_pTargets->next();
501 pTgTarget = pStencil->m_pTargets->next();
502 }
503
504 // Copy the geometry
505 pStencil->m_x = m_x;
506 pStencil->m_y = m_y;
507 pStencil->m_w = m_w;
508 pStencil->m_h = m_h;
509
510 *(pStencil->m_pProtection) = *m_pProtection;
511 *(pStencil->m_pCanProtect) = *m_pCanProtect;
512}
513
514int KivioBaseTargetStencil::resizeHandlePositions()
515{
516 // Calculate the resize handle positions
517 int mask = KIVIO_RESIZE_HANDLE_POSITION_ALL;
518
519 if( m_pProtection->at( kpWidth ) )
520 {
521 mask &= ~(krhpNE | krhpNW | krhpSW | krhpSE | krhpE | krhpW);
522 }
523
524 if( m_pProtection->at( kpHeight) )
525 {
526 mask &= ~(krhpNE | krhpNW | krhpSW | krhpSE | krhpN | krhpS);
527 }
528
529 return mask;
530}