diff options
Diffstat (limited to 'kpresenter/KPrPage.cpp')
| -rw-r--r-- | kpresenter/KPrPage.cpp | 2614 | 
1 files changed, 2614 insertions, 0 deletions
diff --git a/kpresenter/KPrPage.cpp b/kpresenter/KPrPage.cpp new file mode 100644 index 000000000..8529d2ea9 --- /dev/null +++ b/kpresenter/KPrPage.cpp @@ -0,0 +1,2614 @@ +// -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*- +/* This file is part of the KDE project +   Copyright (C) 2002-2004 Laurent MONTEL <montel@kde.org> +   Copyright (C) 2004-2006 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 <kurl.h> + +#include "KPrPage.h" +#include "KPrView.h" +#include "KPrPageIface.h" + +#include "KPrBackground.h" +#include "KPrLineObject.h" +#include "KPrRectObject.h" +#include "KPrEllipseObject.h" +#include "KPrAutoformObject.h" +#include "KPrTextObject.h" +#include "KPrPixmapObject.h" +#include "KPrPieObject.h" +#include "KPrPartObject.h" +#include "KPrGroupObject.h" +#include "KPrCommand.h" +#include "KPrFreehandObject.h" +#include "KPrPolylineObject.h" +#include "KPrBezierCurveObject.h" +#include "KPrPolygonObject.h" +#include "KPrClosedLineObject.h" +#include "KPrUtils.h" +#include <kdebug.h> +#include <KoQueryTrader.h> +#include "KPrDocument.h" + +#include <KoStore.h> +#include <KoStoreDevice.h> +#include <KoTextZoomHandler.h> +#include <KoXmlNS.h> +#include "KoPointArray.h" +#include "KPrTextDocument.h" +#include <KoTextObject.h> +#include <KoTextParag.h> +#include <KoRect.h> +#include <qapplication.h> +#include <KoStyleCollection.h> +#include <KoVariable.h> +#include <KoGenStyles.h> +#include <KoXmlWriter.h> +#include <ktempfile.h> +#include <qbuffer.h> +#include <qregexp.h> +#include <qfile.h> + +struct listAnimation { +    KPrObject *obj; +    int objIndex; +    bool appear; +}; + +typedef QMap<int, QPtrList<listAnimation> > lstMap; + + +KPrPage::KPrPage(KPrDocument *_doc, KPrPage *masterPage ) +    : m_doc( _doc ) +    , m_masterPage( masterPage ) +    , m_dcop( 0 ) +    , m_selectedSlides( true ) +    , m_bHasHeader( false ) +    , m_bHasFooter( false ) +    , m_useMasterBackground( false ) +    , m_displayObjectFromMasterPage( true ) +    , m_displayBackground( true ) +    , m_pageEffect( PEF_NONE ) +    , m_pageEffectSpeed( ES_MEDIUM ) +    , m_soundEffect( false ) +    , m_soundFileName( QString::null ) +    , m_pageTimer( 1 ) +{ +    kdDebug(33001)<<"create page : KPrPage::KPrPage(KPrDocument *_doc )"<<this<<endl; +    m_objectList.setAutoDelete( false ); + +    m_kpbackground= new KPrBackGround( this ); + +    //don't create dcopobject by default +    //dcopObject(); +} + +KPrPage::~KPrPage() +{ +    kdDebug(33001)<<"Delete page :KPrPage::~KPrPage() :"<<this<<endl; +    //delete object list. +    m_objectList.setAutoDelete( true ); +    m_objectList.clear(); +    delete m_kpbackground; +    delete m_dcop; +} + +DCOPObject* KPrPage::dcopObject() +{ +    if ( !m_dcop ) { +        // 0-based. 1-based would be nicer for the dcop user, but well, docs and views are 0-based, +	// and the page(int) DCOP call is 0-based. +        int pgnum = m_doc->pageList().findRef( this ); +        m_dcop = new KPrPageIface( this, pgnum ); +    } + +    return m_dcop; +} + + +void KPrPage::saveOasisObject( KoStore *store, KoXmlWriter &xmlWriter, KoSavingContext& context, int & indexObj, int &partIndexObj,  KoXmlWriter* manifestWriter ) const +{ +    Q_UNUSED( store ); +    Q_UNUSED( manifestWriter ); +    KPrObject::KPOasisSaveContext sc( xmlWriter, context, indexObj, partIndexObj, isMasterPage() ); + +    KTempFile animationTmpFile; +    animationTmpFile.setAutoDelete( true ); +    QFile* tmpFile = animationTmpFile.file(); +    KoXmlWriter animationTmpWriter( tmpFile ); +    lstMap listObjectAnimation; +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()== m_doc->header() || it.current()== m_doc->footer()) +            continue; +        it.current()->saveOasisObject( sc ); + +        if ( it.current()->hasAnimation() ) +        { +            if ( it.current()->getEffect() != EF_NONE || +                 it.current()->getAppearStep() != 0 || +                 !it.current()->getAppearSoundEffectFileName().isEmpty() ) +            { +                kdDebug(33001) << "has animation" << endl; +                listAnimation *lstappear = new listAnimation; +                lstappear->obj = it.current(); +                lstappear->objIndex = indexObj; +                lstappear->appear = true; +                //kdDebug()<<" indexObj :"<<indexObj<<endl; +                lstMap::Iterator tmp = listObjectAnimation.find( it.current()->getAppearStep() ); +                if ( tmp!= listObjectAnimation.end() ) +                { +                    //kdDebug()<<" group already exist \n"; +                    tmp.data().append( lstappear ); +                } +                else +                { +                    //kdDebug()<<" create new list \n"; +                    QPtrList<listAnimation> tmp2; +                    tmp2.append( lstappear ); +                    listObjectAnimation.insert( it.current()->getAppearStep(), tmp2 ); +                } +            } +            if ( it.current()->getDisappear() ) +            { +                listAnimation *lstappear = new listAnimation; +                lstappear->obj = it.current(); +                lstappear->objIndex = indexObj; +                lstappear->appear = false; +                //kdDebug()<<" indexObj :"<<indexObj<<endl; +                lstMap::Iterator tmp = listObjectAnimation.find( it.current()->getDisappearStep() ); +                if ( tmp!= listObjectAnimation.end() ) +                { +                    //kdDebug()<<" group already exist \n"; +                    tmp.data().append( lstappear ); +                } +                else +                { +                    //kdDebug()<<" create new list \n"; +                    QPtrList<listAnimation> tmp2; +                    tmp2.append( lstappear ); +                    listObjectAnimation.insert( it.current()->getDisappearStep(), tmp2 ); +                } +            } + +        } +        ++indexObj; +    } + +    if ( !listObjectAnimation.isEmpty() ) +    { +        kdDebug()<<"! listObjectAnimation.isEmpty() :"<<listObjectAnimation.count()<<endl; +        animationTmpWriter.startElement( "presentation:animations" ); +        lstMap::Iterator it = listObjectAnimation.begin(); +        lstMap::Iterator end = listObjectAnimation.end(); +        for (; it != end; ++it ) +        { +            if ( it.data().count() == 1 ) +            { +                kdDebug()<<" add unique element \n"; +                if ( it.data().at( 0 )->appear ) +                    it.data().at( 0 )->obj->saveOasisObjectStyleShowAnimation( animationTmpWriter, it.data().at( 0 )->objIndex ); +                else +                    it.data().at( 0 )->obj->saveOasisObjectStyleHideAnimation( animationTmpWriter, it.data().at( 0 )->objIndex ); +            } +            else if ( it.data().count() > 1 ) +            { +                QPtrList<listAnimation> list = it.data(); +                animationTmpWriter.startElement( "presentation:animation-group" ); +                for ( uint i = 0; i < list.count(); ++i ) +                { +                    if ( list.at(i) ) +                    { +                        kdDebug()<<" add group element : "<<i<<endl; +                        if ( list.at(i)->appear ) +                            list.at(i)->obj->saveOasisObjectStyleShowAnimation( animationTmpWriter, list.at(i)->objIndex ); +                        else +                            list.at(i)->obj->saveOasisObjectStyleHideAnimation( animationTmpWriter, list.at(i)->objIndex ); +                    } +                } +                animationTmpWriter.endElement(); +            } + +        } +        animationTmpWriter.endElement();//close "presentation:animations" +        tmpFile->close(); +        xmlWriter.addCompleteElement( tmpFile ); + +    } +    else +        tmpFile->close(); +    animationTmpFile.close(); +} + +void KPrPage::load( const QDomElement &element ) +{ +    m_kpbackground->load( element ); +    QDomElement e=element.namedItem("PGEFFECT").toElement(); +    if(!e.isNull()) { +        int tmp=0; +        if(e.hasAttribute("value")) +            tmp=e.attribute("value").toInt(); +        setPageEffect(static_cast<PageEffect>(tmp)); +        tmp = (int)ES_MEDIUM; +        if(e.hasAttribute("speed")) +            tmp=e.attribute("speed").toInt(); +        setPageEffectSpeed( static_cast<EffectSpeed>(tmp) ); +    } +    e=element.namedItem("PGTIMER").toElement(); +    if(!e.isNull()) { +        int timer = 1; +        if(e.hasAttribute("timer")) +            timer=e.attribute("timer").toInt(); +        setPageTimer(timer); +    } +    else +        setPageTimer(1); +    e=element.namedItem("PGSOUNDEFFECT").toElement(); +    if(!e.isNull()) { +        if(e.hasAttribute("soundEffect")) +            m_soundEffect=static_cast<bool>(e.attribute("soundEffect").toInt()); +        else +            m_soundEffect=false; + +        if(e.hasAttribute("soundFileNmae")) // old typo +            m_soundFileName=e.attribute("soundFileNmae"); +        else +            m_soundFileName=e.attribute("soundFileName"); +    } +    else { +        m_soundFileName=QString::null; +    } + +    e=element.namedItem("HEADERFOOTER").toElement(); +    if(!e.isNull()) { +        if(e.hasAttribute("header")) +            m_bHasHeader =static_cast<bool>(e.attribute("header").toInt()); +        else +            m_bHasHeader = false; + +        if(e.hasAttribute("footer")) +            m_bHasFooter =static_cast<bool>(e.attribute("footer").toInt()); +        else +            m_bHasFooter = false; +    } +} + +//TODO: implement display/hide background into old file format +void KPrPage::loadOasis(KoOasisContext & context ) +{ +    m_kpbackground->loadOasis( context ); + +    KoStyleStack& styleStack = context.styleStack(); +    kdDebug()<<"KPrPage::loadOasis()\n"; +    styleStack.setTypeProperties( "drawing-page" ); + +    if ( !isMasterPage() ) +    { +        if ( !styleStack.hasAttributeNS( KoXmlNS::draw, "fill" ) ) +        { +            // if non is set the fill style of the master slide is used: see OD 14.13.2 Drawing Page Style +            m_useMasterBackground = true; +        } +        //FIXME: fix it in old file format +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "background-objects-visible" ) ) +        { +            const QString str = styleStack.attributeNS( KoXmlNS::presentation, "background-objects-visible" ); +            m_displayObjectFromMasterPage = ( str == "true" ) ? true : false; +        } + +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "background-visible" ) ) +        { +            const QString str = styleStack.attributeNS( KoXmlNS::presentation, "background-visible" ); +            m_displayBackground = ( str == "true" ) ? true : false; +        } + +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "visibility" ) ) +        { +            const QString str = styleStack.attributeNS( KoXmlNS::presentation, "visibility" ); +            if ( str=="hidden" ) +                slideSelected( false ); +            else +                kdDebug()<<" presentation:visibility parameter not implemented :"<<str<<endl; +        } + +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "transition-speed" ) ) +        { +            // this argument is not defined into kpresenter_doc and not into kprpage +            // TODO add it into each page. +            QString speed = styleStack.attributeNS( KoXmlNS::presentation, "transition-speed" ); +            if ( speed == "slow" ) +            { +                m_pageEffectSpeed = ES_SLOW; +            } +            else if ( speed == "medium" ) +            { +                m_pageEffectSpeed = ES_MEDIUM; +            } +            else if ( speed == "fast" ) +            { +                m_pageEffectSpeed = ES_FAST; +            } +            else +                kdDebug()<<" transition-speed not defined :"<<speed<<endl; +        } +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "duration" )) +        { +            m_pageTimer = loadOasisTimer( styleStack.attributeNS( KoXmlNS::presentation, "duration") ); +        } +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "transition-type" ) ) +        { +            //Not defined into kpresenter +            //it's global for the moment. +            kdDebug()<<" presentation:transition-type :"<<styleStack.attributeNS( KoXmlNS::presentation, "transition-type" )<<endl; +        } +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "display-header" ) ) +        { +            QString tmp = styleStack.attributeNS( KoXmlNS::presentation, "display-header" ); +            setHeader( tmp =="true" ? true : false ); +        } +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "display-footer" ) ) +        { +            QString tmp = styleStack.attributeNS( KoXmlNS::presentation, "display-footer" ); +            setFooter(tmp =="true" ? true : false); +        } +        //TODO presentation:display-date-time; presentation:display-page-number +        if ( styleStack.hasAttributeNS( KoXmlNS::presentation, "transition-style")) +        { +            //kdDebug()<<" have a presentation:transition-style------------\n"; +            const QString effect = styleStack.attributeNS( KoXmlNS::presentation, "transition-style"); +            QString additionalEffect; +            if ( styleStack.hasAttributeNS( KoXmlNS::koffice, "additional-transition-style" ) ) +            { +                additionalEffect = styleStack.attributeNS( KoXmlNS::koffice, "additional-transition-style" ); +            } +            kdDebug() << "Transition name: " << effect << "additional name: " << additionalEffect << endl; +            PageEffect pef; +            if ( effect=="none" ) +                pef=PEF_NONE; +            else if (effect=="vertical-stripes" || effect=="vertical-lines") // PEF_BLINDS_VER +                pef=PEF_BLINDS_VER; +            else if (effect=="horizontal-stripes" || effect=="horizontal-lines") // PEF_BLINDS_HOR +                pef=PEF_BLINDS_HOR; +            else if (effect=="spiralin-left" || effect=="spiralin-right" +                    || effect== "spiralout-left" || effect=="spiralout-right") // PEF_SURROUND1 +                pef=PEF_SURROUND1; +            else if (effect=="fade-from-top") // PEF_COVER_DOWN +                pef=PEF_COVER_DOWN; +            else if (effect=="fade-from-bottom") // PEF_COVER_UP +                pef=PEF_COVER_UP; +            else if (effect=="fade-from-left") // PEF_COVER_RIGHT +                pef=PEF_COVER_RIGHT; +            else if (effect=="fade-from-right") // PEF_COVER_LEFT +                pef=PEF_COVER_LEFT; +            else if (effect=="fade-from-lowerleft") +            {   // PEF_COVER_RIGHT_UP +                if ( additionalEffect.isEmpty() ) +                    pef=PEF_COVER_RIGHT_UP; +                else +                    pef=PEF_STRIPS_RIGHT_UP; +            } +            else if (effect=="fade-from-lowerright") +            {   // PEF_COVER_LEFT_UP +                if ( additionalEffect.isEmpty() ) +                    pef=PEF_COVER_LEFT_UP; +                else +                    pef=PEF_STRIPS_LEFT_UP; +            } +            else if (effect=="fade-from-upperleft") +            {   // PEF_COVER_RIGHT_DOWN +                if ( additionalEffect.isEmpty() ) +                    pef=PEF_COVER_RIGHT_DOWN; +                else +                    pef=PEF_STRIPS_RIGHT_DOWN; +            } +            else if (effect=="fade-from-upperright") +            {   // PEF_COVER_LEFT_DOWN +                if ( additionalEffect.isEmpty() ) +                    pef=PEF_COVER_LEFT_DOWN; +                else +                    pef=PEF_STRIPS_LEFT_DOWN; +            } +            else if (effect=="fade-to-center") // PEF_BOX_IN +                pef=PEF_BOX_IN; +            else if (effect=="fade-from-center") // PEF_BOX_OUT +                pef=PEF_BOX_OUT; +            else if (effect=="open-vertical") // PEF_OPEN_HORZ; really, no kidding ;) +                pef=PEF_OPEN_HORZ; +            else if (effect=="open-horizontal") // PEF_OPEN_VERT +                pef=PEF_OPEN_VERT; +            else if (effect=="open") // PEF_OPEN_ALL +                pef=PEF_OPEN_ALL; +            else if (effect=="close-vertical") // PEF_CLOSE_HORZ +                pef=PEF_CLOSE_HORZ; +            else if (effect=="close-horizontal") // PEF_CLOSE_VERT +                pef=PEF_CLOSE_VERT; +            else if (effect=="close") // PEF_CLOSE_ALL +                pef=PEF_CLOSE_ALL; +            else if (effect=="dissolve") // PEF_DISSOLVE; perfect hit ;) +                pef=PEF_DISSOLVE; +            else if (effect=="horizontal-checkerboard") // PEF_CHECKBOARD_ACROSS +                pef=PEF_CHECKBOARD_ACROSS; +            else if (effect=="vertical-checkerboard") // PEF_CHECKBOARD_DOWN +                pef=PEF_CHECKBOARD_DOWN; +            else if (effect=="uncover-to-right" || effect=="roll-from-left") // PEF_UNCOVER_RIGHT +                pef=PEF_UNCOVER_RIGHT; +            else if (effect=="uncover-to-left" || effect=="roll-from-right") // PEF_UNCOVER_LEFT +                pef=PEF_UNCOVER_LEFT; +            else if (effect=="uncover-to-top" || effect=="roll-from-bottom") // PEF_UNCOVER_UP +                pef=PEF_UNCOVER_UP; +            else if (effect=="uncover-to-bottom" || effect=="roll-from-top") // PEF_UNCOVER_DOWN +                pef=PEF_UNCOVER_DOWN; +            else if (effect=="uncover-to-upperleft") // PEF_UNCOVER_LEFT_UP +                pef=PEF_UNCOVER_LEFT_UP; +            else if (effect=="uncover-to-upperright") // PEF_UNCOVER_RIGHT_UP +                pef=PEF_UNCOVER_RIGHT_UP; +            else if (effect=="uncover-to-lowerleft") // PEF_UNCOVER_LEFT_DOWN +                pef=PEF_UNCOVER_LEFT_DOWN; +            else if (effect=="uncover-to-lowerright") // PEF_UNCOVER_RIGHT_DOWN +                pef=PEF_UNCOVER_RIGHT_DOWN; +            else if (effect=="interlocking-horizontal-left") +                pef=PEF_INTERLOCKING_HORZ_1; +            else if (effect=="interlocking-horizontal-right") +                pef=PEF_INTERLOCKING_HORZ_2; +            else if (effect=="interlocking-vertical-top") +                pef=PEF_INTERLOCKING_VERT_1; +            else if (effect=="interlocking-vertical-bottom") +                pef=PEF_INTERLOCKING_VERT_2; +            else if ( effect=="melt" ) +                pef=PEF_MELTING; +            else if ( effect=="fly-away" ) +                pef=PEF_FLY1; +            else if ( effect=="random" ) +                pef=PEF_RANDOM; +            else         // we choose a random transition instead of the unsupported ones ;) +                pef=PEF_RANDOM; +            setPageEffect( pef ); +        } +        if ( styleStack.hasChildNodeNS( KoXmlNS::presentation, "sound")) +        { +            //kdDebug()<<" presentation:sound !!!!!!!!!!!!!!!!!!!!!\n"; +            QDomElement sound = styleStack.childNodeNS( KoXmlNS::presentation, "sound"); +            m_soundEffect = true; +            m_soundFileName = sound.attributeNS( KoXmlNS::xlink, "href", QString::null ); +        } +    } +} + +QDomElement KPrPage::save( QDomDocument &doc ) +{ +    QDomElement page = m_kpbackground->save( doc ); +    QDomElement element; + +    if ( m_pageEffect != PEF_NONE) { +        element = doc.createElement("PGEFFECT"); +        element.setAttribute("value", static_cast<int>( m_pageEffect )); +        element.setAttribute("speed", static_cast<int>( m_pageEffectSpeed )); +        page.appendChild(element); +    } + +    if ( m_pageTimer != 1 ) { +        element = doc.createElement( "PGTIMER" ); +        element.setAttribute( "timer", m_pageTimer ); +        page.appendChild( element ); +    } + +    if ( m_soundEffect || !m_soundFileName.isEmpty() ) { +        element = doc.createElement( "PGSOUNDEFFECT" ); +        element.setAttribute( "soundEffect", static_cast<int>(m_soundEffect) ); +        element.setAttribute( "soundFileName", m_soundFileName ); +        page.appendChild( element ); +    } +    element = doc.createElement( "HEADERFOOTER" ); +    element.setAttribute( "header", static_cast<int>(m_bHasHeader ) ); +    element.setAttribute( "footer", static_cast<int>(m_bHasFooter ) ); +    page.appendChild( element ); +    return page; +} + +QString KPrPage::oasisNamePage( int posPage ) const +{ +    return  ( m_manualTitle.isEmpty() ?  QString( "page%1" ).arg( posPage ) : m_manualTitle ); +} + +bool KPrPage::saveOasisPage( KoStore *store, KoXmlWriter &xmlWriter, int posPage, KoSavingContext& context, +                             int & indexObj, int &partIndexObj, KoXmlWriter* manifestWriter, QMap<QString, int> &pageNames ) const +{ +    if ( isMasterPage() ) +    { +        KoGenStyle pageLayout = m_doc->pageLayout().saveOasis(); +        pageLayout.addAttribute( "style:page-usage", "all" ); // needed? +        QString pageLayoutName( context.mainStyles().lookup( pageLayout, "pm" ) ); + +        xmlWriter.startElement( "style:master-page" ); +        xmlWriter.addAttribute( "style:name", "Standard" ); +        xmlWriter.addAttribute( "style:page-layout-name", pageLayoutName ); + +        QString styleName = saveOasisPageStyle( store, context.mainStyles() ); +        if ( !styleName.isEmpty() ) +            xmlWriter.addAttribute( "draw:style-name", styleName ); + +        saveOasisObject( store, xmlWriter, context,  indexObj,partIndexObj, manifestWriter ); + +        xmlWriter.startElement( "style:header" ); +        m_doc->header()->textObject()->saveOasisContent( xmlWriter, context ); +        xmlWriter.endElement(); + +        xmlWriter.startElement( "style:footer" ); +        m_doc->footer()->textObject()->saveOasisContent( xmlWriter, context ); +        xmlWriter.endElement(); + +        xmlWriter.endElement(); +    } +    else +    { +        //store use to save picture and co +        xmlWriter.startElement( "draw:page" ); + +        QString drawName( m_manualTitle ); +        QRegExp rx( "^page[0-9]+$" ); +        if ( drawName.isEmpty() || pageNames.contains( drawName ) || rx.search( drawName ) != -1 ) +        { +            drawName = "page" + QString::number( posPage ); +        } +        pageNames.insert( drawName, posPage ); +        xmlWriter.addAttribute( "draw:name", drawName ); //we must store a name +        xmlWriter.addAttribute( "koffice:name", m_manualTitle ); // so that we can have the same name for different pages +        xmlWriter.addAttribute( "draw:id", "page" + QString::number( posPage ) ); +        xmlWriter.addAttribute( "draw:master-page-name", "Standard"); //by default name of page is Standard + +        QString styleName = saveOasisPageStyle( store, context.mainStyles() ); +        kdDebug()<<" styleName :"<<styleName<<endl; +        if ( !styleName.isEmpty() ) +            xmlWriter.addAttribute( "draw:style-name", styleName ); + +        saveOasisObject( store, xmlWriter, context,  indexObj,partIndexObj, manifestWriter  ); + +        saveOasisNote( xmlWriter ); +        xmlWriter.endElement(); +    } +    return true; +} + +QString KPrPage::saveOasisPageStyle( KoStore *, KoGenStyles& mainStyles ) const +{ +    KoGenStyle stylepageauto( isMasterPage() ? KPrDocument::STYLE_BACKGROUNDPAGE : KPrDocument::STYLE_BACKGROUNDPAGEAUTO, "drawing-page" ); + +    if ( ! isMasterPage() ) +    { +        stylepageauto.addProperty( "presentation:background-visible", ( m_displayBackground == true ) ? "true" : "false" ); +        stylepageauto.addProperty( "presentation:background-objects-visible", ( m_displayObjectFromMasterPage == true ) ? "true" : "false" ); +        QString transition = saveOasisPageEffect(); +        if ( !transition.isEmpty() ) +        { +            stylepageauto.addProperty( "presentation:transition-style", transition ); +            QString additionalTransition = saveOasisAdditionalPageEffect(); +            if ( !additionalTransition.isEmpty() ) +            { +                stylepageauto.addProperty( "koffice:additional-transition-style", additionalTransition ); +            } +        } +        stylepageauto.addProperty( "presentation:display-header", hasHeader()); +        stylepageauto.addProperty( "presentation:display-footer", hasFooter()); + +        if ( m_pageTimer != 1 ) +        { +            stylepageauto.addProperty("presentation:duration", saveOasisTimer( m_pageTimer )); +            //not used into kpresenter but necessary into ooimpress +            //keep compatible +            stylepageauto.addProperty( "presentation:transition-type", "automatic" ); +        } +        if ( m_pageEffectSpeed != ES_MEDIUM ) // we don't save the default value +        { +            if ( m_pageEffectSpeed == ES_FAST ) +                stylepageauto.addProperty( "presentation:transition-speed", "fast" ); +            else if ( m_pageEffectSpeed == ES_SLOW ) +                stylepageauto.addProperty( "presentation:transition-speed", "slow" ); +        } +        if ( !isSlideSelected() ) +            stylepageauto.addProperty( "presentation:visibility", "hidden" ); +        if ( !m_soundFileName.isEmpty() && m_soundEffect ) +        { +            QBuffer buffer; +            buffer.open( IO_WriteOnly ); +            KoXmlWriter elementWriter( &buffer );  // TODO pass indentation level +            elementWriter.startElement( "presentation:sound" ); +            elementWriter.addAttribute( "xlink:href", m_soundFileName ); +            elementWriter.addAttribute( "xlink:type", "simple" ); +            elementWriter.addAttribute( "xlink:show", "new" ); +            elementWriter.addAttribute( "xlink:actuate", "onRequest"); + +            elementWriter.endElement(); +            QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() ); +            stylepageauto.addChildElement( "sound effect", elementContents ); +        } +    } + +    if ( ! m_useMasterBackground ) +    { +        m_kpbackground->saveOasisBackgroundPageStyle( stylepageauto, mainStyles ); +    } + +    // todo return mainStyles.lookup( stylepageauto, "dp", isMasterPage() ? KoGenStyles::AutoStyleInStylesDotXml : KoGenStyles::NoFlag ); +    return mainStyles.lookup( stylepageauto, "dp" ); +} + +bool KPrPage::saveOasisNote( KoXmlWriter &xmlWriter ) const +{ +    if ( m_noteText.isEmpty() ) +        return true; + +    //todo : add size for draw:text-box otherwise we can't import into oo +    //<draw:text-box presentation:style-name="pr1" draw:text-style-name="P1" draw:layer="layout" svg:width="14.5cm" svg:height="11.408cm" svg:x="3.247cm" svg:y="14.126cm" presentation:class="notes"> +    xmlWriter.startElement( "presentation:notes" ); +    xmlWriter.startElement( "draw:frame" ); +    //todo save style + +    xmlWriter.startElement( "draw:text-box" ); +    QStringList text = QStringList::split( "\n", m_noteText ); +    for ( QStringList::Iterator it = text.begin(); it != text.end(); ++it ) { +        xmlWriter.startElement( "text:p" ); +        xmlWriter.addTextNode( *it ); +        xmlWriter.endElement(); +    } +    xmlWriter.endElement(); +    xmlWriter.endElement(); +    xmlWriter.endElement(); + +    return true; +} + +QString KPrPage::saveOasisPageEffect() const +{ +    QString transition; +    switch( m_pageEffect ) +    { +    case PEF_NONE: +        transition="none"; +        break; +    case PEF_CLOSE_HORZ: +        transition="close-vertical"; +        break; +    case PEF_CLOSE_VERT: +        transition="close-horizontal"; +        break; +    case PEF_CLOSE_ALL: +        transition="close"; +        break; +    case PEF_OPEN_HORZ: +        transition="open-vertical"; +        break; +    case PEF_OPEN_VERT: +        transition="open-horizontal"; +        break; +    case PEF_OPEN_ALL: +        transition="open"; +        break; +    case PEF_INTERLOCKING_HORZ_1: +        transition="interlocking-horizontal-left"; +        break; +    case PEF_INTERLOCKING_HORZ_2: +        transition="interlocking-horizontal-right"; +        break; +    case PEF_INTERLOCKING_VERT_1: +        transition="interlocking-vertical-top"; +        break; +    case PEF_INTERLOCKING_VERT_2: +        transition="interlocking-vertical-bottom"; +        break; +    case PEF_SURROUND1: +        transition="spiralin-left"; +        break; +    case PEF_FLY1: +        transition="fly-away"; +        break; +    case PEF_BLINDS_HOR: +        transition="horizontal-stripes"; +        break; +    case PEF_BLINDS_VER: +        transition="vertical-stripes"; +        break; +    case PEF_BOX_IN: +        transition="fade-to-center"; +        break; +    case PEF_BOX_OUT: +        transition="fade-from-center"; +        break; +    case PEF_CHECKBOARD_ACROSS: +        transition="horizontal-checkerboard"; +        break; +    case PEF_CHECKBOARD_DOWN: +        transition="vertical-checkerboard"; +        break; +    case PEF_COVER_DOWN: +        transition="fade-from-top"; +        break; +    case PEF_COVER_UP: +        transition="fade-from-bottom"; +        break; +    case PEF_COVER_LEFT: +        transition="fade-from-right"; +        break; +    case PEF_COVER_RIGHT: +        transition="fade-from-left"; +        break; +    case PEF_COVER_LEFT_UP: +        transition="fade-from-lowerright"; +        break; +    case PEF_COVER_LEFT_DOWN: +        transition="fade-from-upperright"; +        break; +    case PEF_COVER_RIGHT_UP: +        transition="fade-from-lowerleft"; +        break; +    case PEF_COVER_RIGHT_DOWN: +        transition="fade-from-upperleft"; +        break; +    case PEF_UNCOVER_LEFT: +        transition="uncover-to-left"; +        break; +    case PEF_UNCOVER_UP: +        transition="uncover-to-top"; +        break; +    case PEF_UNCOVER_RIGHT: +        transition="uncover-to-right"; +        break; +    case PEF_UNCOVER_DOWN: +        transition="uncover-to-bottom"; +        break; +    case PEF_UNCOVER_LEFT_UP: +        transition="uncover-to-upperleft"; +        break; +    case PEF_UNCOVER_LEFT_DOWN: +        transition="uncover-to-lowerleft"; +        break; +    case PEF_UNCOVER_RIGHT_UP: +        transition="uncover-to-upperright"; +        break; +    case PEF_UNCOVER_RIGHT_DOWN: +        transition="uncover-to-lowerright"; +        break; +    case PEF_DISSOLVE: +        transition="dissolve"; +        break; +    case PEF_STRIPS_LEFT_UP: +        transition="fade-from-lowerright"; +        break; +    case PEF_STRIPS_LEFT_DOWN: +        transition="fade-from-upperright"; +        break; +    case PEF_STRIPS_RIGHT_UP: +        transition="fade-from-lowerleft"; +        break; +    case PEF_STRIPS_RIGHT_DOWN: +        transition="fade-from-upperleft"; +        break; +    case PEF_MELTING: +        transition="melt"; +        break; +    case PEF_LAST_MARKER://don't use it !!! +        break; +    case PEF_RANDOM: +        transition="random"; +        break; + +    } +    return transition; +} + + +QString KPrPage::saveOasisAdditionalPageEffect() const +{ +    QString additionalEffect; +    switch( m_pageEffect ) +    { +        case PEF_STRIPS_LEFT_UP: +            additionalEffect="stripe-from-lowerright"; +            break; +        case PEF_STRIPS_LEFT_DOWN: +            additionalEffect="stripe-from-upperright"; +            break; +        case PEF_STRIPS_RIGHT_UP: +            additionalEffect="stripe-from-lowerleft"; +            break; +        case PEF_STRIPS_RIGHT_DOWN: +            additionalEffect="stripe-from-upperleft"; +            break; +        default: +            break; +    } +    return additionalEffect; +} + + +KPrObject *KPrPage::getObject(int num) +{ +    Q_ASSERT( num < (int)m_objectList.count() ); +    return m_objectList.at(num); +} + +/* + * Check if object name already exists. + */ +bool KPrPage::objectNameExists( KPrObject *object, QPtrList<KPrObject> &list ) { +    QPtrListIterator<KPrObject> it( list ); + +    for ( it.toFirst(); it.current(); ++it ) { +        // object name can exist in current object. +        if ( it.current()->getObjectName() == object->getObjectName() && +             it.current() != object ) { +            return true; +        } +        else if ( it.current()->getType() == OT_GROUP ) { +            QPtrList<KPrObject> objectList( static_cast<KPrGroupObject*>(it.current())->getObjects() ); +            if ( objectNameExists( object, objectList ) ) { +                return true; +            } +        } +    } +    return false; +} + +void KPrPage::unifyObjectName( KPrObject *object ) { +    if ( object->getObjectName().isEmpty() ) { +        object->setObjectName( object->getTypeString() ); +    } +    QString objectName( object->getObjectName() ); + +    QPtrList<KPrObject> list( m_objectList ); + +    int count = 1; + +    while ( objectNameExists( object, list ) ) { +        count++; +        QRegExp rx( " \\(\\d{1,}\\)$" ); +        if ( rx.search( objectName ) != -1 ) { +            objectName.remove( rx ); +        } +        objectName += QString(" (%1)").arg( count ); +        object->setObjectName( objectName ); +    } +} + +void KPrPage::appendObject(KPrObject *_obj) +{ +    unifyObjectName(_obj); +    m_objectList.append(_obj); +} + +void KPrPage::appendObjects( const QValueList<KPrObject *> &objects ) +{ +    QMap <QString, int> usedPageNames; +    QPtrListIterator<KPrObject> it( m_objectList ); +    // find the biggest number +    for ( ; it.current() ; ++it ) +    { +        QString objectName( it.current()->getObjectName() ); + +        QRegExp rx( "(.*) \\((\\d{1,})\\)$" ); +        rx.setMinimal( true ); +        if ( rx.search( objectName ) != -1 && rx.numCaptures() == 2 ) +        { +            int id = rx.cap( 2 ).toInt(); +            if ( usedPageNames[rx.cap( 1 )] < id ) +            { +                usedPageNames[rx.cap( 1 )] = id; +            } +        } +        else +        { +            usedPageNames[objectName] = 1; +        } +    } + +    QValueListConstIterator<KPrObject *> oIt( objects.begin() ); +    for ( ; oIt != objects.end(); ++oIt ) +    { +        QString objectName( ( *oIt )->getObjectName() ); +        QRegExp rx( " \\(\\d{1,}\\)$" ); +        if ( rx.search( objectName ) != -1 ) +        { +            objectName.remove( rx ); +        } + +        if ( usedPageNames.contains( objectName ) ) +        { +            usedPageNames[objectName]++; +            objectName += QString(" (%1)").arg( usedPageNames[objectName] ); +            ( *oIt )->setObjectName( objectName ); +        } +        m_objectList.append( *oIt ); +    } +} + +int KPrPage::takeObject( KPrObject *object ) +{ +    int pos = m_objectList.findRef( object ); +    m_objectList.take( pos ); +    return pos; +} + +void KPrPage::replaceObject( KPrObject *oldObject, KPrObject *newObject ) +{ +    //XXX check if object name gets set +    unsigned int pos = m_objectList.findRef( oldObject ); +    m_objectList.take( pos ); +    m_objectList.insert( pos, newObject ); +} + + +void KPrPage::insertObject( KPrObject *object, int pos ) +{ +    unifyObjectName( object ); +    m_objectList.insert( pos, object ); +} + +KCommand * KPrPage::deleteSelectedObjects() +{ +    QPtrList<KPrObject> objects = getSelectedObjects( true ); + +    KPrDeleteCmd *deleteCmd=0L; + +    if ( objects.count() > 0 ) { +        deleteCmd = new KPrDeleteCmd( i18n( "Delete Objects" ), objects, m_doc, this ); +        deleteCmd->execute(); +    } +    else +        m_doc->setModified(true); + +    return deleteCmd ; +} + +void KPrPage::copyObjs(QDomDocument &doc, QDomElement &presenter, QValueList<KoPictureKey> & savePictures) const +{ +    if ( !numSelected() ) +        return; + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->isSelected()) +        { +            if ( it.current()->getType() == OT_PICTURE ) +            { +                KoPictureKey key = static_cast<KPrPixmapObject *>( it.current() )->getKey(); +                if ( !savePictures.contains( key ) ) +                    savePictures.append( key ); +            } +            QDomElement object=doc.createElement("OBJECT"); +            object.setAttribute("type", static_cast<int>( it.current()->getType() )); +            object.appendChild(it.current()->save( doc,0 )); +            presenter.appendChild(object); +        } +    } +} + +void KPrPage::pasteObjs( const QByteArray & data,int nbCopy, double angle, +                         double increaseX, double increaseY, double moveX, double moveY ) +{ +    m_doc->deSelectAllObj(); +    int num = m_objectList.count(); +    if ( !data.size() ) +        return; +    QBuffer buffer( data ); +    KoStore* store = KoStore::createStore( &buffer, KoStore::Read ); +    int nbNewObject = -1 ; +    KMacroCommand *macro = 0L; +    if ( !store->bad() ) +    { +        if ( store->open( "root" ) ) +        { +            QString errorMsg; +            int errorLine; +            int errorColumn; +            QDomDocument domDoc; +            if ( !domDoc.setContent( store->device(), &errorMsg, &errorLine, &errorColumn ) ) +            { +                kdError (30003) << "Parsing Error! Aborting! (in KPrPage::PasteObj)" << endl +                                << "  Line: " << errorLine << " Column: " << errorColumn << endl +                                << "  Message: " << errorMsg << endl; +                delete store; +                return; +            } +            QDomElement topElem = domDoc.documentElement(); + +            for ( int i = 0 ; i < nbCopy ; i++ ) +            { +                KCommand *cmd = m_doc->loadPastedObjs( domDoc.toString(),this ); +                if (cmd ) +                { +                    if ( !macro ) +                        macro = new KMacroCommand( i18n("Paste Objects" )); +                    macro->addCommand( cmd ); +                } +                if ( nbNewObject == -1 ) +                    nbNewObject = m_objectList.count() - num; +            } + +            m_doc->loadPictureMap( topElem ); +            store->close(); +            int nbNewPartObject = -1; +            int nbElementBefore = m_objectList.count(); +            for ( int i = 0 ; i < nbCopy ; i++ ) +            { +                m_doc->insertEmbedded( store, topElem, macro, this, num ); +                if ( nbNewPartObject ==-1 ) +                    nbNewObject = nbNewObject + (m_objectList.count() - nbElementBefore); +            } +        } +    } +    delete store; + +    //move and select all new pasted in objects +    KPrObject *_tempObj; +    int i = 0; +    int mod = 1; +    for (_tempObj = m_objectList.at(num); _tempObj; _tempObj = m_objectList.next(),  i++ ) { +        if ( i >= nbNewObject ) +            mod++; +        _tempObj->moveBy( moveX*(double)mod,moveY*(double)mod); +        _tempObj->setSelected( true ); +        if ( angle == 0.0 || (increaseY == 0.0 && increaseX == 0.0)) +            m_doc->repaint(_tempObj); +    } + +    if ( angle != 0.0) +    { +        KCommand *cmd = rotateSelectedObjects(angle, true); +        if (cmd ) +        { +            if ( !macro ) +                macro = new KMacroCommand( i18n("Paste Objects" )); +            macro->addCommand( cmd ); +        } +    } +    if ( increaseX != 0.0 || increaseY != 0.0 ) +    { +        QPtrListIterator<KPrObject> it( m_objectList ); +        for ( ; it.current() ; ++it ) +        { +            if(it.current()->isSelected()) +            { +                KCommand *cmd =new KPrResizeCmd( i18n("Resize"), KoPoint(0, 0), +                                              KoSize(increaseX, increaseY), it.current(), m_doc ); +                if ( cmd ) +                { +                    cmd->execute(); +                    if ( !macro ) +                        macro = new KMacroCommand( i18n("Paste Objects" )); +                    macro->addCommand( cmd ); +                } +            } +        } +    } + +    if (macro) +        m_doc->addCommand(macro); +    //update sidebar +    if ( angle == 0.0 || (increaseY == 0.0 && increaseX == 0.0) ) +    { +        m_doc->updateSideBarItem( this ); +    } + +    m_doc->setModified(true); +} + +KPrTextObject * KPrPage::textFrameSet ( unsigned int _num ) const +{ +    unsigned int i = 0; +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->getType()==OT_TEXT) +        { +            if(i==_num) +                return static_cast<KPrTextObject*>(it.current()); +            i++; +        } +    } +    return 0L; +} + +int KPrPage::numSelected() const +{ +    int num = 0; + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->isSelected()) +            num++; +    } + +    return num; +} + +int KPrPage::numTextObject() const +{ +    int num = 0; + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->getType()==OT_TEXT) +            num++; +    } + +    return num; +} + +KPrObject* KPrPage::getSelectedObj() const +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->isSelected()) +            return it.current(); +    } +    return 0L; +} + + +QPtrList<KPrObject> KPrPage::getSelectedObjects( bool withoutHeaderFooter ) const +{ +    QPtrList<KPrObject> objects; +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if( it.current()->isSelected() +            && ( !withoutHeaderFooter +                 || it.current() != m_doc->header() && it.current()!= m_doc->footer() ) ) +        { +            objects.append( it.current() ); +        } +    } +    return objects; +} + + +void KPrPage::groupObjects() +{ +    QPtrList<KPrObject> objects( getSelectedObjects( true ) ); + +    if ( objects.count() > 1 ) { +        KPrGroupObjCmd *groupObjCmd = new KPrGroupObjCmd( i18n( "Group Objects" ), objects, m_doc,this ); +        m_doc->addCommand( groupObjCmd ); +        groupObjCmd->execute(); +    } +} + +void KPrPage::ungroupObjects( KMacroCommand ** macro ) +{ +    QPtrList<KPrObject> objects( getSelectedObjects( true ) ); +    QPtrListIterator<KPrObject> it( objects ); +    for ( ; it.current() ; ++it ) +    { +        KPrObject *object = it.current(); +        if ( object->getType() == OT_GROUP ) +        { +            UnGroupObjCmd *cmd = new UnGroupObjCmd( i18n( "Ungroup Objects" ), +                (KPrGroupObject*)object, m_doc, this ); +            cmd->execute(); + +            if ( !*macro ) +                *macro = new KMacroCommand(i18n( "Ungroup Objects" )); +            (*macro)->addCommand( cmd ); +        } +    } +} + +void KPrPage::lowerObjs(bool backward) +{ +    KPrObject *kpobject = 0; + +    QPtrList<KPrObject> _new; + +    for ( unsigned int j = 0; j < m_objectList.count(); j++ ) +        _new.append( m_objectList.at( j ) ); + +    _new.setAutoDelete( false ); +    bool createCmd = false; +    int insertPos = 0; +    for ( int i = 0; i < static_cast<int>( _new.count() ); i++ ) { +        kpobject = _new.at( i ); +        if ( kpobject->isSelected() ) { +            if ( i == insertPos ) +            { +                ++insertPos; +                continue; +            } +            createCmd = true; +            _new.take( i ); +            if ( backward ) +                _new.insert(QMAX(i-1,0) ,  kpobject); +            else +                _new.insert( insertPos++, kpobject ); +        } +    } +    if ( createCmd ) +    { +        KPrLowerRaiseCmd *lrCmd = new KPrLowerRaiseCmd( i18n( "Lower Objects" ), m_objectList, _new, m_doc,this ); +        lrCmd->execute(); +        m_doc->addCommand( lrCmd ); +    } + +} + +void KPrPage::raiseObjs(bool forward) +{ +    KPrObject *kpobject = 0; + +    QPtrList<KPrObject> _new; + +    for ( unsigned int j = 0; j < m_objectList.count(); j++ ) +        _new.append( m_objectList.at( j ) ); + +    _new.setAutoDelete( false ); +    bool createCmd = false; +    int size = int( _new.count() ); +    int insertPos = size - 1; +    for ( int i = size - 1; i >= 0; i-- ) +    { +        kpobject = _new.at( i ); +        if ( kpobject->isSelected() ) +        { +            if ( i == insertPos ) +            { +                --insertPos; +                continue; +            } +            createCmd = true; +            _new.take( i ); +            if ( forward ) +                _new.insert( QMIN( i+1, size - 1),  kpobject); +            else +                _new.insert( insertPos--, kpobject ); +        } +    } +    if ( createCmd ) +    { +        KPrLowerRaiseCmd *lrCmd = new KPrLowerRaiseCmd( i18n( "Raise Objects" ), m_objectList, _new, m_doc,this ); +        lrCmd->execute(); +        m_doc->addCommand( lrCmd ); +    } +} + +KCommand *KPrPage::insertObject( const QString &name, KPrObject * object, const KoRect &r, bool addCommand ) +{ +    object->setOrig( r.x(), r.y() ); +    object->setSize( r.width(), r.height() ); +    object->setSelected( true ); + +    KPrInsertCmd *insertCmd = new KPrInsertCmd( name, object, m_doc, this ); +    insertCmd->execute(); +    if ( addCommand ) +    { +        m_doc->addCommand( insertCmd ); +        return 0L; +    } +    return insertCmd; +} + +void KPrPage::insertLine( const KoRect &r, const KoPen & pen, LineEnd lb, LineEnd le, LineType lt ) +{ +    KPrLineObject *kplineobject = new KPrLineObject( pen, lb, le, lt ); +    insertObject( i18n( "Insert Line" ), kplineobject, r ); +} + +void KPrPage::insertRectangle( const KoRect &r, const KoPen & pen, const QBrush &brush, FillType ft, +                               const QColor &g1, const QColor &g2, +                               BCType gt, int rndX, int rndY, bool unbalanced, int xfactor, int yfactor ) +{ +    KPrRectObject *kprectobject = new KPrRectObject( pen, brush, ft, g1, g2, gt, rndX, rndY, +                                                   unbalanced, xfactor, yfactor ); +    insertObject( i18n( "Insert Rectangle" ), kprectobject, r ); +} + +void KPrPage::insertCircleOrEllipse( const KoRect &r, const KoPen &pen, const QBrush & brush, FillType ft, +                                     const QColor &g1, const QColor &g2, +                                     BCType gt, bool unbalanced, int xfactor, int yfactor ) +{ +    KPrEllipseObject *kpellipseobject = new KPrEllipseObject( pen, brush, ft, g1, g2, gt, +                                                            unbalanced, xfactor, yfactor ); +    insertObject( i18n( "Insert Ellipse" ), kpellipseobject, r ); +} + +void KPrPage::insertPie( const KoRect &r, const KoPen &pen, const QBrush &brush, FillType ft, +                         const QColor &g1, const QColor &g2, +                         BCType gt, PieType pt, int _angle, int _len, LineEnd lb, LineEnd le, +                         bool unbalanced, int xfactor, int yfactor ) +{ +    KPrPieObject *kppieobject = new KPrPieObject( pen, brush, ft, g1, g2, gt, pt, _angle, +                                                _len, lb, le, unbalanced, xfactor, yfactor ); +    insertObject( i18n( "Insert Pie/Arc/Chord" ), kppieobject, r ); +} + +KPrTextObject* KPrPage::insertTextObject( const KoRect& r, const QString&  text , KPrView * _view ) +{ +    KPrTextObject *kptextobject = new KPrTextObject( m_doc ); +    insertObject( i18n( "Insert Textbox" ), kptextobject, r ); +    //TODO create macro command : now insertObject can return KCommand +    //TODO fix repaint object +    if (  !text.isEmpty() ) +    { +        KPrTextView *view =  kptextobject->createKPTextView( _view ? _view->getCanvas() : 0L ); +        view->insertText( text ); +        view->terminate(); +        delete view; +        m_doc->repaint( kptextobject ); +    } +    return kptextobject; +} + +void KPrPage::insertAutoform( const KoRect &r, const KoPen &pen, const QBrush &brush, LineEnd lb, LineEnd le, FillType ft, +                              const QColor &g1, const QColor &g2, BCType gt, const QString &fileName, bool unbalanced, +                              int xfactor, int yfactor ){ +    KPrAutoformObject *kpautoformobject = new KPrAutoformObject( pen, brush, fileName, lb, le, ft, +                                                               g1, g2, gt, unbalanced, xfactor, yfactor ); +    insertObject( i18n( "Insert Autoform" ), kpautoformobject, r ); +} + +void KPrPage::insertFreehand( const KoPointArray &points, const KoRect &r, const KoPen &pen, +                              LineEnd lb, LineEnd le ) +{ +    KoSize size( r.width(), r.height() ); +    KPrFreehandObject *kpfreehandobject = new KPrFreehandObject( points, size, pen, lb, le ); +    insertObject( i18n( "Insert Freehand" ), kpfreehandobject, r ); +} + +void KPrPage::insertPolyline( const KoPointArray &points, const KoRect &r, const KoPen &pen, +                              LineEnd lb, LineEnd le ) +{ +    KoSize size( r.width(), r.height() ); +    KPrPolylineObject *kppolylineobject = new KPrPolylineObject( points, size, pen, lb, le ); +    insertObject( i18n( "Insert Polyline" ), kppolylineobject, r ); +} + +void KPrPage::insertQuadricBezierCurve( const KoPointArray &points, const KoPointArray &allPoints, +                                        const KoRect &r, const KoPen &pen, +                                        LineEnd lb, LineEnd le ) +{ +    KoSize size( r.width(), r.height() ); + +    KPrQuadricBezierCurveObject *kpQuadricBezierCurveObject = new KPrQuadricBezierCurveObject( +        points, allPoints, size, pen, lb, le ); +    insertObject( i18n( "Insert Quadric Bezier Curve" ), kpQuadricBezierCurveObject, r ); +} + +void KPrPage::insertCubicBezierCurve( const KoPointArray &points, const KoPointArray &allPoints, +                                      const KoRect &r, const KoPen &pen, +                                      LineEnd lb, LineEnd le ) +{ +    KoSize size( r.width(), r.height() ); + +    KPrCubicBezierCurveObject *kpCubicBezierCurveObject = new KPrCubicBezierCurveObject( points, allPoints, size, pen, lb, le ); +    insertObject( i18n( "Insert Cubic Bezier Curve" ), kpCubicBezierCurveObject, r ); +} + +void KPrPage::insertPolygon( const KoPointArray &points, const KoRect &r, const KoPen &pen, const QBrush &brush, FillType ft, +                             const QColor &g1, const QColor &g2, BCType gt, bool unbalanced, int xfactor, int yfactor, +                             bool _checkConcavePolygon, int _cornersValue, int _sharpnessValue ) +{ +    KoSize size( r.width(), r.height() ); + +    KPrPolygonObject *kpPolygonObject = new KPrPolygonObject( points, size, pen, brush, ft, +                                                            g1, g2, gt, unbalanced, xfactor, yfactor, +                                                            _checkConcavePolygon, _cornersValue, _sharpnessValue ); +    insertObject( i18n( "Insert Polygon" ), kpPolygonObject, r ); +} + +void KPrPage::insertClosedLine( const KoPointArray &points, const KoRect &r, const KoPen &pen, const QBrush &brush, +                                FillType ft,const QColor &g1, const QColor &g2, +                                BCType gt, bool unbalanced, int xfactor, int yfactor, ToolEditMode _mode ) +{ +    QString _type; +    QString _name; +    if ( _mode == INS_CLOSED_FREEHAND ) { +        _type = i18n( "Closed Freehand" ); +        _name = i18n( "Insert Closed Freehand" ); +    } +    else if ( _mode == INS_CLOSED_POLYLINE ) { +        _type = i18n( "Closed Polyline" ); +        _name = i18n( "Insert Closed Polyline" ); +    } +    else if ( _mode == INS_CLOSED_QUADRICBEZIERCURVE ) { +        _type = i18n( "Closed Quadric Bezier Curve" ); +        _name = i18n( "Insert Closed Quadric Bezier Curve" ); +    } +    else if ( _mode == INS_CLOSED_CUBICBEZIERCURVE ) { +        _type = i18n( "Closed Cubic Bezier Curve" ); +        _name = i18n( "Insert Closed Cubic Bezier Curve" ); +    } + +    KoSize size( r.width(), r.height() ); + +    KPrClosedLineObject *kpClosedLineObject = new KPrClosedLineObject( points, size, pen, brush, ft, +                                                                     g1, g2, gt, unbalanced, xfactor, yfactor, _type ); +    insertObject( _name, kpClosedLineObject, r ); +} + +KPrPartObject* KPrPage::insertObject( const KoRect& _rect, KoDocumentEntry& _e ) +{ +    KoDocument* doc = _e.createDoc( m_doc ); +    if ( !doc ) +        return NULL; + +    if ( !doc->showEmbedInitDialog( 0 ) ) //TODO should really have parent +        return NULL; + +    QRect r = QRect( (int)_rect.left(), (int)_rect.top(), +                     (int)_rect.width(), (int)_rect.height() ); +    KPrChild* ch = new KPrChild( m_doc, doc, r ); +    m_doc->insertObject( ch ); + +    KPrPartObject *kppartobject = new KPrPartObject( ch ); +    insertObject( i18n( "Embed Object" ), kppartobject, _rect ); + +    //emit sig_insertObject( ch, kppartobject ); +    m_doc->repaint( false ); + +    return kppartobject; +} + +KCommand* KPrPage::setPen( const KoPen &pen, LineEnd lb, LineEnd le, int flags ) +{ +    KoPenCmd * cmd = NULL; + +    KoPenCmd::Pen _newPen( pen, lb, le); + +    QPtrList<KPrObject> _objects; +    _objects.setAutoDelete( false ); + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if( it.current()->isSelected() ) +        { +            _objects.append( it.current() ); +        } +    } + +    if ( !_objects.isEmpty() && flags ) { +        cmd = new KoPenCmd( i18n( "Apply Styles" ), _objects, _newPen, m_doc, this, flags ); +        cmd->execute(); +    } + +    return cmd; +} + +KCommand * KPrPage::setBrush( const QBrush &brush, FillType ft, const QColor &g1, const QColor &g2, +                              BCType gt, bool unbalanced, int xfactor, int yfactor, int flags ) +{ +    KPrBrushCmd * cmd = NULL; + +    KPrBrushCmd::Brush _newBrush; + +    _newBrush.brush = QBrush( brush ); +    _newBrush.fillType = ft; +    _newBrush.gColor1 = g1; +    _newBrush.gColor2 = g2; +    _newBrush.gType = gt; +    _newBrush.unbalanced = unbalanced; +    _newBrush.xfactor = xfactor; +    _newBrush.yfactor = yfactor; + +    QPtrList<KPrObject> _objects; +    _objects.setAutoDelete( false ); + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if( it.current()->isSelected() ) +        { +            _objects.append( it.current() ); +        } +    } + +    if ( !_objects.isEmpty() && flags ) { +        cmd = new KPrBrushCmd( i18n( "Apply Styles" ), _objects, _newBrush, m_doc, this, flags ); +        cmd->execute(); +    } + +    return cmd; +} + +void KPrPage::slotRepaintVariable() +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()->getType() == OT_TEXT ) +            m_doc->repaint( it.current() ); +    } +} + +void KPrPage::recalcPageNum() +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()->getType() == OT_TEXT ) { +            ( (KPrTextObject*)it.current() )->recalcPageNum( this ); +            m_doc->repaint( it.current() ); // TODO only if something changed +        } +    } +} + +void KPrPage::changePicture( const KURL & url, QWidget *parent ) +{ +    // filename has been chosen in KPrView with a filedialog, +    // so we know it exists +    KoPicture image = m_doc->pictureCollection()->downloadPicture( url, parent ); + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->isSelected() && it.current()->getType()==OT_PICTURE) +        { +            KPrPixmapObject* obj=dynamic_cast<KPrPixmapObject*>( it.current() ); +            if( obj) +            { +                KPrPixmapObject *pix = new KPrPixmapObject( m_doc->pictureCollection(), image.getKey() ); +                KPrChgPixCmd *chgPixCmd = new KPrChgPixCmd( i18n( "Change Pixmap" ),obj,pix, m_doc,this ); +                chgPixCmd->execute(); +                m_doc->addCommand( chgPixCmd ); +            } +            break; +        } +    } +} + +void KPrPage::insertPicture( const QString &filename, const KoPoint &pos ) +{ +    KoPictureKey key = m_doc->pictureCollection()->loadPicture( filename ).getKey(); +    KPrPixmapObject *kppixmapobject = new KPrPixmapObject(m_doc->pictureCollection() , key ); + +    kppixmapobject->setOrig( pos ); +    kppixmapobject->setSelected( true ); + +    kppixmapobject->setSize( m_doc->zoomHandler()->pixelXToPt( kppixmapobject->originalSize().width() ), +                             m_doc->zoomHandler()->pixelYToPt( kppixmapobject->originalSize().height() ) ); +    kppixmapobject->setKeepRatio( true ); // pics have keep-aspect-ratio on by default. + +    KPrInsertCmd *insertCmd = new KPrInsertCmd( i18n( "Insert Picture" ), kppixmapobject, m_doc, this ); +    insertCmd->execute(); +    m_doc->addCommand( insertCmd ); + +    KoRect s = getPageRect(); +    float fakt = 1; +    if ( kppixmapobject->getSize().width() > s.width() ) +        fakt = (float)s.width() / (float)kppixmapobject->getSize().width(); +    if ( kppixmapobject->getSize().height() > s.height() ) +        fakt = QMIN( fakt, (float)s.height() / (float)kppixmapobject->getSize().height() ); + +    //kdDebug(33001) << k_funcinfo << "Fakt: " << fakt << endl; + +    if ( fakt < 1 ) { +        int w = (int)( fakt * (float)kppixmapobject->getSize().width() ); +        int h = (int)( fakt * (float)kppixmapobject->getSize().height() ); +        //kdDebug(33001) << k_funcinfo << "Size: " << w << ", " << h << endl; +        kppixmapobject->setOrig(0,0); +        kppixmapobject->setSize(w, h); +        m_doc->repaint( false ); +    } +} + +void KPrPage::insertPicture( const QString &_file, const KoRect &_rect ) +{ +    KoPictureKey key = m_doc->pictureCollection()->loadPicture( _file ).getKey(); +    KPrPixmapObject *kppixmapobject = new KPrPixmapObject( m_doc->pictureCollection(), key ); +    kppixmapobject->setKeepRatio( true ); // pics have keep-aspect-ratio on by default. +    insertObject( i18n( "Insert Picture" ), kppixmapobject, _rect ); +} + +void KPrPage::enableEmbeddedParts( bool f ) +{ +    KPrPartObject *obj=0L; +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->getType()==OT_PART) +        { +            obj=dynamic_cast<KPrPartObject*>( it.current() ); +            if(obj) +                obj->enableDrawing( f ); +        } +    } +} + + +void KPrPage::setBackColor(const  QColor &backColor1, const QColor &backColor2, BCType bcType, +                           bool unbalanced, int xfactor, int yfactor ) +{ +    m_kpbackground->setBackColor1( backColor1 ); +    m_kpbackground->setBackColor2( backColor2 ); +    m_kpbackground->setBackColorType( bcType ); +    m_kpbackground->setBackUnbalanced( unbalanced ); +    m_kpbackground->setBackXFactor( xfactor ); +    m_kpbackground->setBackYFactor( yfactor ); +} + +void KPrPage::setBackPicture( const KoPictureKey & key ) +{ +    m_kpbackground->setBackPicture( key ); +} + +bool KPrPage::getBackUnbalanced() const +{ +    return m_kpbackground->getBackUnbalanced(); +} + +void KPrPage::setBackView( BackView backView ) +{ +    m_kpbackground->setBackView( backView ); +} + +void KPrPage::setBackType( BackType backType ) +{ +    m_kpbackground->setBackType( backType ); +} + +void KPrPage::setPageEffectSpeed( EffectSpeed pageEffectSpeed ) +{ +    m_pageEffectSpeed = pageEffectSpeed; +} + +void KPrPage::setPageEffect( PageEffect pageEffect ) +{ +    m_pageEffect = pageEffect; +} + +void KPrPage::setPageTimer( int pageTimer ) +{ +    m_pageTimer = pageTimer; +} + +void KPrPage::setPageSoundEffect( bool soundEffect ) +{ +    m_soundEffect = soundEffect; +} + +void KPrPage::setPageSoundFileName( const QString &fileName ) +{ +    m_soundFileName = fileName; +} + +BackType KPrPage::getBackType() const +{ +    return m_kpbackground->getBackType(); +} + +BackView KPrPage::getBackView() const +{ +    return m_kpbackground->getBackView(); +} + +KoPictureKey KPrPage::getBackPictureKey() const +{ +    return m_kpbackground->getBackPictureKey(); +} + +KoPicture KPrPage::getBackPicture() const +{ +    return m_kpbackground->getBackPicture(); +} + +QColor KPrPage::getBackColor1() const +{ +    return m_kpbackground->getBackColor1(); +} + +QColor KPrPage::getBackColor2() const +{ +    return m_kpbackground->getBackColor2(); +} + +int KPrPage::getBackXFactor() const +{ +    return m_kpbackground->getBackXFactor(); +} + +int KPrPage::getBackYFactor() const +{ +    return m_kpbackground->getBackYFactor(); +} + +BCType KPrPage::getBackColorType() const +{ +    return m_kpbackground->getBackColorType(); +} + +EffectSpeed KPrPage::getPageEffectSpeed() const +{ +    return m_pageEffectSpeed; +} + +PageEffect KPrPage::getPageEffect() const +{ +    return m_pageEffect; +} + +int KPrPage::getPageTimer() const +{ +    return m_pageTimer; +} + +bool KPrPage::getPageSoundEffect() const +{ +    return m_soundEffect; +} + +QString KPrPage::getPageSoundFileName() const +{ +    return m_soundFileName; +} + +KoRect KPrPage::getPageRect() const +{ +    const KoPageLayout& p = m_doc->pageLayout(); +    return KoRect( p.ptLeft, p.ptTop, p.ptWidth - p.ptRight - p.ptLeft, p.ptHeight - p.ptTop - p.ptBottom ); +} + +QRect KPrPage::getZoomPageRect() const +{ +    return m_doc->zoomHandler()->zoomRect(getPageRect()); +} + +void KPrPage::completeLoading( bool _clean, int lastObj ) +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        // Pictures and cliparts have been loaded from the store, we can now +        // get the picture from the collection, and set it in the image/clipart object +        if ( ( it.current()->getType() == OT_PICTURE ) +             || ( it.current()->getType() == OT_CLIPART ) ) { +            if ( _clean || m_objectList.findRef( it.current() ) > lastObj ) +            { +                KPrPixmapObject* obj=dynamic_cast<KPrPixmapObject*>( it.current()); +                if(obj) +                    obj->reload(); +            } +        } +        else if ( it.current()->getType() == OT_TEXT ) +        { +            KPrTextObject*obj=dynamic_cast<KPrTextObject*>( it.current() ); +            if(obj) +                obj->recalcPageNum( this ); +        } +        else if ( it.current()->getType() == OT_GROUP ) +            completeLoadingForGroupObject( it.current() ); +    } +    m_kpbackground->reload(); +} + +void KPrPage::completeLoadingForGroupObject( KPrObject *_obj ) +{ +    KPrGroupObject *_groupObj = static_cast<KPrGroupObject*>( _obj ); + +    if ( _groupObj ) { +        QPtrListIterator<KPrObject> it( _groupObj->objectList() ); +        for ( ; it.current(); ++it ) { +            if ( ( it.current()->getType() == OT_PICTURE ) +                 || ( it.current()->getType() == OT_CLIPART ) ) { +                KPrPixmapObject *_pixObj = dynamic_cast<KPrPixmapObject*>( it.current() ); +                if ( _pixObj ) +                    _pixObj->reload(); +            } +            else if ( it.current()->getType() == OT_TEXT ) { +                KPrTextObject *_textObj=  dynamic_cast<KPrTextObject*>( it.current() ); +                if ( _textObj ) +                    _textObj->recalcPageNum(  this ); +            } +            else if ( it.current()->getType() == OT_GROUP ) +                completeLoadingForGroupObject( it.current() ); // recursion +        } +    } +} + +KCommand * KPrPage::replaceObjs( bool createUndoRedo, double _orastX,double _orastY,const QColor & _txtBackCol, +                                 const QColor & _otxtBackCol ) +{ +    KPrObject *kpobject = 0; +    double ox=0, oy=0; +    QPtrList<KPrObject> _objects; +    QValueList<KoPoint> _diffs; +    _objects.setAutoDelete( false ); + +    for ( int i = 0; i < static_cast<int>( m_objectList.count() ); i++ ) { +        kpobject = m_objectList.at( i ); +        ox = kpobject->getOrig().x(); +        oy = kpobject->getOrig().y(); +        ox = static_cast<int>(ox / m_doc->getGridX() * m_doc->getGridX()); +        oy = static_cast<int>(oy / m_doc->getGridY() * m_doc->getGridY()); + +        _diffs.append( KoPoint( ox - kpobject->getOrig().x(), oy - kpobject->getOrig().y() ) ); +        _objects.append( kpobject ); +    } + +    KPrSetOptionsCmd *setOptionsCmd = new KPrSetOptionsCmd( i18n( "Set New Options" ), _diffs, _objects, m_doc->getGridX(), +                                                      m_doc->getGridY(),_orastX, _orastY, _txtBackCol, _otxtBackCol, m_doc ); +    if ( createUndoRedo ) +        return setOptionsCmd; + +    delete setOptionsCmd; +    return 0L; +} + +QString KPrPage::manualTitle() const +{ +    return m_manualTitle; +} + +void KPrPage::insertManualTitle(const QString & title) +{ +    m_manualTitle=title; +} + +QString KPrPage::pageTitle( const QString &_title ) const +{ +    // If a user sets a title with manual, return it. +    if ( !m_manualTitle.isEmpty() ) +        return m_manualTitle; + +    QPtrList<KPrTextObject> objs; + +    // Create list of text objects in this page + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->getType()==OT_TEXT) +            objs.append( static_cast<KPrTextObject*>( it.current() ) ); +    } + +    QString title; +    if ( _title.isNull() ) +    { +        // MASTERPAGE +        if ( m_masterPage ) +            title = i18n( "Slide %1" ).arg( m_doc->pageList().findRef( this ) + 1 ); +        else +            title = i18n( "Slide Master" ); +    } +    else +    { +        title = _title; +    } + +    if ( objs.isEmpty() ) +        return title; + +    // Find object most on top +    KPrTextObject *tmp = objs.first(); +    KPrTextObject *textobject=tmp; +    for ( tmp = objs.next(); tmp; tmp = objs.next() ) +        if ( tmp->getOrig().y() < textobject->getOrig().y() ) +            textobject = tmp; + +    // this can't happen, but you never know :- ) +    if ( !textobject ) +        return QString( title ); + +    QString txt; +    if ( textobject->textDocument()->firstParag() ) +        txt = textobject->textDocument()->firstParag()->toString(); +    if ( txt.stripWhiteSpace().isEmpty() || txt=="\n" ) +        return title; +    return txt; +} + +void KPrPage::setNoteText( const QString &_text ) +{ +    m_noteText=_text; +    m_doc->setModified(true); +} + +QString KPrPage::noteText() const +{ +    return m_noteText; +} + +void KPrPage::makeUsedPixmapList() +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if( it.current()->getType()==OT_PICTURE || it.current()->getType()==OT_CLIPART) +            m_doc->insertPixmapKey(static_cast<KPrPixmapObject*>( it.current() )->getKey() ); +        else if ( it.current()->getType() == OT_GROUP ) +            makeUsedPixmapListForGroupObject( it.current() ); +    } + +    if( m_kpbackground->getBackType()==BT_PICTURE || m_kpbackground->getBackType()==BT_CLIPART) +        m_doc->insertPixmapKey(m_kpbackground->getBackPictureKey()); +} + +void KPrPage::makeUsedPixmapListForGroupObject( KPrObject *_obj ) +{ +    KPrGroupObject *_groupObj = static_cast<KPrGroupObject*>( _obj ); + +    if ( _groupObj ) { +        QPtrListIterator<KPrObject> it( _groupObj->objectList() ); +        for ( ; it.current(); ++it ) { +            if ( ( it.current()->getType() == OT_PICTURE ) +                 || ( it.current()->getType() == OT_CLIPART ) ) +                m_doc->insertPixmapKey(static_cast<KPrPixmapObject*>( it.current() )->getKey() ); +            else if ( it.current()->getType() == OT_GROUP ) +                makeUsedPixmapListForGroupObject( it.current() );  // recursion +        } +    } +} + + +QValueList<int> KPrPage::getEffectSteps() const +{ +    QMap<int,bool> stepmap; +    stepmap[0] = true; + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current(); ++it ) +    { +        stepmap[it.current()->getAppearStep()] = true; + +        if ( it.current()->getDisappear() ) +        { +            stepmap[it.current()->getDisappearStep()] = true; +        } +    } + +    return stepmap.keys(); +} + + +void KPrPage::deSelectAllObj() +{ +    QPtrListIterator<KPrObject> sIt( m_objectList ); +    for ( ; sIt.current() ; ++sIt ) +    { +        if(sIt.current()->isSelected()) +            deSelectObj(sIt.current() ); +    } +} + +void KPrPage::deSelectObj( KPrObject *kpobject ) +{ +    kpobject->setSelected( false ); +    m_doc->repaint( kpobject ); +} + +QDomElement KPrPage::saveObjects( QDomDocument &doc, QDomElement &objects, double yoffset, +                                  int saveOnlyPage ) const +{ +    QPtrListIterator<KPrObject> oIt(m_objectList); +    for (; oIt.current(); ++oIt ) +    { +        //don't store header/footer (store in header/footer section) +        if ( oIt.current()==m_doc->header() +             || oIt.current()==m_doc->footer() +             ||  oIt.current()->getType() == OT_PART) +            continue; +        QDomElement object=doc.createElement("OBJECT"); +        object.setAttribute("type", static_cast<int>( oIt.current()->getType() )); +        bool _sticky = ( this->m_masterPage == 0 ); +        if (_sticky) +            object.setAttribute("sticky", static_cast<int>(_sticky)); +        if ( saveOnlyPage != -1 ) +            yoffset=0; +        //add yoffset to compatibility with koffice 1.1 +        object.appendChild(oIt.current()->save( doc, yoffset )); + +        objects.appendChild(object); +    } +    return objects; +} + +bool KPrPage::oneObjectTextExist(bool forceAllTextObject) +{ +    QPtrList<KPrObject> lst; +    getAllObjectSelectedList(lst,forceAllTextObject ); +    QPtrListIterator<KPrObject> it( lst ); +    for ( ; it.current() ; ++it ) +    { +        if ( (it.current() == m_doc->header() && !hasHeader()) +             || (it.current() == m_doc->footer() && !hasFooter()) ) +            continue; +        if (it.current()->getType()==OT_TEXT) +            return true; +    } +    return false; +} + +bool KPrPage::oneObjectTextSelected() +{ +    return oneObjectTextExist(false); +} + + +bool KPrPage::isOneObjectSelected() +{ +    return 0 != getSelectedObj(); +} + +bool KPrPage::haveASelectedPartObj() +{ +    QPtrList<KPrObject> lst; +    getAllObjectSelectedList(lst ); +    QPtrListIterator<KPrObject> it( lst ); +    for ( ; it.current(); ++it ) { +        if (it.current()->getType() == OT_PART ) +            return true; +    } +    return false; +} + +bool KPrPage::haveASelectedGroupObj() +{ +    QPtrList<KPrObject> objects( getSelectedObjects( true ) ); +    QPtrListIterator<KPrObject> it( objects ); +    for ( ; it.current(); ++it ) { +        if ( it.current()->getType() == OT_GROUP ) +            return true; +    } +    return false; +} + +bool KPrPage::haveASelectedPixmapObj() +{ +    QPtrList<KPrObject> lst; +    getAllObjectSelectedList(lst ); +    QPtrListIterator<KPrObject> it( lst ); +    for ( ; it.current() ; ++it ) { +        if (( it.current()->getType() == OT_PICTURE ) +            || ( it.current()->getType() == OT_CLIPART ) ) +            return true; +    } +    return false; +} + +KoRect KPrPage::getRealRect( bool all ) const +{ +    KoRect rect; + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()== m_doc->header() || it.current()== m_doc->footer()) +            continue; + +        if ( all || ( it.current()->isSelected() && ! it.current()->isProtect() ) ) +            rect |= it.current()->getRealRect(); +    } + +    return rect; +} + +//return true if we change picture +bool KPrPage::chPic( KPrView *_view) +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()->isSelected() && +             ( ( it.current()->getType() == OT_PICTURE ) +               || ( it.current()->getType() == OT_CLIPART ) ) ) +        { +            KPrPixmapObject* obj=dynamic_cast<KPrPixmapObject*>( it.current() ); +            if( obj) +            { +                _view->changePicture( obj->getFileName() ); +                return true; +            } +        } +    } +    return false; +} + +bool KPrPage::savePicture( KPrView *_view ) const +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()->isSelected() && +             ( ( it.current()->getType() == OT_PICTURE ) +               || ( it.current()->getType() == OT_CLIPART ) ) ) +        { +            KPrPixmapObject* obj=dynamic_cast<KPrPixmapObject*>( it.current() ); +            if( obj) +            { +                _view->savePicture( obj ); +                return true; +            } +        } +    } +    return false; +} + +// move object for releasemouseevent +KCommand *KPrPage::moveObject(KPrView *_view, double diffx, double diffy) +{ +    bool createCommand=false; +    KPrMoveByCmd *moveByCmd=0L; +    QPtrList<KPrObject> _objects; +    _objects.setAutoDelete( false ); +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        //don't move a header/footer +        if ( it.current() == m_doc->header() || it.current() == m_doc->footer()) +            continue; +        if ( it.current()->isSelected() && !it.current()->isProtect()) +        { +            _objects.append( it.current() ); +            QRect br = _view->zoomHandler()->zoomRect( it.current()->getRepaintRect() ); +            br.moveBy( _view->zoomHandler()->zoomItX( diffx ), _view->zoomHandler()->zoomItY( diffy ) ); +            m_doc->repaint( br ); // Previous position +            m_doc->repaint( it.current() ); // New position +            createCommand=true; +        } +    } +    if(createCommand) { +        moveByCmd = new KPrMoveByCmd( i18n( "Move Objects" ), KoPoint( diffx, diffy ), +                                   _objects, m_doc,this ); + +        m_doc->updateSideBarItem( this ); +    } +    return moveByCmd; +} + +KCommand *KPrPage::moveObject(KPrView *m_view,const KoPoint &_move,bool key) +{ +    QPtrList<KPrObject> _objects; +    _objects.setAutoDelete( false ); +    KPrMoveByCmd *moveByCmd=0L; +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        //don't move a header/footer +        if ( it.current()== m_doc->header() || it.current()== m_doc->footer()) +            continue; +        if ( it.current()->isSelected() && !it.current()->isProtect()) { + +            QRect oldBoundingRect = m_view->zoomHandler()->zoomRect( it.current()->getRepaintRect() ); + +            it.current()->moveBy( _move ); +            _objects.append( it.current() ); +            m_doc->repaint( oldBoundingRect ); +            m_doc->repaint( it.current() ); +        } +    } + +    if ( key && !_objects.isEmpty()) +        moveByCmd = new KPrMoveByCmd( i18n( "Move Objects" ), +                                   KoPoint( _move ), +                                   _objects, m_doc,this ); + +    return moveByCmd; +} + +void KPrPage::repaintObj() +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->isSelected()) +            m_doc->repaint(it.current() ); +    } +} + +KCommand *KPrPage::rotateSelectedObjects( float _newAngle, bool addAngle ) +{ +    KPrRotateCmd * cmd = NULL; + +    QPtrList<KPrObject> _objects; +    _objects.setAutoDelete( false ); + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()== m_doc->header() || it.current()== m_doc->footer() ) +            continue; +        if( it.current()->isSelected() && !it.current()->isProtect()) +        { +            _objects.append( it.current() ); +        } +    } + +    if ( !_objects.isEmpty() ) { +        cmd = new KPrRotateCmd( i18n( "Change Rotation" ), _newAngle, _objects, m_doc, addAngle ); +        cmd->execute(); +    } + +    return cmd; +} + + +KCommand *KPrPage::shadowObj(ShadowDirection dir,int dist, const QColor &col) +{ +    KPrShadowCmd *shadowCmd=0L; +    bool newShadow=false; +    QPtrList<KPrObject> _objects; +    QPtrList<KPrShadowCmd::ShadowValues> _oldShadow; +    KPrShadowCmd::ShadowValues _newShadow, *tmp; + +    _objects.setAutoDelete( false ); +    _oldShadow.setAutoDelete( false ); + +    _newShadow.shadowDirection = dir; +    _newShadow.shadowDistance = dist; +    _newShadow.shadowColor = col; + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        //don't shadow a header/footer +        if ( it.current()== m_doc->header() || it.current()== m_doc->footer()) +            continue; + +        if ( it.current()->isSelected() ) { +            tmp = new KPrShadowCmd::ShadowValues; +            tmp->shadowDirection = it.current()->getShadowDirection(); +            tmp->shadowDistance =it.current()->getShadowDistance(); +            tmp->shadowColor = it.current()->getShadowColor(); + +            if(!newShadow &&( tmp->shadowDirection!=_newShadow.shadowDirection +                              || tmp->shadowDistance!=_newShadow.shadowDistance +                              || tmp->shadowColor!=_newShadow.shadowColor)) +                newShadow=true; + +            _oldShadow.append( tmp ); +            _objects.append( it.current() ); +        } +    } + +    if ( !_objects.isEmpty() && newShadow ) { +        shadowCmd = new KPrShadowCmd( i18n( "Change Shadow" ), +                                   _oldShadow, _newShadow, _objects, m_doc ); +        shadowCmd->execute(); +    } +    else +    { +        _oldShadow.setAutoDelete( true ); +        _oldShadow.clear(); +    } +    return shadowCmd; +} + +QPtrList<KoTextObject> KPrPage::allTextObjects() const +{ +    QPtrList<KoTextObject> lst; +    addTextObjects( lst ); +    return lst; +} + +void KPrPage::addTextObjects(QPtrList<KoTextObject>& lst) const +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +        it.current()->addTextObjects( lst ); +} + +KPrObject * KPrPage::getCursor( const QPoint &pos ) +{ +    return getCursor( m_doc->zoomHandler()->unzoomPoint( pos ) ); +} + +KPrObject * KPrPage::getCursor(const KoPoint &pos ) +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    KPrObject *kpobject = it.toLast(); +    while ( kpobject ) { +        if ( kpobject->contains( pos ) && kpobject->isSelected() ) +            return kpobject; +        kpobject = --it; +    } +    return 0L; +} + +KPrObject* KPrPage::getObjectAt( const KoPoint &pos, bool withoutProtected ) const +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    KPrObject *o = 0; +    //tz Check first if there is a selected object at this pos! +    for ( int i = 0; i < 2; ++i ) +    { +        o = it.toLast(); +        while ( o ) { +            if ( o != m_doc->footer() ||  +                 o != m_doc->header() ||  +                 ( m_bHasFooter && o == m_doc->footer() ) ||  +                 ( m_bHasHeader && o == m_doc->header() ) ) +            { +                if ( ( o->isSelected() || i > 0 ) &&  +                       o->contains( pos ) && !( o->isProtect() && withoutProtected ) ) +                    return o; +            } +            o = --it; +        } +    } +    return 0L; +} + +KPrPixmapObject * KPrPage::picViewOrigHelper() const +{ +    KPrPixmapObject *obj=0L; +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()->isSelected() && +             ( ( it.current()->getType() == OT_PICTURE ) +               || ( it.current()->getType() == OT_CLIPART ) ) ) +        { +            obj=(KPrPixmapObject*)it.current(); +            break; +        } +    } +    return obj; +} + +void KPrPage::applyStyleChange( KoStyleChangeDefMap changed ) +{ +    QPtrList<KPrObject> lst; +    getAllObjectSelectedList(lst,true /*force*/ ); +    QPtrListIterator<KPrObject> it( lst ); + +    for ( ; it.current() ; ++it ) +    { +        KPrTextObject *obj=dynamic_cast<KPrTextObject*>(it.current()); +        if( obj) +            obj->applyStyleChange( changed ); +    } +} + +void KPrPage::reactivateBgSpellChecking(bool refreshTextObj) +{ +    QPtrList<KPrObject> lst; +    getAllObjectSelectedList(lst,true /*force*/ ); +    QPtrListIterator<KPrObject> oIt( lst ); + +    for ( ; oIt.current() ; ++oIt ) +    { +        if(oIt.current()->getType()==OT_TEXT) +        { +            static_cast<KPrTextObject*>( oIt.current() )->textObject()->setNeedSpellCheck(true); +            if(refreshTextObj) +                m_doc->repaint( oIt.current() ); +        } +    } +} + +bool KPrPage::canMoveOneObject() const +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        //don't test header/footer all the time sticky +        if ( it.current()== m_doc->header() || it.current()== m_doc->footer()) +            continue; +        if(it.current()->isSelected()&& !it.current()->isProtect()) +            return true; +    } +    return false; +} + +KCommand *KPrPage::alignVertical( VerticalAlignmentType _type ) +{ +    KMacroCommand *macro = 0L; +    QPtrList<KPrObject> lst; +    getAllObjectSelectedList(lst ); +    QPtrListIterator<KPrObject> it( lst ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->getType()==OT_TEXT) +        { +            KPrTextObject *obj = dynamic_cast<KPrTextObject *>(it.current()); +            if ( obj  && !obj->isProtectContent()) +            { +                KPrChangeVerticalAlignmentCommand * cmd = new KPrChangeVerticalAlignmentCommand( i18n("Change Vertical Alignment"), +                                                                                                 obj, obj->verticalAlignment(),_type, m_doc); +                if ( !macro ) +                    macro = new KMacroCommand( i18n("Change Vertical Alignment")); +                macro->addCommand( cmd ); +                cmd->execute(); +            } +        } +    } +    return macro; +} + +void KPrPage::changeTabStopValue ( double _tabStop ) +{ +    QPtrList<KPrObject> lst; +    getAllObjectSelectedList(lst,true /*force*/ ); +    QPtrListIterator<KPrObject> it( lst ); +    for ( ; it.current() ; ++it ) +    { +        if(it.current()->getType()==OT_TEXT) +        { +            KPrTextObject *obj = dynamic_cast<KPrTextObject *>(it.current()); +            if ( obj ) +            { +                obj->textDocument()->setTabStops( m_doc->zoomHandler()->ptToLayoutUnitPixX( _tabStop )); +                obj->layout(); +                m_doc->repaint( obj ); +            } +        } +    } +} + +KPrObject *KPrPage::nextTextObject(KPrTextObject *obj) +{ +    if ( m_objectList.count()==0 ) +        return 0L; +    int pos = -1; +    if ( obj ) +        pos = m_objectList.findNextRef(obj); + +    if (pos != -1 ) +    { +        KPrObject *frm=0L; +        for ( frm=m_objectList.at(pos); frm != 0; frm=m_objectList.next() ) +        { +            KPrTextObject *newObj = frm->nextTextObject(); +            if(newObj && newObj->nextTextObject()->textObject()->needSpellCheck()) +                return frm; +        } +    } +    else +    { +        KPrObject *frm=0L; +        for ( frm=m_objectList.at(0); frm != 0; frm=m_objectList.next() ) +        { +            KPrTextObject *newObj = frm->nextTextObject(); +            if(newObj && newObj->nextTextObject()->textObject()->needSpellCheck()) +                return frm; +        } +    } +    return 0L; +} + +bool KPrPage::findTextObject( KPrObject *obj ) +{ +    return (m_objectList.findRef( obj )>=0 ); +} + +void KPrPage::getAllObjectSelectedList(QPtrList<KPrObject> &lst, bool force ) +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +        it.current()->getAllObjectSelectedList( lst,force ); +} + +void KPrPage::getAllEmbeddedObjectSelected(QPtrList<KoDocumentChild> &embeddedObjects ) +{ +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()->isSelected() && it.current()->getType() == OT_PART ) +            embeddedObjects.append( static_cast<KPrPartObject *>(it.current())->getChild() ); +    } +} + +KPrPixmapObject* KPrPage::getSelectedImage() const +{ +    KPrPixmapObject *obj=0L; +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current() ; ++it ) +    { +        if ( it.current()->isSelected() && it.current()->getType() == OT_PICTURE ) +        { +            obj=dynamic_cast<KPrPixmapObject*>(it.current()); +            break; +        } +    } +    return obj; +} + +KCommand * KPrPage::setImageEffect(ImageEffect eff, QVariant param1, QVariant param2, QVariant param3) +{ +    bool changed = false; +    KPrImageEffectCmd *imageEffectCmd = 0L; +    QPtrList<KPrObject> _objects; +    QPtrList<KPrImageEffectCmd::ImageEffectSettings> _oldSettings; +    KPrImageEffectCmd::ImageEffectSettings _newSettings, *tmp; + +    _objects.setAutoDelete( false ); +    _oldSettings.setAutoDelete( false ); + +    _newSettings.effect = eff; +    _newSettings.param1 = param1; +    _newSettings.param2 = param2; +    _newSettings.param3 = param3; + +    QPtrListIterator<KPrObject> it( m_objectList ); +    for ( ; it.current(); ++it ) { +        if ( it.current()->getType() == OT_PICTURE && it.current()->isSelected()) { +            tmp = new KPrImageEffectCmd::ImageEffectSettings; +            tmp->effect = static_cast<KPrPixmapObject*>(it.current())->getImageEffect(); +            tmp->param1 = static_cast<KPrPixmapObject*>(it.current())->getIEParam1(); +            tmp->param2 = static_cast<KPrPixmapObject*>(it.current())->getIEParam2(); +            tmp->param3 = static_cast<KPrPixmapObject*>(it.current())->getIEParam3(); +            _oldSettings.append( tmp ); +            _objects.append( it.current() ); + +            if( !changed && ( tmp->effect != _newSettings.effect +                              || tmp->param1 != _newSettings.param1 +                              || tmp->param2 != _newSettings.param2 +                              || tmp->param3 != _newSettings.param3 ) ) +                changed = true; +        } +    } + +    if ( !_objects.isEmpty() && changed ) { +        imageEffectCmd = new KPrImageEffectCmd( i18n( "Change Image Effect" ), _oldSettings, _newSettings, +                                             _objects, m_doc ); +        imageEffectCmd->execute(); +    } +    else { +        _oldSettings.setAutoDelete( true ); +        _oldSettings.clear(); +    } + +    m_doc->setModified( true ); + +    return imageEffectCmd; +} + +void KPrPage::setHeader( bool b, bool _updateDoc ) +{ +    m_bHasHeader = b; +    if ( _updateDoc ) +        m_doc->setHeader(b); +} + +void KPrPage::setFooter( bool b, bool _updateDoc ) +{ +    m_bHasFooter = b; +    if ( _updateDoc ) +        m_doc->setFooter( b ); +} + +void KPrPage::setUseMasterBackground( bool useMasterBackground ) +{ +    m_useMasterBackground = useMasterBackground; +} + +bool KPrPage::useMasterBackground() const +{ +    return m_useMasterBackground; +} + +bool KPrPage::isMasterPage() const +{ +    return ( m_masterPage==0 ); +} + +void KPrPage::setDisplayObjectFromMasterPage( bool _b ) +{ +    m_displayObjectFromMasterPage = _b; +    m_doc->setDisplayObjectMasterPage( _b ); +} + +void KPrPage::setDisplayBackground( bool _b ) +{ +    m_displayBackground = _b; +    m_doc->setDisplayBackground( _b ); +} + +  | 
