kivio
kivio_base_target_stencil.cpp00001 #include "kivio_base_target_stencil.h"
00002 #include "kivio_common.h"
00003 #include "kivio_connector_point.h"
00004 #include "kivio_connector_target.h"
00005 #include "kivio_fill_style.h"
00006 #include "kivio_intra_stencil_data.h"
00007 #include "kivio_line_style.h"
00008 #include "kivio_painter.h"
00009 #include "kivio_stencil_spawner.h"
00010 #include "kivio_stencil_spawner_info.h"
00011 #include "kivio_stencil_spawner_set.h"
00012 #include "kivio_text_style.h"
00013
00014 #include <KoZoomHandler.h>
00015
00016 KivioBaseTargetStencil::KivioBaseTargetStencil()
00017 : KivioStencil()
00018 {
00019 m_pFillStyle = new KivioFillStyle();
00020 m_pLineStyle = new KivioLineStyle();
00021 m_pTextStyle = new KivioTextStyle();
00022
00023 m_pTargets = new QPtrList<KivioConnectorTarget>;
00024 m_pTargets->setAutoDelete(true);
00025 }
00026
00027 KivioBaseTargetStencil::~KivioBaseTargetStencil()
00028 {
00029 delete m_pFillStyle;
00030 delete m_pLineStyle;
00031 delete m_pTextStyle;
00032 delete m_pTargets;
00033 }
00034
00035
00036
00037
00039
00040
00041
00043 QColor KivioBaseTargetStencil::fgColor()
00044 {
00045 return m_pLineStyle->color();
00046 }
00047
00048 void KivioBaseTargetStencil::setFGColor( QColor c )
00049 {
00050 m_pLineStyle->setColor(c);
00051 }
00052
00053 void KivioBaseTargetStencil::setLineWidth( double l )
00054 {
00055 m_pLineStyle->setWidth(l);
00056 }
00057
00058 double KivioBaseTargetStencil::lineWidth()
00059 {
00060 return m_pLineStyle->width();
00061 }
00062
00063
00064
00066
00067
00068
00070 void KivioBaseTargetStencil::setBGColor( QColor c )
00071 {
00072 m_pFillStyle->setColor(c);
00073 }
00074
00075 QColor KivioBaseTargetStencil::bgColor()
00076 {
00077 return m_pFillStyle->color();
00078 }
00079
00080 KivioFillStyle *KivioBaseTargetStencil::fillStyle()
00081 {
00082 return m_pFillStyle;
00083 }
00084
00085
00086
00087
00088
00089
00091
00092
00093
00095 QColor KivioBaseTargetStencil::textColor()
00096 {
00097 return m_pTextStyle->color();
00098 }
00099 void KivioBaseTargetStencil::setTextColor( QColor c )
00100 {
00101 m_pTextStyle->setColor(c);
00102 }
00103
00104 QFont KivioBaseTargetStencil::textFont()
00105 {
00106 return m_pTextStyle->font();
00107 }
00108 void KivioBaseTargetStencil::setTextFont( const QFont &f )
00109 {
00110 m_pTextStyle->setFont(f);
00111 }
00112
00113 int KivioBaseTargetStencil::hTextAlign()
00114 {
00115 return m_pTextStyle->hTextAlign();
00116 }
00117
00118 int KivioBaseTargetStencil::vTextAlign()
00119 {
00120 return m_pTextStyle->vTextAlign();
00121 }
00122
00123 void KivioBaseTargetStencil::setHTextAlign(int a)
00124 {
00125 m_pTextStyle->setHTextAlign(a);
00126 }
00127
00128 void KivioBaseTargetStencil::setVTextAlign(int a)
00129 {
00130 m_pTextStyle->setVTextAlign(a);
00131 }
00132
00133 void KivioBaseTargetStencil::setText( const QString &a )
00134 {
00135 m_pTextStyle->setText(a);
00136 }
00137
00138 QString KivioBaseTargetStencil::text()
00139 {
00140 return m_pTextStyle->text();
00141 }
00142
00143
00144
00146
00147
00148
00150
00151 void KivioBaseTargetStencil::paint( KivioIntraStencilData * )
00152 {
00153 ;
00154 }
00155
00156 void KivioBaseTargetStencil::paintOutline( KivioIntraStencilData * )
00157 {
00158 ;
00159 }
00160
00161 void KivioBaseTargetStencil::paintConnectorTargets( KivioIntraStencilData *pData )
00162 {
00163 QPixmap *targetPic;
00164 KivioPainter *painter;
00165 double x, y;
00166
00167
00168 if( isSelected() == true )
00169 return;
00170
00171
00172 targetPic = KivioConfig::config()->connectorTargetPixmap();
00173
00174
00175 KoZoomHandler* zoomHandler = pData->zoomHandler;
00176 painter = pData->painter;
00177
00178 KivioConnectorTarget *pTarget;
00179 pTarget = m_pTargets->first();
00180 while( pTarget )
00181 {
00182 x = zoomHandler->zoomItX(pTarget->x());
00183 y = zoomHandler->zoomItY(pTarget->y());
00184
00185 painter->drawPixmap( x-3, y-3, *targetPic );
00186
00187 pTarget = m_pTargets->next();
00188 }
00189 }
00190
00191
00192
00193
00194
00196
00197
00198
00200 bool KivioBaseTargetStencil::loadXML( const QDomElement &e )
00201 {
00202 QDomNode node;
00203 QString name;
00204
00205 node = e.firstChild();
00206 while( !node.isNull() )
00207 {
00208 name = node.nodeName();
00209
00210 if( name == "KivioStencilProperties" )
00211 {
00212 loadProperties(node.toElement());
00213 }
00214
00215 node = node.nextSibling();
00216 }
00217
00218 updateGeometry();
00219
00220 return true;
00221 }
00222
00223 QDomElement KivioBaseTargetStencil::createRootElement( QDomDocument &doc )
00224 {
00225 QDomElement e = doc.createElement("KivioPluginStencil");
00226
00227 XmlWriteString( e, "id", m_pSpawner->info()->id() );
00228 XmlWriteString( e, "setId", m_pSpawner->set()->id() );
00229
00230 return e;
00231 }
00232
00233 QDomElement KivioBaseTargetStencil::saveXML( QDomDocument &doc )
00234 {
00235 QDomElement e = createRootElement( doc );
00236
00237 e.appendChild( saveProperties(doc) );
00238
00239 return e;
00240 }
00241
00242
00243 QDomElement KivioBaseTargetStencil::saveProperties( QDomDocument &doc )
00244 {
00245 QDomElement baseE = doc.createElement("KivioStencilProperties");
00246
00247 QDomElement geoE = doc.createElement("Geometry");
00248 XmlWriteFloat( geoE, "x", m_x );
00249 XmlWriteFloat( geoE, "y", m_y );
00250 XmlWriteFloat( geoE, "w", m_w );
00251 XmlWriteFloat( geoE, "h", m_h );
00252 baseE.appendChild( geoE );
00253
00254 baseE.appendChild( m_pLineStyle->saveXML(doc) );
00255 baseE.appendChild( m_pFillStyle->saveXML(doc) );
00256 baseE.appendChild( m_pTextStyle->saveXML(doc) );
00257 baseE.appendChild( saveTargets(doc) );
00258
00259
00260 QDomElement customE = doc.createElement("CustomData");
00261 if( saveCustom( customE, doc )==true )
00262 {
00263 baseE.appendChild( customE );
00264 }
00265
00266 return baseE;
00267 }
00268
00269 bool KivioBaseTargetStencil::loadProperties( const QDomElement &e )
00270 {
00271 QDomNode node;
00272 QDomElement nodeE;
00273 QString nodeName;
00274
00275 node = e.firstChild();
00276 while( !node.isNull() )
00277 {
00278 nodeName = node.nodeName();
00279 nodeE = node.toElement();
00280
00281 if( nodeName == "KivioFillStyle" )
00282 {
00283 m_pFillStyle->loadXML( node.toElement() );
00284 }
00285 else if( nodeName == "KivioLineStyle" )
00286 {
00287 m_pLineStyle->loadXML( node.toElement() );
00288 }
00289 else if( nodeName == "KivioTextStyle" )
00290 {
00291 m_pTextStyle->loadXML( node.toElement() );
00292 }
00293 else if( nodeName == "KivioTargetList" )
00294 {
00295 loadTargets( node.toElement() );
00296 }
00297 else if( nodeName == "CustomData" )
00298 {
00299 loadCustom( node.toElement() );
00300 }
00301 else if( nodeName == "Geometry" )
00302 {
00303 m_x = XmlReadFloat( nodeE, "x", 0.0f );
00304 m_y = XmlReadFloat( nodeE, "y", 0.0f );
00305 m_w = XmlReadFloat( nodeE, "w", 72.0f );
00306 m_h = XmlReadFloat( nodeE, "h", 72.0f );
00307 }
00308
00309 node = node.nextSibling();
00310 }
00311
00312 return true;
00313 }
00314
00315 bool KivioBaseTargetStencil::saveCustom( QDomElement &, QDomDocument & )
00316 {
00317 return false;
00318 }
00319
00320 bool KivioBaseTargetStencil::loadCustom( const QDomElement & )
00321 {
00322 return true;
00323 }
00324
00325 QDomElement KivioBaseTargetStencil::saveTargets( QDomDocument &doc )
00326 {
00327 KivioConnectorTarget *p;
00328
00329 QDomElement e = doc.createElement("TargetList");
00330
00331 p = m_pTargets->first();
00332 while( p )
00333 {
00334 e.appendChild( p->saveXML(doc) );
00335
00336 p = m_pTargets->next();
00337 }
00338
00339 return e;
00340 }
00341
00342 bool KivioBaseTargetStencil::loadTargets( const QDomElement &e )
00343 {
00344 KivioConnectorTarget *p;
00345 QDomNode node;
00346 QDomElement targetE;
00347 QString nodeName;
00348
00349 m_pTargets->clear();
00350
00351 node = e.firstChild();
00352 while( !node.isNull() )
00353 {
00354 nodeName = node.nodeName();
00355 targetE = node.toElement();
00356
00357 if( nodeName == "KivioConnectorTarget" )
00358 {
00359 p = new KivioConnectorTarget();
00360 p->loadXML( targetE );
00361 m_pTargets->append(p);
00362 p = NULL;
00363 }
00364
00365
00366 node = node.nextSibling();
00367 }
00368
00369
00370 return true;
00371 }
00372
00373
00374
00376
00377
00378
00380 void KivioBaseTargetStencil::updateGeometry()
00381 {
00382 ;
00383 }
00384
00385
00386
00387
00389
00390
00391
00393 KivioConnectorTarget *KivioBaseTargetStencil::connectToTarget( KivioConnectorPoint *p, double threshHold)
00394 {
00395 double px = p->x();
00396 double py = p->y();
00397
00398 double tx, ty;
00399
00400 KivioConnectorTarget *pTarget = m_pTargets->first();
00401 while( pTarget )
00402 {
00403 tx = pTarget->x();
00404 ty = pTarget->y();
00405
00406
00407 if( px >= tx - threshHold &&
00408 px <= tx + threshHold &&
00409 py >= ty - threshHold &&
00410 py <= ty + threshHold )
00411 {
00412
00413
00414 p->setTarget( pTarget );
00415 return pTarget;
00416 }
00417
00418 pTarget = m_pTargets->next();
00419 }
00420
00421 return NULL;
00422 }
00423
00424
00425
00426 KivioConnectorTarget *KivioBaseTargetStencil::connectToTarget( KivioConnectorPoint *p, int )
00427 {
00428 int id = p->targetId();
00429
00430 KivioConnectorTarget *pTarget = m_pTargets->first();
00431 while( pTarget )
00432 {
00433 if( pTarget->id() == id )
00434 {
00435 p->setTarget(pTarget);
00436
00437 return pTarget;
00438 }
00439
00440 pTarget = m_pTargets->next();
00441 }
00442
00443 return NULL;
00444 }
00445
00446
00447
00448
00450
00451
00452
00454 int KivioBaseTargetStencil::generateIds( int nextAvailable )
00455 {
00456 KivioConnectorTarget *pTarget = m_pTargets->first();
00457
00458
00459 while( pTarget )
00460 {
00461
00462 if( pTarget->hasConnections() )
00463 {
00464
00465 pTarget->setId( nextAvailable );
00466
00467
00468 nextAvailable++;
00469 }
00470 else
00471 {
00472
00473 pTarget->setId( -1 );
00474 }
00475
00476 pTarget = m_pTargets->next();
00477 }
00478
00479
00480 return nextAvailable;
00481 }
00482
00483 void KivioBaseTargetStencil::copyBasicInto( KivioBaseTargetStencil *pStencil )
00484 {
00485 pStencil->setSpawner( m_pSpawner );
00486
00487 m_pFillStyle->copyInto( pStencil->m_pFillStyle );
00488 m_pLineStyle->copyInto( pStencil->m_pLineStyle );
00489 m_pTextStyle->copyInto( pStencil->m_pTextStyle );
00490
00491
00492 KivioConnectorTarget *pSrcTarget, *pTgTarget;
00493 pSrcTarget = m_pTargets->first();
00494 pTgTarget = pStencil->m_pTargets->first();
00495
00496 while( pSrcTarget && pTgTarget )
00497 {
00498 pTgTarget->setPosition( pSrcTarget->x(), pSrcTarget->y() );
00499
00500 pSrcTarget = m_pTargets->next();
00501 pTgTarget = pStencil->m_pTargets->next();
00502 }
00503
00504
00505 pStencil->m_x = m_x;
00506 pStencil->m_y = m_y;
00507 pStencil->m_w = m_w;
00508 pStencil->m_h = m_h;
00509
00510 *(pStencil->m_pProtection) = *m_pProtection;
00511 *(pStencil->m_pCanProtect) = *m_pCanProtect;
00512 }
00513
00514 int KivioBaseTargetStencil::resizeHandlePositions()
00515 {
00516
00517 int mask = KIVIO_RESIZE_HANDLE_POSITION_ALL;
00518
00519 if( m_pProtection->at( kpWidth ) )
00520 {
00521 mask &= ~(krhpNE | krhpNW | krhpSW | krhpSE | krhpE | krhpW);
00522 }
00523
00524 if( m_pProtection->at( kpHeight) )
00525 {
00526 mask &= ~(krhpNE | krhpNW | krhpSW | krhpSE | krhpN | krhpS);
00527 }
00528
00529 return mask;
00530 }
|