diff options
Diffstat (limited to 'kpresenter/KPrGroupObject.cpp')
-rw-r--r-- | kpresenter/KPrGroupObject.cpp | 642 |
1 files changed, 642 insertions, 0 deletions
diff --git a/kpresenter/KPrGroupObject.cpp b/kpresenter/KPrGroupObject.cpp new file mode 100644 index 00000000..5a21aaed --- /dev/null +++ b/kpresenter/KPrGroupObject.cpp @@ -0,0 +1,642 @@ +// -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*- +/* This file is part of the KDE project + Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org> + Copyright (C) 2005 Thorsten Zachmann <zachmann@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#include "KPrGroupObject.h" + +#include "KPrDocument.h" +#include "KPrLineObject.h" +#include "KPrRectObject.h" +#include "KPrEllipseObject.h" +#include "KPrAutoformObject.h" +#include "KPrTextObject.h" +#include "KPrPixmapObject.h" +#include "KPrPieObject.h" +#include "KPrFreehandObject.h" +#include "KPrPolylineObject.h" +#include "KPrBezierCurveObject.h" +#include "KPrPolygonObject.h" +#include "KPrClosedLineObject.h" +#include <kdebug.h> +#include <KoOasisContext.h> + +#include <qpainter.h> +using namespace std; + +KPrGroupObject::KPrGroupObject() + : KPrObject(), objects( QPtrList<KPrObject>() ), updateObjs( false ) +{ + objects.setAutoDelete( false ); +} + +KPrGroupObject::KPrGroupObject( const QPtrList<KPrObject> &objs ) + : KPrObject(), objects( objs ), updateObjs( false ) +{ + objects.setAutoDelete( false ); +} + +KPrGroupObject &KPrGroupObject::operator=( const KPrGroupObject & ) +{ + return *this; +} + +void KPrGroupObject::selectAllObj() +{ + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setSelected(true); +} + +void KPrGroupObject::deSelectAllObj() +{ + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setSelected(false); +} + +void KPrGroupObject::setSize( double _width, double _height ) +{ + KoSize origSize( ext ); + KPrObject::setSize( _width, _height ); + + double fx = ext.width() / origSize.width(); + double fy = ext.height() / origSize.height(); + + updateSizes( fx, fy ); +} + +void KPrGroupObject::setOrig( const KoPoint &_point ) +{ + setOrig( _point.x(), _point.y() ); +} + +void KPrGroupObject::setOrig( double _x, double _y ) +{ + double dx = 0; + double dy = 0; + if ( !orig.isNull() ) { + dx = _x - orig.x(); + dy = _y - orig.y(); + } + + KPrObject::setOrig( _x, _y ); + + if ( dx != 0 || dy != 0 ) + updateCoords( dx, dy ); +} + +void KPrGroupObject::moveBy( const KoPoint &_point ) +{ + moveBy( _point.x(), _point.y() ); +} + +void KPrGroupObject::moveBy( double _dx, double _dy ) +{ + KPrObject::moveBy( _dx, _dy ); + updateCoords( _dx, _dy ); +} + +QDomDocumentFragment KPrGroupObject::save( QDomDocument& doc, double offset ) +{ + QDomDocumentFragment fragment=KPrObject::save(doc, offset); + QDomElement objs=doc.createElement("OBJECTS"); + fragment.appendChild(objs); + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + { + if ( it.current()->getType() == OT_PART ) + continue; + QDomElement object=doc.createElement("OBJECT"); + object.setAttribute("type", static_cast<int>( it.current()->getType() )); + object.appendChild(it.current()->save( doc,offset )); + objs.appendChild(object); + } + return fragment; +} + + +bool KPrGroupObject::saveOasisObjectAttributes( KPOasisSaveContext &sc ) const +{ + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + { + //TODO what to do with parts? + it.current()->saveOasisObject( sc ); + } + return true; +} + +void KPrGroupObject::saveOasisPosObject( KoXmlWriter &xmlWriter, int indexObj ) const +{ + xmlWriter.addAttribute( "draw:id", "object" + QString::number( indexObj ) ); +} + + +const char * KPrGroupObject::getOasisElementName() const +{ + return "draw:g"; +} + + +void KPrGroupObject::loadOasisGroupObject( KPrDocument *_doc, KPrPage * newpage, QDomNode &element, KoOasisContext & context, KPrLoadingInfo */*info*/ ) +{ + //KPrObject::loadOasis( element, context, info ); + updateObjs = false; + _doc->loadOasisObject( newpage,element, context, this); + QPtrListIterator<KPrObject> it( objects ); + KoRect r=KoRect(); + for ( ; it.current() ; ++it ) + { + r |= it.current()->getRealRect(); + } + setOrig( r.x(), r.y() ); + setSize( r.width(), r.height() ); + updateObjs = true; +} + +void KPrGroupObject::addObjects( KPrObject * obj ) +{ + kdDebug()<<"add object to group object:"<<obj<<endl; + objects.append( obj ); +} + +double KPrGroupObject::load( const QDomElement &element, KPrDocument *doc) +{ + //FIXME + double offset=KPrObject::load(element); + updateObjs = false; + QDomElement group=element.namedItem("OBJECTS").toElement(); + if(!group.isNull()) { + QDomElement current=group.firstChild().toElement(); + while(!current.isNull()) { + ObjType t = OT_LINE; + if(current.tagName()=="OBJECT") { + if(current.hasAttribute("type")) + t=static_cast<ObjType>(current.attribute("type").toInt()); + double objOffset; + switch ( t ) { + case OT_LINE: { + KPrLineObject *kplineobject = new KPrLineObject(); + objOffset = kplineobject->load(current); + kplineobject->setOrig(kplineobject->getOrig().x(),objOffset - offset); + objects.append( kplineobject ); + } break; + case OT_RECT: { + KPrRectObject *kprectobject = new KPrRectObject(); + objOffset = kprectobject->load(current); + kprectobject->setOrig(kprectobject->getOrig().x(),objOffset - offset); + objects.append( kprectobject ); + } break; + case OT_ELLIPSE: { + KPrEllipseObject *kpellipseobject = new KPrEllipseObject(); + objOffset = kpellipseobject->load(current); + kpellipseobject->setOrig(kpellipseobject->getOrig().x(),objOffset - offset); + objects.append( kpellipseobject ); + } break; + case OT_PIE: { + KPrPieObject *kppieobject = new KPrPieObject(); + objOffset = kppieobject->load(current); + kppieobject->setOrig(kppieobject->getOrig().x(),objOffset - offset); + objects.append( kppieobject ); + } break; + case OT_AUTOFORM: { + KPrAutoformObject *kpautoformobject = new KPrAutoformObject(); + objOffset = kpautoformobject->load(current); + kpautoformobject->setOrig(kpautoformobject->getOrig().x(),objOffset - offset); + objects.append( kpautoformobject ); + } break; + case OT_TEXT: { + KPrTextObject *kptextobject = new KPrTextObject( doc ); + objOffset = kptextobject->load(current); + kptextobject->setOrig(kptextobject->getOrig().x(),objOffset - offset); + objects.append( kptextobject ); + } break; + case OT_CLIPART: + case OT_PICTURE: { + KPrPixmapObject *kppixmapobject = new KPrPixmapObject( doc->pictureCollection() ); + objOffset = kppixmapobject->load(current); + kppixmapobject->setOrig(kppixmapobject->getOrig().x(),objOffset - offset); + kppixmapobject->reload(); + objects.append( kppixmapobject ); + } break; + case OT_FREEHAND: { + KPrFreehandObject *kpfreehandobject = new KPrFreehandObject(); + objOffset = kpfreehandobject->load( current ); + kpfreehandobject->setOrig(kpfreehandobject->getOrig().x(),objOffset - offset); + objects.append( kpfreehandobject ); + } break; + case OT_POLYLINE: { + KPrPolylineObject *kppolylineobject = new KPrPolylineObject(); + objOffset = kppolylineobject->load( current ); + kppolylineobject->setOrig(kppolylineobject->getOrig().x(),objOffset - offset); + objects.append( kppolylineobject ); + } break; + case OT_QUADRICBEZIERCURVE: { + KPrQuadricBezierCurveObject *kpQuadricBezierCurveObject = new KPrQuadricBezierCurveObject(); + objOffset = kpQuadricBezierCurveObject->load( current ); + kpQuadricBezierCurveObject->setOrig(kpQuadricBezierCurveObject->getOrig().x(),objOffset - offset); + objects.append( kpQuadricBezierCurveObject ); + } break; + case OT_CUBICBEZIERCURVE: { + KPrCubicBezierCurveObject *kpCubicBezierCurveObject = new KPrCubicBezierCurveObject(); + objOffset = kpCubicBezierCurveObject->load( current ); + kpCubicBezierCurveObject->setOrig(kpCubicBezierCurveObject->getOrig().x(),objOffset - offset); + objects.append( kpCubicBezierCurveObject ); + } break; + case OT_POLYGON: { + KPrPolygonObject *kpPolygonObject = new KPrPolygonObject(); + objOffset = kpPolygonObject->load( current ); + kpPolygonObject->setOrig(kpPolygonObject->getOrig().x(),objOffset - offset); + objects.append( kpPolygonObject ); + } break; + case OT_GROUP: { + KPrGroupObject *kpgroupobject = new KPrGroupObject(); + objOffset = kpgroupobject->load(current, doc); + kpgroupobject->setOrig(kpgroupobject->getOrig().x(),objOffset - offset); + objects.append( kpgroupobject ); + } break; + case OT_CLOSED_LINE: { + KPrClosedLineObject *kpClosedLinneObject = new KPrClosedLineObject(); + objOffset = kpClosedLinneObject->load( current ); + kpClosedLinneObject->setOrig(kpClosedLinneObject->getOrig().x(),objOffset - offset); + objects.append( kpClosedLinneObject ); + } break; + default: break; + } + } + current=current.nextSibling().toElement(); + } + } + updateObjs = true; + return offset; +} + +void KPrGroupObject::draw( QPainter *_painter,KoTextZoomHandler *_zoomhandler, + int pageNum, SelectionMode selectionMode, bool drawContour ) +{ + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->draw( _painter, _zoomhandler, pageNum, selectionMode, drawContour ); + + KPrObject::draw( _painter, _zoomhandler, pageNum, selectionMode, drawContour ); +} + +void KPrGroupObject::updateSizes( double fx, double fy ) +{ + if ( !updateObjs ) + return; + KoRect r = KoRect(); + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + { + double _x = ( it.current()->getOrig().x() - orig.x() ) * fx + orig.x(); + double _y = ( it.current()->getOrig().y() - orig.y() ) * fy + orig.y(); + it.current()->setOrig( _x, _y ); + + double _w = it.current()->getSize().width() * fx; + double _h = it.current()->getSize().height() * fy; + it.current()->setSize( _w, _h ); + } +} + +void KPrGroupObject::updateCoords( double dx, double dy ) +{ + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->moveBy( dx, dy ); +} + +void KPrGroupObject::rotate( float _angle ) +{ + float oldAngle = angle; + float diffAngle = _angle - angle; + float angInRad = diffAngle * M_PI / 180; + + KPrObject::rotate( _angle ); + + // find center of the group + double centerx = orig.x() + ext.width() / 2.0; + double centery = orig.y() + ext.height() / 2.0; + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) { + // find distance of object center to group center + double px = it.current()->getOrig().x() + it.current()->getSize().width() / 2.0 - centerx; + double py = it.current()->getOrig().y() + it.current()->getSize().height() / 2.0 - centery; + // find distance for move + double mx = px * cos( angInRad ) - py * sin( angInRad ) - px; + double my = px * sin( angInRad ) + py * cos( angInRad ) - py; + double objAngle = it.current()->getAngle(); + // If part of group was already rotated the difference has to be added + // to the angle + if ( objAngle != oldAngle ) + it.current()->rotate( objAngle + diffAngle ); + else + it.current()->rotate( _angle ); + it.current()->moveBy( mx, my ); + } +} + +void KPrGroupObject::setShadowParameter( int _distance, ShadowDirection _direction, const QColor &_color ) +{ + KPrObject::setShadowParameter( _distance, _direction, _color ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setShadowParameter( _distance, _direction, _color ); +} + +void KPrGroupObject::setShadowDistance( int _distance ) +{ + KPrObject::setShadowDistance( _distance ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setShadowDistance( _distance ); +} + +void KPrGroupObject::setShadowDirection( ShadowDirection _direction ) +{ + KPrObject::setShadowDirection( _direction ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setShadowDirection( _direction ); +} + +void KPrGroupObject::setShadowColor( const QColor &_color ) +{ + KPrObject::setShadowColor( _color ); + kdDebug(33001) << "KPrGroupObject::setShadowColor"<<updateObjs << endl; + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setShadowColor( _color ); +} + +void KPrGroupObject::setEffect( Effect _effect ) +{ + KPrObject::setEffect( _effect ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setEffect( _effect ); +} + +void KPrGroupObject::setEffect2( Effect2 _effect2 ) +{ + KPrObject::setEffect2( _effect2 ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setEffect2( _effect2 ); +} + +void KPrGroupObject::setAppearStep( int _appearStep ) +{ + KPrObject::setAppearStep( _appearStep ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setAppearStep( _appearStep ); +} + +void KPrGroupObject::setDisappear( bool b ) +{ + KPrObject::setDisappear( b ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setDisappear( b ); +} + +void KPrGroupObject::setDisappearStep( int _disappearStep ) +{ + KPrObject::setDisappearStep( _disappearStep ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setDisappearStep( _disappearStep ); +} + +void KPrGroupObject::setEffect3( Effect3 _effect3) +{ + KPrObject::setEffect3( _effect3 ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setEffect3( _effect3 ); +} + +void KPrGroupObject::setAppearTimer( int _appearTimer ) +{ + KPrObject::setAppearTimer( _appearTimer ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setAppearTimer( _appearTimer ); +} + +void KPrGroupObject::setDisappearTimer( int _disappearTimer ) +{ + KPrObject::setDisappearTimer( _disappearTimer ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setDisappearTimer( _disappearTimer ); +} + +void KPrGroupObject::setOwnClipping( bool _ownClipping ) +{ + KPrObject::setOwnClipping( _ownClipping ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setOwnClipping( _ownClipping ); +} + +void KPrGroupObject::setSubPresStep( int _subPresStep ) +{ + KPrObject::setSubPresStep( _subPresStep ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setSubPresStep( _subPresStep ); +} + +void KPrGroupObject::doSpecificEffects( bool _specEffects, bool _onlyCurrStep ) +{ + KPrObject::doSpecificEffects( _specEffects, _onlyCurrStep ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->doSpecificEffects( _specEffects, _onlyCurrStep ); +} + +void KPrGroupObject::setAppearSoundEffect( bool b ) +{ + KPrObject::setAppearSoundEffect( b ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->setAppearSoundEffect( b ); +} + +void KPrGroupObject::setDisappearSoundEffect( bool b ) +{ + KPrObject::setDisappearSoundEffect( b ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects); + for ( ; it.current() ; ++it ) + it.current()->setDisappearSoundEffect( b ); +} + +void KPrGroupObject::setAppearSoundEffectFileName( const QString &_a_fileName ) +{ + KPrObject::setAppearSoundEffectFileName( _a_fileName ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects); + for ( ; it.current() ; ++it ) + it.current()->setAppearSoundEffectFileName( _a_fileName ); +} + +void KPrGroupObject::setDisappearSoundEffectFileName( const QString &_d_fileName ) +{ + KPrObject::setDisappearSoundEffectFileName( _d_fileName ); + + if ( !updateObjs ) + return; + QPtrListIterator<KPrObject> it( objects); + for ( ; it.current() ; ++it ) + it.current()->setDisappearSoundEffectFileName( _d_fileName ); +} + +void KPrGroupObject::getAllObjectSelectedList(QPtrList<KPrObject> &lst,bool force ) +{ + if ( selected || force) + { + QPtrListIterator<KPrObject> it( objects); + for ( ; it.current() ; ++it ) + it.current()->getAllObjectSelectedList( lst, true ); + } +} + +void KPrGroupObject::addTextObjects( QPtrList<KoTextObject> &lst ) const +{ + QPtrListIterator<KPrObject> it( objects); + for ( ; it.current() ; ++it ) + it.current()->addTextObjects( lst ); +} + +void KPrGroupObject::flip( bool horizontal ) { + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) { + it.current()->flip( horizontal ); + double mx = 0; + double my = 0; + if ( ! horizontal ) + { + double disttop = it.current()->getOrig().y() - orig.y(); + double distbottom = ext.height() - disttop - it.current()->getSize().height(); + my = distbottom - disttop; + } + else + { + double distleft = it.current()->getOrig().x() - orig.x(); + double distright = ext.width() - distleft - it.current()->getSize().width(); + mx = distright - distleft; + } + it.current()->moveBy( mx, my ); + } +} + +void KPrGroupObject::removeFromObjList() +{ + inObjList = false; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->removeFromObjList(); +} + +void KPrGroupObject::addToObjList() +{ + inObjList = true; + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->addToObjList(); +} + +void KPrGroupObject::incCmdRef() +{ + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->incCmdRef(); + + cmds++; +} + +void KPrGroupObject::decCmdRef() +{ + QPtrListIterator<KPrObject> it( objects ); + for ( ; it.current() ; ++it ) + it.current()->decCmdRef(); + + cmds--; + doDelete(); +} |