19#include "kivio_common.h"
20#include "kivio_connector_point.h"
21#include "kivio_connector_target.h"
22#include "kivio_group_stencil.h"
23#include "kivio_intra_stencil_data.h"
24#include "kivio_layer.h"
25#include "kivio_painter.h"
26#include "kivio_stencil.h"
27#include "kivio_stencil_spawner.h"
28#include "kivio_stencil_spawner_info.h"
29#include "kivio_stencil_spawner_set.h"
30#include "KIvioLayerIface.h"
32#include "kivio_page.h"
38#include <KoZoomHandler.h>
41#include <KoXmlWriter.h>
43KivioLayer::KivioLayer( KivioPage *pPage )
47 m_name = i18n(
"Untitled Layer");
49 m_pStencilList =
new TQPtrList<KivioStencil>;
50 m_pStencilList->setAutoDelete(
true);
52 m_pDeletedStencilList =
new TQPtrList<KivioStencil>;
53 m_pDeletedStencilList->setAutoDelete(
true);
58 setConnectable(
false);
63DCOPObject* KivioLayer::dcopObject()
66 m_dcop =
new KIvioLayerIface(
this );
70KivioLayer::~KivioLayer()
72 kdDebug(43000)<<
"KivioLayer::~KivioLayer()***************:"<<
this<<endl;
75 delete m_pStencilList;
76 m_pStencilList = NULL;
78 delete m_pDeletedStencilList;
82bool KivioLayer::addStencil( KivioStencil *pStencil )
84 int pos = m_pDeletedStencilList->findRef(pStencil);
86 m_pDeletedStencilList->take( pos);
88 m_pStencilList->append( pStencil );
93void KivioLayer::takeStencilFromList( KivioStencil *pStencil )
95 int pos=m_pStencilList->findRef(pStencil);
96 m_pStencilList->take( pos );
97 m_pDeletedStencilList->append( pStencil );
100void KivioLayer::insertStencil( KivioStencil *pStencil )
102 int pos=m_pDeletedStencilList->findRef(pStencil);
104 m_pDeletedStencilList->take( pos);
106 m_pStencilList->append( pStencil );
109bool KivioLayer::removeStencil( KivioStencil *pStencil )
111 return m_pStencilList->remove( pStencil );
127KivioStencil *KivioLayer::loadSMLStencil(
const TQDomElement &stencilE )
131 kdDebug(43000) <<
"KivioLayer::loadSMLStencil() " << setId <<
" " << _id << endl;
133 setId = XmlReadString( stencilE,
"setId",
"" );
134 _id = XmlReadString( stencilE,
"id",
"" );
137 if( setId.length() == 0 ||
145 KivioStencilSpawner *pSpawner = m_pPage->doc()->findStencilSpawner(setId,_id);
148 KivioStencil *pStencil = pSpawner->newStencil();
149 pStencil->loadXML( stencilE );
169KivioStencil *KivioLayer::loadGroupStencil(
const TQDomElement &stencilE )
171 kdDebug(43000) <<
"KivioLayer::loadGroupStencil()" << endl;
173 KivioGroupStencil *pStencil =
new KivioGroupStencil();
175 if(pStencil->loadXML( stencilE,
this )==
false)
184KivioStencil *KivioLayer::loadPluginStencil(
const TQDomElement &stencilE )
188 kdDebug(43000) <<
"KivioLayer::loadPluginStencil() " << setId.ascii() <<
" / " << _id << endl;
191 setId = XmlReadString( stencilE,
"setId",
"" );
192 _id = XmlReadString( stencilE,
"id",
"" );
195 if( setId.length() == 0 ||
201 KivioStencilSpawner *pSpawner = m_pPage->doc()->findStencilSpawner(setId, _id);
204 KivioStencil *pStencil = pSpawner->newStencil();
205 pStencil->loadXML( stencilE );
213bool KivioLayer::loadXML(
const TQDomElement &layerE )
215 m_flags = XmlReadInt( layerE,
"flags", 1 );
216 kdDebug(43000) <<
"Flags: " << m_flags << endl;
217 m_name = XmlReadString( layerE,
"name",
"layerX" );
220 node = layerE.firstChild();
221 while( !node.isNull() )
223 TQString name = node.nodeName();
224 if( name ==
"KivioSMLStencil" || name ==
"KivioPyStencil" )
226 KivioStencil *pStencil = loadSMLStencil( node.toElement() );
229 pStencil->updateGeometry();
230 m_pStencilList->append( pStencil );
234 kdWarning(43000) <<
"KivioLayer::loadXML() - Unknown KivioSMLStencil (id=" <<
235 XmlReadString( node.toElement(),
"id",
"" ) <<
" set=" <<
236 XmlReadString( node.toElement(),
"setId",
"" ) <<
") found." << endl;
239 else if( name ==
"KivioGroupStencil" )
241 KivioStencil *pStencil = loadGroupStencil( node.toElement() );
244 m_pStencilList->append(pStencil);
248 kdWarning(43000) <<
"KivioLayer::loadXML() - Unable to load KivioGroupStencil" << endl;
251 else if( name ==
"KivioPluginStencil" )
253 KivioStencil *pStencil = loadPluginStencil( node.toElement() );
256 m_pStencilList->append(pStencil);
260 kdWarning(43000) <<
"KivioLayer - Unable to load KivioPluginStencil" << endl;
261 kdWarning(43000) <<
"KivioLayer::loadXML() - Unable to load KivioPluginStencil (id=" <<
262 XmlReadString( node.toElement(),
"id",
"" ) <<
" set=" <<
263 XmlReadString( node.toElement(),
"setId",
"" ) <<
") found." << endl;
267 node = node.nextSibling();
273void KivioLayer::loadOasis(
const TQDomElement& layer)
275 m_name = layer.attribute(
"draw:name");
280TQDomElement KivioLayer::saveXML( TQDomDocument &doc )
282 TQDomElement e = doc.createElement(
"KivioLayer");
284 XmlWriteInt( e,
"flags", m_flags );
285 XmlWriteString( e,
"name", m_name );
287 KivioStencil *pStencil = m_pStencilList->first();
290 e.appendChild( pStencil->saveXML( doc ) );
292 pStencil = m_pStencilList->next();
298void KivioLayer::saveOasis(KoXmlWriter* layerWriter)
300 layerWriter->startElement(
"draw:layer");
301 layerWriter->addAttribute(
"draw:name", m_name);
303 layerWriter->endElement();
306void KivioLayer::paintContent( KivioPainter& painter,
const TQRect&,
bool, TQPoint,
307 KoZoomHandler* zoom )
313 KivioStencil *pStencil = m_pStencilList->first();
314 KivioIntraStencilData data;
316 painter.setFGColor( TQColor(0,0,0) );
318 data.painter = &painter;
319 data.zoomHandler = zoom;
323 if(!pStencil->hidden()) {
324 pStencil->paint( &data );
327 pStencil = m_pStencilList->next();
331void KivioLayer::printContent( KivioPainter& painter,
int xdpi,
int ydpi )
333 if(!printable() || !visible())
337 xdpi = KoGlobal::dpiX();
341 ydpi = KoGlobal::dpiY();
344 KivioStencil *pStencil = m_pStencilList->first();
345 KivioIntraStencilData data;
346 KoZoomHandler zoomHandler;
347 zoomHandler.setZoomAndResolution(100, xdpi, ydpi);
349 painter.setFGColor( TQColor(0,0,0) );
351 data.painter = &painter;
352 data.zoomHandler = &zoomHandler;
353 data.printing =
true;
357 pStencil->paint( &data );
359 pStencil = m_pStencilList->next();
363void KivioLayer::printContent(KivioPainter& painter, KoZoomHandler* zoomHandler)
365 if(!printable() || !visible())
368 KivioStencil *pStencil = m_pStencilList->first();
369 KivioIntraStencilData data;
371 painter.setFGColor( TQColor(0,0,0) );
373 data.painter = &painter;
374 data.zoomHandler = zoomHandler;
375 data.printing =
true;
379 pStencil->paint( &data );
381 pStencil = m_pStencilList->next();
385void KivioLayer::paintConnectorTargets( KivioPainter& painter,
const TQRect&,
bool, TQPoint,
386 KoZoomHandler* zoom )
392 KivioIntraStencilData data;
394 painter.setFGColor( TQColor(0,0,0) );
396 data.painter = &painter;
397 data.zoomHandler = zoom;
399 KivioStencil *pStencil = m_pStencilList->first();
402 if(!pStencil->hidden()) {
403 pStencil->paintConnectorTargets( &data );
406 pStencil = m_pStencilList->next();
410void KivioLayer::paintSelectionHandles( KivioPainter& painter,
const TQRect&,
bool, TQPoint, KoZoomHandler* zoom )
416 KivioIntraStencilData data;
418 painter.setFGColor( TQColor(0,0,0) );
420 data.painter = &painter;
421 data.zoomHandler = zoom;
423 KivioStencil *pStencil = m_pStencilList->first();
426 if( pStencil->isSelected() && !pStencil->hidden() )
427 pStencil->paintSelectionHandles( &data );
429 pStencil = m_pStencilList->next();
433KivioStencil *KivioLayer::checkForStencil( KoPoint *pPoint,
int *collisionType,
float threshold,
bool selectedOnly )
435 KivioStencil *pStencil;
439 pStencil = m_pStencilList->last();
444 if( (selectedOnly==
true && pStencil->isSelected()==
true) ||
445 (selectedOnly==
false) )
447 if( (colType = pStencil->checkForCollision( pPoint, threshold )) != kctNone )
450 *collisionType = colType;
455 pStencil = m_pStencilList->prev();
459 *collisionType = kctNone;
464void KivioLayer::setVisible(
bool f )
468 m_flags = m_flags | FLOW_LAYER_VISIBLE;
472 m_flags = m_flags & (~FLOW_LAYER_VISIBLE);
476void KivioLayer::setConnectable(
bool f )
480 m_flags = m_flags | FLOW_LAYER_CONNECTABLE;
484 m_flags = m_flags & (~FLOW_LAYER_CONNECTABLE);
488void KivioLayer::setEditable(
bool f)
491 m_flags = m_flags & (~FLOW_LAYER_NOT_EDITABLE);
493 m_flags = m_flags | FLOW_LAYER_NOT_EDITABLE;
497void KivioLayer::setPrintable(
bool f)
500 m_flags = m_flags & (~FLOW_LAYER_NOT_PRINTABLE);
502 m_flags = m_flags | FLOW_LAYER_NOT_PRINTABLE;
506int KivioLayer::generateStencilIds(
int next )
508 KivioStencil *pStencil;
510 pStencil = m_pStencilList->first();
513 next = pStencil->generateIds( next );
515 pStencil = m_pStencilList->next();
521void KivioLayer::searchForConnections( KivioPage *p )
523 KivioStencil *pStencil;
526 pStencil = m_pStencilList->first();
532 pStencil->searchForConnections( p );
535 m_pStencilList->find( pCur );
537 pStencil = m_pStencilList->next();
541KivioStencil *KivioLayer::takeStencil( KivioStencil *p )
543 m_pStencilList->find( p );
545 return m_pStencilList->take();
556KivioConnectorTarget *KivioLayer::connectPointToTarget( KivioConnectorPoint *p,
float thresh )
558 KivioConnectorTarget *pTarget;
560 KivioStencil *pStencil = m_pStencilList->last();
564 if( pStencil != p->stencil() )
566 pTarget = pStencil->connectToTarget(p, thresh);
573 pStencil = m_pStencilList->prev();
579KoPoint KivioLayer::snapToTarget(
const KoPoint& p,
double thresh,
bool& hit )
582 KivioStencil *pStencil = m_pStencilList->last();
584 while( pStencil && !hit)
586 retVal = pStencil->snapToTarget(p, thresh, hit);
587 pStencil = m_pStencilList->prev();