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 00000000..8529d2ea --- /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 ); +} + + |