kivio

kivio_base_target_stencil.cpp

00001 #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 // KivioLineStyle
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 // KivioFillStyle
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 // KivioTextStyle
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 // Paint Routines
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   // We don't draw these if we are selected!!!
00168   if( isSelected() == true )
00169     return;
00170 
00171   // Obtain the graphic used for KivioConnectorTargets
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 // File I/O
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     // Only save custom data if this returns true (means there is custom data)
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 // Geometry Routine
00378 //
00380 void KivioBaseTargetStencil::updateGeometry()
00381 {
00382     ;
00383 }
00384 
00385 
00386 
00387 
00389 //
00390 // Target Routines
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             // setTarget calls pTarget->addConnectorPoint() and removes
00413             // any previous connections from p
00414             p->setTarget( pTarget );
00415             return pTarget;
00416         }
00417 
00418         pTarget = m_pTargets->next();
00419     }
00420 
00421     return NULL;
00422 }
00423 
00424 // we probably don't need targetID in the function since it's stored in p... but I don't remember so
00425 // i'm leaving it here for now.
00426 KivioConnectorTarget *KivioBaseTargetStencil::connectToTarget( KivioConnectorPoint *p, int /*targetID*/ )
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 // ID Generation
00452 //
00454 int KivioBaseTargetStencil::generateIds( int nextAvailable )
00455 {
00456     KivioConnectorTarget *pTarget = m_pTargets->first();
00457 
00458     // Iterate through all the targets
00459     while( pTarget )
00460     {
00461         // If this target has something connected to it
00462         if( pTarget->hasConnections() )
00463         {
00464             // Set it's id to the next available id
00465             pTarget->setId( nextAvailable );
00466 
00467             // Increment the next available id
00468             nextAvailable++;
00469         }
00470         else
00471         {
00472             // Otherwise mark it as unused (-1)
00473             pTarget->setId( -1 );
00474         }
00475 
00476         pTarget = m_pTargets->next();
00477     }
00478 
00479     // Return the next availabe id
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     // Copy the targets
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     // Copy the geometry
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    // Calculate the resize handle positions
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 }
KDE Home | KDE Accessibility Home | Description of Access Keys