You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4858 lines
176 KiB
4858 lines
176 KiB
15 years ago
|
/* This file is part of the KDE project
|
||
|
Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
|
||
|
Copyright (C) 2005-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 "KPrDocument.h"
|
||
|
#include "KPrView.h"
|
||
|
#include "KPrCanvas.h"
|
||
|
#include "KPrPage.h"
|
||
|
#include "KPrObject.h"
|
||
|
#include "KPrLineObject.h"
|
||
|
#include "KPrRectObject.h"
|
||
|
#include "KPrEllipseObject.h"
|
||
|
#include "KPrAutoformObject.h"
|
||
|
#include "KPrTextObject.h"
|
||
|
#include "KPrTextDocument.h"
|
||
|
#include "KPrPixmapObject.h"
|
||
|
#include "KPrPieObject.h"
|
||
|
#include "KPrPartObject.h"
|
||
|
#include "KPrGroupObject.h"
|
||
|
#include "KPrCommand.h"
|
||
|
#include "insertpagedia.h"
|
||
|
#include "KPrFreehandObject.h"
|
||
|
#include "KPrPolylineObject.h"
|
||
|
#include "KPrBezierCurveObject.h"
|
||
|
#include "KPrPolygonObject.h"
|
||
|
#include "KPrClosedLineObject.h"
|
||
|
#include "KPrSVGPathParser.h"
|
||
|
|
||
|
#include <qpopupmenu.h>
|
||
|
#include <qclipboard.h>
|
||
|
#include <qregexp.h>
|
||
|
#include <qfileinfo.h>
|
||
|
#include <qdom.h>
|
||
|
#include <qdict.h>
|
||
|
|
||
|
#include <KoDom.h>
|
||
|
#include <KoXmlNS.h>
|
||
|
|
||
|
#include <kurl.h>
|
||
|
#include <kdebug.h>
|
||
|
#include <KoGlobal.h>
|
||
|
#include <kapplication.h>
|
||
|
#include <kurldrag.h>
|
||
|
#include <ktempfile.h>
|
||
|
#include <klocale.h>
|
||
|
#include <kfiledialog.h>
|
||
|
#include <kglobal.h>
|
||
|
#include <kstandarddirs.h>
|
||
|
#include <kmessagebox.h>
|
||
|
#include <kprocess.h>
|
||
|
#include <kio/netaccess.h>
|
||
|
|
||
|
#include <KoTemplateChooseDia.h>
|
||
|
#include <KoRuler.h>
|
||
|
#include <KoGenStyles.h>
|
||
|
#include <KoFilterManager.h>
|
||
|
#include <KoStore.h>
|
||
|
#include <KoStoreDevice.h>
|
||
|
#include <KoQueryTrader.h>
|
||
|
#include <KoXmlWriter.h>
|
||
|
#include <KoOasisSettings.h>
|
||
|
#include <KoMainWindow.h>
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <math.h>
|
||
|
#include <unistd.h>
|
||
|
#include <config.h>
|
||
|
|
||
|
#include <KoRichText.h>
|
||
|
#include <KoTextObject.h>
|
||
|
#include <KoTextZoomHandler.h>
|
||
|
#include <KoStyleCollection.h>
|
||
|
#include <kcommand.h>
|
||
|
#include "KPrDocumentIface.h"
|
||
|
|
||
|
#include <kspell2/settings.h>
|
||
|
|
||
|
#include <KoVariable.h>
|
||
|
#include <KoAutoFormat.h>
|
||
|
#include <KoDocumentInfo.h>
|
||
|
#include "KPrVariableCollection.h"
|
||
|
#include "KPrBackground.h"
|
||
|
#include "KPrNoteBar.h"
|
||
|
#include "KPrBgSpellCheck.h"
|
||
|
#include <kglobalsettings.h>
|
||
|
#include <KoCommandHistory.h>
|
||
|
#include "KoApplication.h"
|
||
|
#include <KoOasisStyles.h>
|
||
|
#include <KoOasisContext.h>
|
||
|
|
||
|
#include "KPrLoadingInfo.h"
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
static const int CURRENT_SYNTAX_VERSION = 2;
|
||
|
// Make sure an appropriate DTD is available in www/koffice/DTD if changing this value
|
||
|
static const char * CURRENT_DTD_VERSION = "1.2";
|
||
|
|
||
|
KPrChild::KPrChild( KPrDocument *_kpr, KoDocument* _doc, const QRect& _rect )
|
||
|
: KoDocumentChild( _kpr, _doc, _rect )
|
||
|
{
|
||
|
m_parent = _kpr;
|
||
|
}
|
||
|
|
||
|
KPrChild::KPrChild( KPrDocument *_kpr ) :
|
||
|
KoDocumentChild( _kpr )
|
||
|
{
|
||
|
m_parent = _kpr;
|
||
|
}
|
||
|
|
||
|
KPrChild::~KPrChild()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
KoDocument *KPrChild::hitTest( const QPoint &, const QWMatrix & )
|
||
|
{
|
||
|
// hitTest functionality is disabled because kpresenter handles activation
|
||
|
// of embedded parts by itself. See KPrPartObject::activate().
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
KPrDocument::KPrDocument( QWidget *parentWidget, const char *widgetName, QObject* parent, const char* name,
|
||
|
bool singleViewMode )
|
||
|
: KoDocument( parentWidget,widgetName, parent, name, singleViewMode ),
|
||
|
_gradientCollection(), m_customListTest( 0L ),
|
||
|
m_childCountBeforeInsert( 0 )
|
||
|
{
|
||
|
setInstance( KPrFactory::global() );
|
||
|
setTemplateType( "kpresenter_template" );
|
||
|
//Necessary to define page where we load object otherwise copy-duplicate page doesn't work.
|
||
|
m_pageWhereLoadObject=0L;
|
||
|
m_loadingInfo=0L;
|
||
|
m_tabStop = MM_TO_POINT( 15.0 );
|
||
|
m_styleColl=new KoStyleCollection();
|
||
|
m_insertFilePage = 0;
|
||
|
m_picturePath= KGlobalSettings::documentPath();
|
||
|
m_globalLanguage = KGlobal::locale()->language();
|
||
|
m_bGlobalHyphenation = false;
|
||
|
_duplicatePage=false;
|
||
|
|
||
|
KoParagStyle* m_standardStyle = new KoParagStyle( "Standard" );
|
||
|
m_styleColl->addStyle( m_standardStyle );
|
||
|
|
||
|
KConfig *config = KPrFactory::global()->config();
|
||
|
config->setGroup("Document defaults" );
|
||
|
QString defaultFontname=config->readEntry("DefaultFont");
|
||
|
if ( !defaultFontname.isEmpty() )
|
||
|
m_defaultFont.fromString( defaultFontname );
|
||
|
// If not found, we automatically fallback to the application font (the one from KControl's font module)
|
||
|
|
||
|
// Try to force a scalable font.
|
||
|
m_defaultFont.setStyleStrategy( QFont::ForceOutline );
|
||
|
//kdDebug(33001) << "Default font: requested family: " << m_defaultFont.family() << endl;
|
||
|
//kdDebug(33001) << "Default font: real family: " << QFontInfo(m_defaultFont).family() << endl;
|
||
|
|
||
|
int ptSize = m_defaultFont.pointSize();
|
||
|
if ( ptSize == -1 ) // specified with a pixel size ?
|
||
|
ptSize = QFontInfo(m_defaultFont).pointSize();
|
||
|
//kdDebug(33001) << "KPrDocument::KPrDocument[2] ptSize=" << ptSize << endl;
|
||
|
// Ok, this is KPresenter. A default font of 10 makes no sense. Let's go for 20.
|
||
|
ptSize = QMAX( 20, ptSize );
|
||
|
|
||
|
m_standardStyle->format().setFont( m_defaultFont );
|
||
|
|
||
|
/// KPresenter isn't color-scheme aware, it defaults to black on white.
|
||
|
m_standardStyle->format().setColor( Qt::black );
|
||
|
|
||
|
if( config->hasGroup("Interface") ) {
|
||
|
config->setGroup( "Interface" );
|
||
|
m_globalLanguage=config->readEntry("language", KGlobal::locale()->language());
|
||
|
m_bGlobalHyphenation=config->readBoolEntry("hyphenation", false);
|
||
|
}
|
||
|
|
||
|
m_standardStyle->format().setLanguage( m_globalLanguage);
|
||
|
|
||
|
m_zoomHandler = new KoTextZoomHandler;
|
||
|
|
||
|
m_varFormatCollection = new KoVariableFormatCollection;
|
||
|
m_varColl = new KPrVariableCollection( new KoVariableSettings(), m_varFormatCollection );
|
||
|
m_bgSpellCheck = new KPrBgSpellCheck(this);
|
||
|
dcop = 0;
|
||
|
m_initialActivePage=0;
|
||
|
m_bShowStatusBar = true;
|
||
|
m_autoFormat = new KoAutoFormat(this,m_varColl,m_varFormatCollection);
|
||
|
_clean = true;
|
||
|
_spInfiniteLoop = false;
|
||
|
_spShowEndOfPresentationSlide = true;
|
||
|
_spManualSwitch = true;
|
||
|
_showPresentationDuration = false;
|
||
|
tmpSoundFileList = QPtrList<KTempFile>();
|
||
|
_xRnd = 20;
|
||
|
_yRnd = 20;
|
||
|
_txtBackCol = lightGray;
|
||
|
_otxtBackCol = lightGray;
|
||
|
|
||
|
m_bShowRuler=true;
|
||
|
m_bAllowAutoFormat = true;
|
||
|
|
||
|
m_bViewFormattingChars = false;
|
||
|
m_bShowGuideLines = true;
|
||
|
|
||
|
m_bShowGrid = true;
|
||
|
|
||
|
m_bSnapToGrid = true;
|
||
|
|
||
|
m_cursorInProtectectedArea=true;
|
||
|
|
||
|
usedSoundFile = QStringList();
|
||
|
haveNotOwnDiskSoundFile = QStringList();
|
||
|
|
||
|
m_zoomHandler->setZoomAndResolution( 100, KoGlobal::dpiX(), KoGlobal::dpiY() );
|
||
|
newZoomAndResolution(false,false);
|
||
|
|
||
|
// _pageLayout.format = PG_SCREEN;
|
||
|
// _pageLayout.orientation = PG_PORTRAIT;
|
||
|
// _pageLayout.width = PG_SCREEN_WIDTH;
|
||
|
// _pageLayout.height = PG_SCREEN_HEIGHT;
|
||
|
// _pageLayout.left = 0;
|
||
|
// _pageLayout.right = 0;
|
||
|
// _pageLayout.top = 0;
|
||
|
// _pageLayout.bottom = 0;
|
||
|
// _pageLayout.ptWidth = cMM_TO_POINT( PG_SCREEN_WIDTH );
|
||
|
// _pageLayout.ptHeight = cMM_TO_POINT( PG_SCREEN_HEIGHT );
|
||
|
// _pageLayout.ptLeft = 0;
|
||
|
// _pageLayout.ptRight = 0;
|
||
|
// _pageLayout.ptTop = 0;
|
||
|
// _pageLayout.ptBottom = 0;
|
||
|
|
||
|
m_indent = MM_TO_POINT( 10.0 );
|
||
|
m_gridX = MM_TO_POINT( 5.0 );
|
||
|
m_gridY = MM_TO_POINT( 5.0 );
|
||
|
|
||
|
oldGridX = m_gridX;
|
||
|
oldGridY = m_gridY;
|
||
|
|
||
|
m_masterPage=new KPrPage(this);
|
||
|
KPrPage *newpage = new KPrPage( this, m_masterPage );
|
||
|
m_pageList.insert( 0,newpage);
|
||
|
m_bInsertDirectCursor = false;
|
||
|
|
||
|
objStartY = 0;
|
||
|
_presPen = QPen( red, 3, SolidLine );
|
||
|
ignoreSticky = TRUE;
|
||
|
|
||
|
m_gridColor=Qt::black;
|
||
|
|
||
|
_header = new KPrTextObject( this );
|
||
|
_header->setDrawEditRect( false );
|
||
|
_header->setDrawEmpty( false );
|
||
|
|
||
|
_footer = new KPrTextObject( this );
|
||
|
_footer->setDrawEditRect( false );
|
||
|
_footer->setDrawEmpty( false );
|
||
|
|
||
|
saveOnlyPage = -1;
|
||
|
m_maxRecentFiles = 10;
|
||
|
|
||
|
connect( QApplication::clipboard(), SIGNAL( dataChanged() ),
|
||
|
this, SLOT( clipboardDataChanged() ) );
|
||
|
|
||
|
m_commandHistory = new KoCommandHistory( actionCollection(), true ) ;
|
||
|
initConfig();
|
||
|
|
||
|
connect( m_commandHistory, SIGNAL( documentRestored() ), this, SLOT( slotDocumentRestored() ) );
|
||
|
connect( m_commandHistory, SIGNAL( commandExecuted() ), this, SLOT( slotCommandExecuted() ) );
|
||
|
|
||
|
dcopObject();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::refreshMenuCustomVariable()
|
||
|
{
|
||
|
emit sig_refreshMenuCustomVariable();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::slotDocumentRestored()
|
||
|
{
|
||
|
setModified( false );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::slotCommandExecuted()
|
||
|
{
|
||
|
setModified( true );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveConfig()
|
||
|
{
|
||
|
if ( !isReadWrite())
|
||
|
return;
|
||
|
KConfigGroup group( KoGlobal::kofficeConfig(), "Spelling" );
|
||
|
group.writeEntry( "PersonalDict", m_spellCheckPersonalDict );
|
||
|
if ( !isEmbedded() )
|
||
|
{
|
||
|
KConfig *config = KPrFactory::global()->config();
|
||
|
config->setGroup( "Interface" );
|
||
|
config->writeEntry( "Zoom", m_zoomHandler->zoom() );
|
||
|
config->writeEntry( "AllowAutoFormat" , m_bAllowAutoFormat );
|
||
|
config->writeEntry( "ViewFormattingChars", m_bViewFormattingChars );
|
||
|
config->writeEntry( "ShowGrid" , m_bShowGrid );
|
||
|
config->writeEntry( "SnapToGrid" , m_bSnapToGrid );
|
||
|
config->writeEntry( "ResolutionX", m_gridX );
|
||
|
config->writeEntry( "ResolutionY", m_gridY );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::initConfig()
|
||
|
{
|
||
|
int zoom;
|
||
|
KConfig* config = KPrFactory::global()->config();
|
||
|
if( config->hasGroup("Interface") ) {
|
||
|
config->setGroup( "Interface" );
|
||
|
setAutoSave( config->readNumEntry( "AutoSave", defaultAutoSave()/60 ) * 60 );
|
||
|
setBackupFile( config->readBoolEntry("BackupFile", true));
|
||
|
setCursorInProtectedArea( config->readBoolEntry( "cursorInProtectArea", true ));
|
||
|
|
||
|
// Config-file value in mm, default 10 pt
|
||
|
double indent = config->readDoubleNumEntry("Indent", MM_TO_POINT(10.0) ) ;
|
||
|
setIndentValue(indent);
|
||
|
m_maxRecentFiles = config->readNumEntry( "NbRecentFile", 10 );
|
||
|
setShowRuler(config->readBoolEntry("Rulers",true));
|
||
|
zoom = config->readNumEntry( "Zoom", 100 );
|
||
|
setShowStatusBar( config->readBoolEntry( "ShowStatusBar" , true ));
|
||
|
setAllowAutoFormat( config->readBoolEntry( "AllowAutoFormat" , true ));
|
||
|
setViewFormattingChars( config->readBoolEntry( "ViewFormattingChars", false ) );
|
||
|
setShowGrid( config->readBoolEntry( "ShowGrid" , true ));
|
||
|
setSnapToGrid( config->readBoolEntry( "SnapToGrid", true ));
|
||
|
setGridX( config->readDoubleNumEntry( "ResolutionX", MM_TO_POINT( 5.0 ) ));
|
||
|
setGridY( config->readDoubleNumEntry( "ResolutionY", MM_TO_POINT( 5.0 ) ));
|
||
|
|
||
|
m_bInsertDirectCursor= config->readBoolEntry( "InsertDirectCursor", false );
|
||
|
m_globalLanguage=config->readEntry("language", KGlobal::locale()->language());
|
||
|
|
||
|
}
|
||
|
else
|
||
|
zoom=100;
|
||
|
|
||
|
QColor oldBgColor = Qt::white;
|
||
|
QColor oldGridColor = Qt::black;
|
||
|
if ( config->hasGroup( "KPresenter Color" ) ) {
|
||
|
config->setGroup( "KPresenter Color" );
|
||
|
setTxtBackCol(config->readColorEntry( "BackgroundColor", &oldBgColor ));
|
||
|
setGridColor(config->readColorEntry( "GridColor", &oldGridColor ));
|
||
|
}
|
||
|
|
||
|
|
||
|
if( config->hasGroup("KSpell kpresenter" ) )
|
||
|
{
|
||
|
config->setGroup( "KSpell kpresenter" );
|
||
|
|
||
|
// Default is false for spellcheck, but the spell-check config dialog
|
||
|
// should write out "true" when the user configures spell checking.
|
||
|
if ( isReadWrite() )
|
||
|
m_bgSpellCheck->setEnabled(config->readBoolEntry( "SpellCheck", false ));
|
||
|
else
|
||
|
m_bgSpellCheck->setEnabled( false );
|
||
|
}
|
||
|
int undo=30;
|
||
|
if(config->hasGroup("Misc" ) )
|
||
|
{
|
||
|
config->setGroup( "Misc" );
|
||
|
undo=config->readNumEntry("UndoRedo",-1);
|
||
|
}
|
||
|
if(undo!=-1)
|
||
|
setUndoRedoLimit(undo);
|
||
|
|
||
|
if(config->hasGroup("Kpresenter Path" ) )
|
||
|
{
|
||
|
config->setGroup( "Kpresenter Path" );
|
||
|
m_picturePath=config->readPathEntry( "picture path",KGlobalSettings::documentPath());
|
||
|
setBackupPath(config->readPathEntry( "backup path" ));
|
||
|
}
|
||
|
|
||
|
// Load personal dict
|
||
|
KConfigGroup group( KoGlobal::kofficeConfig(), "Spelling" );
|
||
|
m_spellCheckPersonalDict = group.readListEntry( "PersonalDict" );
|
||
|
|
||
|
// Apply configuration, without creating an undo/redo command
|
||
|
replaceObjs( false );
|
||
|
zoomHandler()->setZoom( zoom );
|
||
|
newZoomAndResolution(false,false);
|
||
|
}
|
||
|
|
||
|
DCOPObject* KPrDocument::dcopObject()
|
||
|
{
|
||
|
if ( !dcop )
|
||
|
dcop = new KPrDocumentIface( this );
|
||
|
|
||
|
return dcop;
|
||
|
}
|
||
|
|
||
|
KPrDocument::~KPrDocument()
|
||
|
{
|
||
|
if(isReadWrite())
|
||
|
saveConfig();
|
||
|
clearTestCustomSlideShow();
|
||
|
//Be carefull !!!!!! don't delete this pointer delete in stickypage
|
||
|
#if 0
|
||
|
delete _header;
|
||
|
delete _footer;
|
||
|
#endif
|
||
|
|
||
|
delete m_commandHistory;
|
||
|
delete m_zoomHandler;
|
||
|
delete m_autoFormat;
|
||
|
delete m_varColl;
|
||
|
delete m_varFormatCollection;
|
||
|
delete dcop;
|
||
|
delete m_masterPage;
|
||
|
delete m_bgSpellCheck;
|
||
|
delete m_styleColl;
|
||
|
|
||
|
m_pageList.setAutoDelete( true );
|
||
|
m_pageList.clear();
|
||
|
m_deletedPageList.setAutoDelete( true );
|
||
|
m_deletedPageList.clear();
|
||
|
tmpSoundFileList.setAutoDelete( true );
|
||
|
tmpSoundFileList.clear();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::addCommand( KCommand * cmd )
|
||
|
{
|
||
|
kdDebug(33001) << "KPrDocument::addCommand " << cmd->name() << endl;
|
||
|
m_commandHistory->addCommand( cmd, false );
|
||
|
setModified( true );
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::saveChildren( KoStore* _store )
|
||
|
{
|
||
|
int i = 0;
|
||
|
|
||
|
QPtrListIterator<KoDocumentChild> it( children() );
|
||
|
for( ; it.current(); ++it ) {
|
||
|
// Don't save children that are only in the undo/redo history
|
||
|
// but not anymore in the presentation
|
||
|
QPtrListIterator<KPrPage> pageIt( m_pageList );
|
||
|
for ( int pagePos = 0; pageIt.current(); ++pageIt, ++pagePos )
|
||
|
{
|
||
|
if ( saveOnlyPage == -1 || pagePos == saveOnlyPage )
|
||
|
{
|
||
|
QPtrListIterator<KPrObject> oIt(pageIt.current()->objectList());
|
||
|
for (; oIt.current(); ++oIt )
|
||
|
{
|
||
|
if ( oIt.current()->getType() == OT_PART &&
|
||
|
dynamic_cast<KPrPartObject*>( oIt.current() )->getChild() == it.current() )
|
||
|
{
|
||
|
if (((KoDocumentChild*)(it.current()))->document()!=0)
|
||
|
if ( !((KoDocumentChild*)(it.current()))->document()->saveToStore( _store, QString::number( i++ ) ) )
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{
|
||
|
QPtrListIterator<KPrObject> oIt(m_masterPage->objectList());
|
||
|
for (; oIt.current(); ++oIt )
|
||
|
{
|
||
|
if ( oIt.current()->getType() == OT_PART &&
|
||
|
dynamic_cast<KPrPartObject*>( oIt.current() )->getChild() == it.current() )
|
||
|
{
|
||
|
if (((KoDocumentChild*)(it.current()))->document()!=0)
|
||
|
if ( !((KoDocumentChild*)(it.current()))->document()->saveToStore( _store, QString::number( i++ ) ) )
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
QDomDocument KPrDocument::saveXML()
|
||
|
{
|
||
|
if ( saveOnlyPage == -1 ) {
|
||
|
emit sigProgress( 0 );
|
||
|
}
|
||
|
|
||
|
m_varColl->variableSetting()->setModificationDate(QDateTime::currentDateTime());
|
||
|
recalcVariables( VT_DATE );
|
||
|
recalcVariables( VT_TIME );
|
||
|
recalcVariables( VT_STATISTIC );
|
||
|
QDomDocument doc = createDomDocument( "DOC", CURRENT_DTD_VERSION );
|
||
|
QDomElement presenter=doc.documentElement();
|
||
|
presenter.setAttribute("editor", "KPresenter");
|
||
|
presenter.setAttribute("mime", "application/x-kpresenter");
|
||
|
presenter.setAttribute("syntaxVersion", CURRENT_SYNTAX_VERSION);
|
||
|
QDomElement paper=doc.createElement("PAPER");
|
||
|
paper.setAttribute("format", static_cast<int>( m_pageLayout.format ));
|
||
|
paper.setAttribute("ptWidth", QString::number( m_pageLayout.ptWidth, 'g', 10 ));
|
||
|
paper.setAttribute("ptHeight", QString::number( m_pageLayout.ptHeight, 'g', 10 ));
|
||
|
|
||
|
paper.setAttribute("orientation", static_cast<int>( m_pageLayout.orientation ));
|
||
|
paper.setAttribute("unit", unit() );
|
||
|
paper.setAttribute("tabStopValue", m_tabStop );
|
||
|
|
||
|
QDomElement paperBorders=doc.createElement("PAPERBORDERS");
|
||
|
|
||
|
paperBorders.setAttribute("ptLeft", m_pageLayout.ptLeft);
|
||
|
paperBorders.setAttribute("ptTop", m_pageLayout.ptTop);
|
||
|
paperBorders.setAttribute("ptRight", m_pageLayout.ptRight);
|
||
|
paperBorders.setAttribute("ptBottom", m_pageLayout.ptBottom);
|
||
|
paper.appendChild(paperBorders);
|
||
|
presenter.appendChild(paper);
|
||
|
|
||
|
m_varColl->variableSetting()->save(presenter );
|
||
|
|
||
|
presenter.appendChild(saveAttribute( doc ));
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
emit sigProgress( 5 );
|
||
|
|
||
|
QDomElement element=doc.createElement("BACKGROUND");
|
||
|
element.appendChild(saveBackground( doc ));
|
||
|
presenter.appendChild(element);
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
emit sigProgress( 10 );
|
||
|
|
||
|
//TODO save correct page info for header/footer
|
||
|
element=doc.createElement("HEADER");
|
||
|
element.setAttribute("show", static_cast<int>( m_pageList.at(0)->hasHeader() ));
|
||
|
element.appendChild(_header->save( doc,0 ));
|
||
|
presenter.appendChild(element);
|
||
|
|
||
|
element=doc.createElement("FOOTER");
|
||
|
element.setAttribute("show", static_cast<int>( m_pageList.at(0)->hasFooter() ));
|
||
|
element.appendChild(_footer->save( doc,0 ));
|
||
|
presenter.appendChild(element);
|
||
|
|
||
|
element = doc.createElement( "HEADERFOOTERBYPAGE" );
|
||
|
element.setAttribute( "value", "true" );
|
||
|
presenter.appendChild( element );
|
||
|
|
||
|
element=doc.createElement("HELPLINES");
|
||
|
element.setAttribute("show", static_cast<int>( showGuideLines() ));
|
||
|
saveGuideLines( doc, element );
|
||
|
presenter.appendChild(element);
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{
|
||
|
if( !m_spellCheckIgnoreList.isEmpty() )
|
||
|
{
|
||
|
QDomElement spellCheckIgnore = doc.createElement( "SPELLCHECKIGNORELIST" );
|
||
|
presenter.appendChild( spellCheckIgnore );
|
||
|
for ( QStringList::Iterator it = m_spellCheckIgnoreList.begin(); it != m_spellCheckIgnoreList.end(); ++it )
|
||
|
{
|
||
|
QDomElement spellElem = doc.createElement( "SPELLCHECKIGNOREWORD" );
|
||
|
spellCheckIgnore.appendChild( spellElem );
|
||
|
spellElem.setAttribute( "word", *it );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
emit sigProgress( 20 );
|
||
|
|
||
|
presenter.appendChild(saveTitle( doc ));
|
||
|
|
||
|
presenter.appendChild(saveNote( doc ));
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
emit sigProgress( 30 );
|
||
|
|
||
|
presenter.appendChild(saveObjects(doc));
|
||
|
|
||
|
// ### If we will create a new version of the file format, fix that spelling error
|
||
|
element=doc.createElement("INFINITLOOP");
|
||
|
element.setAttribute("value", _spInfiniteLoop);
|
||
|
element=doc.createElement("SHOWENDOFPRESENTATIONSLIDE");
|
||
|
element.setAttribute("value", _spShowEndOfPresentationSlide);
|
||
|
presenter.appendChild(element);
|
||
|
element=doc.createElement("MANUALSWITCH");
|
||
|
element.setAttribute("value", _spManualSwitch);
|
||
|
presenter.appendChild(element);
|
||
|
element=doc.createElement("PRESSPEED");
|
||
|
//TODO FIXME !!!!!!!!!!
|
||
|
//element.setAttribute("value", static_cast<int>( presSpeed ));
|
||
|
presenter.appendChild(element);
|
||
|
element=doc.createElement("SHOWPRESENTATIONDURATION");
|
||
|
element.setAttribute("value", _showPresentationDuration);
|
||
|
presenter.appendChild(element);
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{
|
||
|
if ( !m_customListSlideShow.isEmpty() )
|
||
|
{
|
||
|
QMap<KPrPage *, QString> page2name;
|
||
|
int pos = 1;
|
||
|
for ( QPtrListIterator<KPrPage> it( m_pageList ); it.current(); ++it )
|
||
|
{
|
||
|
page2name.insert( it.current(), "page" + QString::number( pos++ ) ) ;
|
||
|
}
|
||
|
|
||
|
element = doc.createElement( "CUSTOMSLIDESHOWCONFIG" );
|
||
|
CustomSlideShowMap::Iterator it;
|
||
|
for ( it = m_customListSlideShow.begin(); it != m_customListSlideShow.end(); ++it )
|
||
|
{
|
||
|
QDomElement slide=doc.createElement("CUSTOMSLIDESHOW");
|
||
|
slide.setAttribute("name", it.key() );
|
||
|
QString tmp;
|
||
|
QValueListIterator<KPrPage*> itPage ;
|
||
|
for( itPage = ( *it ).begin(); itPage != ( *it ).end(); ++itPage )
|
||
|
{
|
||
|
int posPage = m_pageList.find( *itPage );
|
||
|
if ( posPage != -1 )
|
||
|
{
|
||
|
if ( itPage != ( *it ).begin() )
|
||
|
tmp += ",";
|
||
|
tmp += page2name[*itPage];
|
||
|
}
|
||
|
}
|
||
|
slide.setAttribute( "pages", tmp );
|
||
|
element.appendChild(slide);
|
||
|
}
|
||
|
presenter.appendChild(element);
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( !m_presentationName.isEmpty() )
|
||
|
{
|
||
|
element = doc.createElement( "DEFAULTCUSTOMSLIDESHOWNAME" );
|
||
|
element.setAttribute( "name", m_presentationName );
|
||
|
presenter.appendChild(element);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
emit sigProgress( 40 );
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{
|
||
|
element=doc.createElement("SELSLIDES");
|
||
|
for ( uint i = 0; i < m_pageList.count(); i++ ) {
|
||
|
QDomElement slide=doc.createElement("SLIDE");
|
||
|
slide.setAttribute("nr", i);
|
||
|
slide.setAttribute("show", m_pageList.at(i)->isSlideSelected());
|
||
|
element.appendChild(slide);
|
||
|
}
|
||
|
presenter.appendChild(element);
|
||
|
|
||
|
emit sigProgress( 50 );
|
||
|
}
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{
|
||
|
QDomElement styles = doc.createElement( "STYLES" );
|
||
|
presenter.appendChild( styles );
|
||
|
QValueList<KoUserStyle *> styleList(m_styleColl->styleList());
|
||
|
for ( QValueList<KoUserStyle *>::const_iterator it = styleList.begin(), end = styleList.end();
|
||
|
it != end ; ++it )
|
||
|
saveStyle( static_cast<KoParagStyle *>( *it ), styles );
|
||
|
|
||
|
emit sigProgress( 60 );
|
||
|
}
|
||
|
|
||
|
// Write "OBJECT" tag for every child
|
||
|
QPtrListIterator<KoDocumentChild> chl( children() );
|
||
|
for( ; chl.current(); ++chl ) {
|
||
|
// Don't save children that are only in the undo/redo history
|
||
|
// but not anymore in the presentation
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ ) {
|
||
|
if ( saveOnlyPage != -1 && i != saveOnlyPage )
|
||
|
continue;
|
||
|
double offset=0;
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{
|
||
|
offset = i * m_pageList.at(i)->getPageRect().height();
|
||
|
}
|
||
|
saveEmbeddedObject(m_pageList.at(i), chl.current(),doc,presenter,offset );
|
||
|
}
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{
|
||
|
saveEmbeddedObject(m_masterPage, chl.current(),doc,presenter,0.0 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
emit sigProgress( 70 );
|
||
|
makeUsedPixmapList();
|
||
|
|
||
|
QDomElement pictures = m_pictureCollection.saveXML( KoPictureCollection::CollectionPicture, doc, usedPictures );
|
||
|
presenter.appendChild( pictures );
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
emit sigProgress( 90 );
|
||
|
|
||
|
// Save sound file list.
|
||
|
makeUsedSoundFileList();
|
||
|
QDomElement soundFiles = saveUsedSoundFileToXML( doc, usedSoundFile );
|
||
|
presenter.appendChild( soundFiles );
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
setModified( false );
|
||
|
return doc;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveEmbeddedObject(KPrPage *page, const QPtrList<KoDocumentChild>& childList,
|
||
|
QDomDocument &doc,QDomElement &presenter )
|
||
|
{
|
||
|
QPtrListIterator<KoDocumentChild> chl( childList );
|
||
|
double offset = 0.0;
|
||
|
// we need no offset for objects on the master page and when we copy a page
|
||
|
if ( m_pageList.findRef( page ) )
|
||
|
{
|
||
|
offset=m_pageList.findRef(page)*page->getPageRect().height();
|
||
|
}
|
||
|
for( ; chl.current(); ++chl )
|
||
|
saveEmbeddedObject(page, chl.current(),doc,presenter, offset );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveEmbeddedObject(KPrPage *page, KoDocumentChild *chl, QDomDocument &doc,
|
||
|
QDomElement &presenter, double offset )
|
||
|
{
|
||
|
QPtrListIterator<KPrObject> oIt(page->objectList());
|
||
|
for ( int pos = 0; oIt.current(); ++oIt, ++pos )
|
||
|
{
|
||
|
if ( oIt.current()->getType() == OT_PART &&
|
||
|
static_cast<KPrPartObject*>( oIt.current() )->getChild() == chl )
|
||
|
{
|
||
|
QDomElement embedded=doc.createElement("EMBEDDED");
|
||
|
KPrChild* curr = (KPrChild*)chl;
|
||
|
|
||
|
// geometry is no zoom value !
|
||
|
QRect _rect = curr->geometry();
|
||
|
int tmpX = (int)zoomHandler()->unzoomItX( _rect.x() );
|
||
|
int tmpY = (int)zoomHandler()->unzoomItY( _rect.y() );
|
||
|
int tmpWidth = (int)zoomHandler()->unzoomItX( _rect.width() );
|
||
|
int tmpHeight = (int)zoomHandler()->unzoomItY( _rect.height() );
|
||
|
curr->setGeometry( QRect( tmpX, tmpY, tmpWidth, tmpHeight ) );
|
||
|
|
||
|
embedded.appendChild(curr->save(doc, true));
|
||
|
|
||
|
curr->setGeometry( _rect ); // replace zoom value
|
||
|
|
||
|
QDomElement settings=doc.createElement("SETTINGS");
|
||
|
settings.setAttribute( "z-index", pos );
|
||
|
if ( page == m_masterPage )
|
||
|
settings.setAttribute("sticky", 1 );
|
||
|
QPtrListIterator<KPrObject> setOIt(page->objectList());
|
||
|
for (; setOIt.current(); ++setOIt )
|
||
|
{
|
||
|
if ( setOIt.current()->getType() == OT_PART &&
|
||
|
dynamic_cast<KPrPartObject*>( setOIt.current() )->getChild() == curr )
|
||
|
settings.appendChild(setOIt.current()->save( doc,offset ));
|
||
|
}
|
||
|
embedded.appendChild(settings);
|
||
|
presenter.appendChild(embedded);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//TODO with changes with new file format header/footer can't be change
|
||
|
void KPrDocument::compatibilityFromOldFileFormat()
|
||
|
{
|
||
|
//function to keep compatibility with old file format
|
||
|
//for example for presSpeed
|
||
|
if ( m_loadingInfo && m_loadingInfo->oldFormat() )
|
||
|
{
|
||
|
EffectSpeed newValue = ES_MEDIUM;
|
||
|
bool presSpeedChanged = ( m_loadingInfo->presSpeed != -1 );
|
||
|
if ( presSpeedChanged )
|
||
|
{
|
||
|
if ( m_loadingInfo->presSpeed < 3 )
|
||
|
newValue = ES_SLOW;
|
||
|
else if ( m_loadingInfo->presSpeed > 7 )
|
||
|
newValue = ES_FAST;
|
||
|
}
|
||
|
if ( !m_loadingInfo->m_headerFooterByPage )
|
||
|
{
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ )
|
||
|
{
|
||
|
if ( presSpeedChanged )
|
||
|
m_pageList.at(i)->setPageEffectSpeed( newValue );
|
||
|
m_pageList.at( i )->setHeader( m_loadingInfo->m_header );
|
||
|
m_pageList.at( i )->setFooter( m_loadingInfo->m_footer );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
delete m_loadingInfo;
|
||
|
m_loadingInfo = 0L;
|
||
|
|
||
|
}
|
||
|
|
||
|
void KPrDocument::enableEmbeddedParts( bool f )
|
||
|
{
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it )
|
||
|
it.current()->enableEmbeddedParts(f);
|
||
|
}
|
||
|
|
||
|
QDomDocumentFragment KPrDocument::saveBackground( QDomDocument &doc )
|
||
|
{
|
||
|
QDomDocumentFragment fragment=doc.createDocumentFragment();
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ ) {
|
||
|
if ( saveOnlyPage != -1 && i != saveOnlyPage )
|
||
|
continue;
|
||
|
fragment.appendChild( m_pageList.at(i)->save( doc ) );
|
||
|
}
|
||
|
// save backgound of masterpage only when the complete doc is saved
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{
|
||
|
fragment.appendChild( m_masterPage->save( doc ) );
|
||
|
}
|
||
|
return fragment;
|
||
|
}
|
||
|
|
||
|
QDomElement KPrDocument::saveObjects( QDomDocument &doc )
|
||
|
{
|
||
|
QDomElement objects=doc.createElement("OBJECTS");
|
||
|
double yoffset=0.0;
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ ) {
|
||
|
if ( saveOnlyPage != -1 && saveOnlyPage!=i)
|
||
|
continue;
|
||
|
yoffset=i*m_pageList.at(i)->getPageRect().height(); // yoffset is not zoom value !!
|
||
|
objects=m_pageList.at(i)->saveObjects( doc, objects, yoffset, saveOnlyPage );
|
||
|
|
||
|
}
|
||
|
if ( !_duplicatePage ) //don't copy objects on master slide when we duplicate page
|
||
|
{
|
||
|
objects = m_masterPage->saveObjects( doc, objects, 0.0, saveOnlyPage );
|
||
|
}
|
||
|
|
||
|
return objects;
|
||
|
}
|
||
|
|
||
|
QDomElement KPrDocument::saveTitle( QDomDocument &doc )
|
||
|
{
|
||
|
QDomElement titles=doc.createElement("PAGETITLES");
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
{ // All page titles.
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ )
|
||
|
{
|
||
|
QDomElement title=doc.createElement("Title");
|
||
|
title.setAttribute("title", m_pageList.at(i)->manualTitle());
|
||
|
titles.appendChild(title);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{ // Only current page title.
|
||
|
QDomElement title=doc.createElement("Title");
|
||
|
title.setAttribute("title", m_pageList.at(saveOnlyPage)->manualTitle());
|
||
|
titles.appendChild(title);
|
||
|
}
|
||
|
return titles;
|
||
|
}
|
||
|
|
||
|
QDomElement KPrDocument::saveNote( QDomDocument &doc )
|
||
|
{
|
||
|
QDomElement notes=doc.createElement("PAGENOTES");
|
||
|
|
||
|
if ( saveOnlyPage == -1 ) { // All page notes.
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ )
|
||
|
{
|
||
|
QDomElement note=doc.createElement("Note");
|
||
|
note.setAttribute("note", m_pageList.at(i)->noteText( ));
|
||
|
notes.appendChild(note);
|
||
|
}
|
||
|
}
|
||
|
else { // Only current page note.
|
||
|
QDomElement note=doc.createElement("Note");
|
||
|
note.setAttribute("note", m_pageList.at(saveOnlyPage)->noteText( ));
|
||
|
notes.appendChild(note);
|
||
|
}
|
||
|
|
||
|
return notes;
|
||
|
}
|
||
|
|
||
|
QDomElement KPrDocument::saveAttribute( QDomDocument &doc )
|
||
|
{
|
||
|
QDomElement attributes=doc.createElement("ATTRIBUTES");
|
||
|
//store first view parameter.
|
||
|
int activePage=0;
|
||
|
|
||
|
if ( m_initialActivePage )
|
||
|
activePage=m_pageList.findRef(m_initialActivePage);
|
||
|
activePage = QMAX( activePage, 0);
|
||
|
attributes.setAttribute("activePage",activePage );
|
||
|
attributes.setAttribute("gridx", m_gridX );
|
||
|
attributes.setAttribute("gridy", m_gridY );
|
||
|
attributes.setAttribute("snaptogrid", (int)m_bSnapToGrid );
|
||
|
return attributes;
|
||
|
}
|
||
|
|
||
|
QDomElement KPrDocument::saveUsedSoundFileToXML( QDomDocument &_doc, QStringList _list )
|
||
|
{
|
||
|
QDomElement soundFiles = _doc.createElement( "SOUNDS" );
|
||
|
|
||
|
unsigned int i = 0;
|
||
|
QStringList::Iterator it = _list.begin();
|
||
|
for ( ; it != _list.end(); ++it ) {
|
||
|
QString soundFileName = *it;
|
||
|
int position = soundFileName.findRev( '.' );
|
||
|
QString format = soundFileName.right( soundFileName.length() - position - 1 );
|
||
|
QString _name = QString( "sounds/sound%1.%2" ).arg( ++i ).arg( format.lower() );
|
||
|
|
||
|
QDomElement fileElem = _doc.createElement( "FILE" );
|
||
|
soundFiles.appendChild( fileElem );
|
||
|
fileElem.setAttribute( "filename", soundFileName );
|
||
|
fileElem.setAttribute( "name", _name );
|
||
|
}
|
||
|
|
||
|
return soundFiles;
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::completeSaving( KoStore* _store )
|
||
|
{
|
||
|
if ( !_store ) {
|
||
|
if ( saveOnlyPage == -1 ) {
|
||
|
emit sigProgress( 100 );
|
||
|
emit sigProgress( -1 );
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
m_pictureCollection.saveToStore( KoPictureCollection::CollectionPicture, _store, usedPictures );
|
||
|
|
||
|
saveUsedSoundFileToStore( _store, usedSoundFile );
|
||
|
|
||
|
if ( saveOnlyPage == -1 ) {
|
||
|
emit sigProgress( 100 );
|
||
|
emit sigProgress( -1 );
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
int KPrDocument::supportedSpecialFormats() const
|
||
|
{
|
||
|
return KoDocument::supportedSpecialFormats();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveUsedSoundFileToStore( KoStore *_store, QStringList _list )
|
||
|
{
|
||
|
unsigned int i = 0;
|
||
|
QStringList::Iterator it = _list.begin();
|
||
|
for ( ; it != _list.end(); ++it ) {
|
||
|
QString soundFileName = *it;
|
||
|
int position = soundFileName.findRev( '.' );
|
||
|
QString format = soundFileName.right( soundFileName.length() - position - 1 );
|
||
|
QString _storeURL = QString( "sounds/sound%1.%2" ).arg( ++i ).arg( format.lower() );
|
||
|
|
||
|
if ( _store->open( _storeURL ) ) {
|
||
|
KoStoreDevice dev( _store );
|
||
|
QFile _file( soundFileName );
|
||
|
if ( _file.open( IO_ReadOnly ) ) {
|
||
|
dev.writeBlock( ( _file.readAll() ).data(), _file.size() );
|
||
|
_file.close();
|
||
|
}
|
||
|
_store->close();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::loadChildren( KoStore* _store )
|
||
|
{
|
||
|
if ( objStartY == 0 && _clean) // Don't do this when inserting a template or a page...
|
||
|
{
|
||
|
QPtrListIterator<KoDocumentChild> it( children() );
|
||
|
for( ; it.current(); ++it ) {
|
||
|
if ( !((KoDocumentChild*)it.current())->loadDocument( _store ) )
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
else // instead load form the correct child on, m_childCountBeforeInsert has the be set
|
||
|
{
|
||
|
QPtrListIterator<KoDocumentChild> it( children() );
|
||
|
for( int i = 0; it.current(); ++it, ++i ) {
|
||
|
if ( i < m_childCountBeforeInsert )
|
||
|
continue;
|
||
|
if ( !((KoDocumentChild*)it.current())->loadDocument( _store ) )
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::saveOasis( KoStore* store, KoXmlWriter* manifestWriter )
|
||
|
{
|
||
|
|
||
|
//todo necessary for new format ?
|
||
|
if ( saveOnlyPage == -1 ) {
|
||
|
emit sigProgress( 0 );
|
||
|
}
|
||
|
if ( !store->open( "content.xml" ) )
|
||
|
return false;
|
||
|
m_pictureCollection.assignUniqueIds();
|
||
|
KoStoreDevice contentDev( store );
|
||
|
KoXmlWriter* contentWriter = createOasisXmlWriter( &contentDev, "office:document-content" );
|
||
|
|
||
|
|
||
|
m_varColl->variableSetting()->setModificationDate(QDateTime::currentDateTime());
|
||
|
recalcVariables( VT_DATE );
|
||
|
recalcVariables( VT_TIME );
|
||
|
recalcVariables( VT_STATISTIC );
|
||
|
KoGenStyles mainStyles;
|
||
|
KoSavingContext savingContext( mainStyles, 0, false, KoSavingContext::Store );
|
||
|
|
||
|
// Save user styles as KoGenStyle objects
|
||
|
m_styleColl->saveOasis( mainStyles, KoGenStyle::STYLE_USER, savingContext );
|
||
|
|
||
|
KTempFile contentTmpFile;
|
||
|
contentTmpFile.setAutoDelete( true );
|
||
|
QFile* tmpFile = contentTmpFile.file();
|
||
|
KoXmlWriter contentTmpWriter( tmpFile, 1 );
|
||
|
|
||
|
|
||
|
//For sticky objects
|
||
|
KTempFile stickyTmpFile;
|
||
|
stickyTmpFile.setAutoDelete( true );
|
||
|
QFile* masterStyles = stickyTmpFile.file();
|
||
|
KoXmlWriter stickyTmpWriter( masterStyles, 1 );
|
||
|
|
||
|
|
||
|
contentTmpWriter.startElement( "office:body" );
|
||
|
contentTmpWriter.startElement( "office:presentation" );
|
||
|
|
||
|
saveOasisCustomFied( contentTmpWriter );
|
||
|
|
||
|
int indexObj = 1;
|
||
|
int partIndexObj = 0;
|
||
|
//save page
|
||
|
|
||
|
QMap<QString, int> pageNames;
|
||
|
|
||
|
if ( !_duplicatePage )
|
||
|
{
|
||
|
m_masterPage->saveOasisPage( store, stickyTmpWriter, 0, savingContext, indexObj, partIndexObj, manifestWriter, pageNames );
|
||
|
|
||
|
// Now mark all autostyles as "for styles.xml" since headers/footers need them
|
||
|
QValueList<KoGenStyles::NamedStyle> autoStyles = mainStyles.styles( KoGenStyle::STYLE_AUTO );
|
||
|
for ( QValueList<KoGenStyles::NamedStyle>::const_iterator it = autoStyles.begin();
|
||
|
it != autoStyles.end(); ++it ) {
|
||
|
kdDebug() << "marking for styles.xml:" << ( *it ).name << endl;
|
||
|
mainStyles.markStyleForStylesXml( ( *it ).name );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( saveOnlyPage != -1 )
|
||
|
{
|
||
|
m_pageList.at( saveOnlyPage )->saveOasisPage( store, contentTmpWriter, ( saveOnlyPage+1 ), savingContext, indexObj, partIndexObj , manifestWriter, pageNames );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ )
|
||
|
{
|
||
|
m_pageList.at( i )->saveOasisPage( store, contentTmpWriter, ( i+1 ), savingContext, indexObj, partIndexObj , manifestWriter, pageNames );
|
||
|
}
|
||
|
}
|
||
|
if ( saveOnlyPage == -1 ) //don't save setting when we save on page
|
||
|
{
|
||
|
QMap<int, QString> page2name;
|
||
|
QMap<QString, int>::ConstIterator it( pageNames.begin() );
|
||
|
for ( ; it != pageNames.end(); ++it )
|
||
|
{
|
||
|
page2name.insert( it.data(), it.key() );
|
||
|
}
|
||
|
saveOasisPresentationSettings( contentTmpWriter, page2name );
|
||
|
}
|
||
|
|
||
|
contentTmpWriter.endElement(); //office:presentation
|
||
|
contentTmpWriter.endElement(); //office:body
|
||
|
|
||
|
writeAutomaticStyles( *contentWriter, mainStyles, savingContext, false );
|
||
|
|
||
|
// And now we can copy over the contents from the tempfile to the real one
|
||
|
tmpFile->close();
|
||
|
contentWriter->addCompleteElement( tmpFile );
|
||
|
contentTmpFile.close();
|
||
|
|
||
|
contentWriter->endElement(); // root element
|
||
|
contentWriter->endDocument();
|
||
|
delete contentWriter;
|
||
|
|
||
|
if ( !store->close() ) // done with content.xml
|
||
|
return false;
|
||
|
|
||
|
//add manifest line for content.xml
|
||
|
manifestWriter->addManifestEntry( "content.xml", "text/xml" );
|
||
|
|
||
|
if ( !store->open( "styles.xml" ) )
|
||
|
return false;
|
||
|
|
||
|
manifestWriter->addManifestEntry( "styles.xml", "text/xml" );
|
||
|
|
||
|
//todo fixme????
|
||
|
masterStyles->close();
|
||
|
saveOasisDocumentStyles( store, mainStyles, masterStyles, savingContext );
|
||
|
stickyTmpFile.close();
|
||
|
|
||
|
if ( !store->close() ) // done with styles.xml
|
||
|
return false;
|
||
|
|
||
|
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
emit sigProgress( 90 );
|
||
|
|
||
|
// Save sound file list.
|
||
|
//todo ????
|
||
|
|
||
|
|
||
|
makeUsedPixmapList();
|
||
|
|
||
|
m_pictureCollection.saveOasisToStore( store, usedPictures, manifestWriter);
|
||
|
|
||
|
if(!store->open("settings.xml"))
|
||
|
return false;
|
||
|
|
||
|
KoXmlWriter& settingsWriter = *createOasisXmlWriter(&contentDev, "office:document-settings");
|
||
|
settingsWriter.startElement("office:settings");
|
||
|
|
||
|
settingsWriter.startElement("config:config-item-set");
|
||
|
settingsWriter.addAttribute("config:name", "view-settings");
|
||
|
|
||
|
KoUnit::saveOasis(&settingsWriter, unit());
|
||
|
saveOasisSettings( settingsWriter );
|
||
|
|
||
|
settingsWriter.endElement(); // config:config-item-set
|
||
|
|
||
|
settingsWriter.startElement("config:config-item-set");
|
||
|
settingsWriter.addAttribute("config:name", "configuration-settings");
|
||
|
settingsWriter.addConfigItem("SpellCheckerIgnoreList", m_spellCheckIgnoreList.join( "," ) );
|
||
|
settingsWriter.addConfigItem("ShowPresentationDuration", _showPresentationDuration );
|
||
|
settingsWriter.endElement(); // config:config-item-set
|
||
|
|
||
|
m_varColl->variableSetting()->saveOasis( settingsWriter );
|
||
|
|
||
|
settingsWriter.endElement(); // office:settings
|
||
|
settingsWriter.endElement(); // Root:Element
|
||
|
settingsWriter.endDocument();
|
||
|
delete &settingsWriter;
|
||
|
|
||
|
if(!store->close())
|
||
|
return false;
|
||
|
|
||
|
manifestWriter->addManifestEntry("settings.xml", "text/xml");
|
||
|
|
||
|
//reset progressbar
|
||
|
emit sigProgress( 100 );
|
||
|
emit sigProgress( -1 );
|
||
|
|
||
|
setModified( false );
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveOasisCustomFied( KoXmlWriter &writer )const
|
||
|
{
|
||
|
bool customVariableFound = false;
|
||
|
QPtrListIterator<KoVariable> it( m_varColl->getVariables() );
|
||
|
for ( ; it.current() ; ++it )
|
||
|
{
|
||
|
if ( it.current()->type() == VT_CUSTOM )
|
||
|
{
|
||
|
if ( !customVariableFound )
|
||
|
{
|
||
|
writer.startElement( "text:user-field-decls" );
|
||
|
customVariableFound = true;
|
||
|
}
|
||
|
//<text:user-field-decl office:value-type="string" office:string-value="dfddd" text:name="cvbcbcbx"/>
|
||
|
writer.startElement( "text:user-field-decl" );
|
||
|
writer.addAttribute( "office:value-type", "string" );
|
||
|
writer.addAttribute( "office:string-value", static_cast<KoCustomVariable *>( it.current() )->value() );
|
||
|
writer.addAttribute( "text:name", static_cast<KoCustomVariable*>( it.current() )->name() );
|
||
|
writer.endElement();
|
||
|
}
|
||
|
}
|
||
|
if ( customVariableFound )
|
||
|
writer.endElement();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadOasisIgnoreList( const KoOasisSettings& settings )
|
||
|
{
|
||
|
KoOasisSettings::Items configurationSettings = settings.itemSet( "configuration-settings" );
|
||
|
if ( !configurationSettings.isNull() )
|
||
|
{
|
||
|
_showPresentationDuration = configurationSettings.parseConfigItemBool( "ShowPresentationDuration", false );
|
||
|
const QString ignorelist = configurationSettings.parseConfigItemString( "SpellCheckerIgnoreList" );
|
||
|
m_spellCheckIgnoreList = QStringList::split( ',', ignorelist );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::writeAutomaticStyles( KoXmlWriter& contentWriter, KoGenStyles& mainStyles, KoSavingContext& context, bool stylesDotXml )
|
||
|
{
|
||
|
if ( !stylesDotXml )
|
||
|
{
|
||
|
context.writeFontFaces( contentWriter );
|
||
|
contentWriter.startElement( "office:automatic-styles" );
|
||
|
}
|
||
|
QValueList<KoGenStyles::NamedStyle> styles = mainStyles.styles( KoGenStyle::STYLE_AUTO, stylesDotXml );
|
||
|
QValueList<KoGenStyles::NamedStyle>::const_iterator it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name, "style:paragraph-properties" );
|
||
|
}
|
||
|
|
||
|
styles = mainStyles.styles( KoGenStyle::STYLE_AUTO_LIST, stylesDotXml );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
( *it ).style->writeStyle( &contentWriter, mainStyles, "text:list-style", (*it).name, 0 );
|
||
|
}
|
||
|
|
||
|
styles = mainStyles.styles( STYLE_BACKGROUNDPAGEAUTO, stylesDotXml );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name, "style:drawing-page-properties" );
|
||
|
}
|
||
|
|
||
|
styles = mainStyles.styles( KoGenStyle::STYLE_GRAPHICAUTO, stylesDotXml );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name , "style:graphic-properties" );
|
||
|
}
|
||
|
|
||
|
styles = mainStyles.styles( KoGenStyle::STYLE_NUMERIC_DATE, stylesDotXml );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( &contentWriter, mainStyles, "number:date-style", (*it).name, 0 /*TODO ????*/ );
|
||
|
}
|
||
|
styles = mainStyles.styles( KoGenStyle::STYLE_NUMERIC_TIME, stylesDotXml );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( &contentWriter, mainStyles, "number:time-style", (*it).name, 0 /*TODO ????*/ );
|
||
|
}
|
||
|
|
||
|
if ( !stylesDotXml )
|
||
|
{
|
||
|
contentWriter.endElement(); // office:automatic-styles
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadOasisHeaderFooter(QDomNode & drawPage, KoOasisContext & context)
|
||
|
{
|
||
|
QDomNode tmp = KoDom::namedItemNS( drawPage, KoXmlNS::style, "header" );
|
||
|
if ( !tmp.isNull() )
|
||
|
{
|
||
|
//kdDebug()<<" there is a header \n";
|
||
|
_header->textObject()->loadOasisContent( tmp.toElement(), context, styleCollection() );
|
||
|
}
|
||
|
tmp = KoDom::namedItemNS( drawPage, KoXmlNS::style, "footer" );
|
||
|
if ( !tmp.isNull() )
|
||
|
{
|
||
|
//kdDebug()<<" there is a footer \n";
|
||
|
_footer->textObject()->loadOasisContent( tmp.toElement(), context, styleCollection() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveOasisSettings( KoXmlWriter &settingsWriter )
|
||
|
{
|
||
|
settingsWriter.startElement("config:config-item-map-indexed");
|
||
|
settingsWriter.addAttribute("config:name", "Views");
|
||
|
settingsWriter.startElement( "config:config-item-map-entry" );
|
||
|
|
||
|
//ooimpress save it as this line.
|
||
|
//<config:config-item config:name="SnapLinesDrawing" config:type="string">H2260V14397H7693H12415H15345H1424</config:config-item>
|
||
|
QString guideLinesOasis;
|
||
|
//save in mm as in oo
|
||
|
for( QValueList<double>::Iterator it = m_vGuideLines.begin(); it != m_vGuideLines.end(); ++it )
|
||
|
{
|
||
|
int tmpX = ( int ) ( KoUnit::toMM( *it )*100 );
|
||
|
guideLinesOasis += "V" + QString::number( tmpX );
|
||
|
}
|
||
|
|
||
|
for( QValueList<double>::Iterator it = m_hGuideLines.begin(); it != m_hGuideLines.end(); ++it )
|
||
|
{
|
||
|
int tmpY = ( int ) ( KoUnit::toMM( *it )*100 );
|
||
|
guideLinesOasis += "H" + QString::number( tmpY );
|
||
|
}
|
||
|
if ( !guideLinesOasis.isEmpty() )
|
||
|
{
|
||
|
settingsWriter.addConfigItem( "SnapLinesDrawing", guideLinesOasis );
|
||
|
}
|
||
|
//<config:config-item config:name="IsSnapToGrid" config:type="boolean">false</config:config-item>
|
||
|
settingsWriter.addConfigItem( "IsSnapToGrid", m_bSnapToGrid );
|
||
|
|
||
|
//<config:config-item config:name="GridFineWidth" config:type="int">500</config:config-item>
|
||
|
settingsWriter.addConfigItem( "GridFineWidth", ( ( int ) ( KoUnit::toMM( ( m_gridX ) )*100 ) ) );
|
||
|
|
||
|
|
||
|
//<config:config-item config:name="GridFineHeight" config:type="int">500</config:config-item>
|
||
|
settingsWriter.addConfigItem( "GridFineHeight", ( ( int ) ( KoUnit::toMM( ( m_gridY ) )*100 ) ) );
|
||
|
|
||
|
//<config:config-item config:name="SelectedPage" config:type="short">3</config:config-item>
|
||
|
//store first view parameter.
|
||
|
int activePage=0;
|
||
|
if ( m_initialActivePage )
|
||
|
activePage=m_pageList.findRef(m_initialActivePage);
|
||
|
activePage = QMAX( activePage, 0);
|
||
|
settingsWriter.addConfigItem( "SelectedPage", activePage );
|
||
|
|
||
|
//not define into oo spec
|
||
|
settingsWriter.addConfigItem( "SnapLineIsVisible", showGuideLines() );
|
||
|
settingsWriter.endElement();
|
||
|
settingsWriter.endElement();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadOasisSettings(const QDomDocument&settingsDoc)
|
||
|
{
|
||
|
kdDebug(33001)<<"void KPrDocument::loadOasisSettings(const QDomDocument&settingsDoc)**********\n";
|
||
|
KoOasisSettings settings( settingsDoc );
|
||
|
KoOasisSettings::Items viewSettings = settings.itemSet( "view-settings" );
|
||
|
setUnit(KoUnit::unit(viewSettings.parseConfigItemString("unit")));
|
||
|
KoOasisSettings::IndexedMap viewMap = viewSettings.indexedMap( "Views" );
|
||
|
KoOasisSettings::Items firstView = viewMap.entry( 0 );
|
||
|
if ( !firstView.isNull() )
|
||
|
{
|
||
|
parseOasisGuideLines( firstView.parseConfigItemString( "SnapLinesDrawing" ) );
|
||
|
setShowGuideLines( firstView.parseConfigItemBool( "SnapLineIsVisible" ) );
|
||
|
int valx = firstView.parseConfigItemInt( "GridFineWidth" );
|
||
|
m_gridX = MM_TO_POINT( valx / 100.0 );
|
||
|
int valy = firstView.parseConfigItemInt( "GridFineHeight" );
|
||
|
m_gridY = MM_TO_POINT( valy / 100.0 );
|
||
|
|
||
|
m_bSnapToGrid = firstView.parseConfigItemBool( "IsSnapToGrid" );
|
||
|
|
||
|
int activePage = firstView.parseConfigItemInt( "SelectedPage" );
|
||
|
kdDebug(33001)<<" activePage :"<<activePage<<endl;
|
||
|
if(activePage!=-1)
|
||
|
m_initialActivePage=m_pageList.at(activePage);
|
||
|
}
|
||
|
loadOasisIgnoreList( settings );
|
||
|
m_varColl->variableSetting()->loadOasis( settings );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::parseOasisGuideLines( const QString &text )
|
||
|
{
|
||
|
QString str;
|
||
|
int newPos = text.length()-1; //start to element = 1
|
||
|
for ( int pos = text.length()-1; pos >=0;--pos )
|
||
|
{
|
||
|
if ( text[pos]=='V' )
|
||
|
{
|
||
|
//vertical element
|
||
|
str = text.mid( pos+1, ( newPos-pos ) );
|
||
|
//kdDebug()<<" vertical :"<< str <<endl;
|
||
|
double posX = ( str.toInt() / 100.0 );
|
||
|
m_vGuideLines.append( MM_TO_POINT( posX ) );
|
||
|
newPos = pos-1;
|
||
|
}
|
||
|
else if ( text[pos]=='H' )
|
||
|
{
|
||
|
//horizontal element
|
||
|
str = text.mid( pos+1, ( newPos-pos ) );
|
||
|
//kdDebug()<<" horizontal :"<< str <<endl;
|
||
|
double posY = ( str.toInt() / 100.0 );
|
||
|
m_hGuideLines.append( MM_TO_POINT( posY ) );
|
||
|
newPos = pos-1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadOasisPresentationSettings( QDomNode &settingsDoc )
|
||
|
{
|
||
|
//kdDebug()<<"presentation:settings ********************************************* \n";
|
||
|
QDomElement settings( settingsDoc.toElement() );
|
||
|
//kdDebug()<<"settings.attribute(presentation:endless) :"<<settings.attributeNS( KoXmlNS::presentation, "endless", QString::null)<<endl;
|
||
|
if (settings.attributeNS( KoXmlNS::presentation, "endless", QString::null)=="true")
|
||
|
_spInfiniteLoop = true;
|
||
|
if (settings.attributeNS( KoXmlNS::presentation, "show-end-of-presentation-slide", QString::null)=="true")
|
||
|
_spShowEndOfPresentationSlide = true;
|
||
|
if (settings.attributeNS( KoXmlNS::presentation, "force-manual", QString::null)=="true")
|
||
|
_spManualSwitch = true;
|
||
|
if ( settings.hasAttributeNS( KoXmlNS::presentation, "start-page" ) )
|
||
|
{
|
||
|
//TODO allow to start presentation to specific page
|
||
|
//???? = settings.attributeNS( KoXmlNS::presentation, "start-page", QString::null );
|
||
|
}
|
||
|
if ( settings.hasAttributeNS( KoXmlNS::presentation, "show" ) )
|
||
|
{
|
||
|
m_presentationName = settings.attributeNS( KoXmlNS::presentation, "show", QString::null );
|
||
|
kdDebug()<<" default presentation name :"<<m_presentationName<<endl;
|
||
|
}
|
||
|
loadOasisPresentationCustomSlideShow( settingsDoc );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadOasisPresentationCustomSlideShow( QDomNode &settingsDoc )
|
||
|
{
|
||
|
//kdDebug()<<"void KPrDocument::loadOasisPresentationCustomSlideShow( QDomNode &settingsDoc )**********\n";
|
||
|
for ( QDomNode element = settingsDoc.firstChild(); !element.isNull(); element = element.nextSibling() )
|
||
|
{
|
||
|
QDomElement e = element.toElement();
|
||
|
QCString tagName = e.tagName().latin1();
|
||
|
//kdDebug()<<" tagName :"<<tagName<<endl;
|
||
|
if ( tagName == "show" && e.namespaceURI() == KoXmlNS::presentation )
|
||
|
{
|
||
|
//kdDebug()<<" e.attribute(presentation:name) :"<<e.attributeNS( KoXmlNS::presentation, "name", QString::null)<< " e.attribute(presentation:pages) :"<<e.attributeNS( KoXmlNS::presentation, "pages", QString::null)<<endl;
|
||
|
QString name = e.attributeNS( KoXmlNS::presentation, "name", QString::null );
|
||
|
QStringList tmp = QStringList::split( ",", e.attributeNS( KoXmlNS::presentation, "pages", QString::null) );
|
||
|
QValueList<KPrPage *> pageList;
|
||
|
for ( QStringList::Iterator it = tmp.begin(); it != tmp.end(); ++it )
|
||
|
{
|
||
|
if ( m_loadingInfo->m_name2page.contains( *it ) )
|
||
|
{
|
||
|
kdDebug(33001) << "slide show " << name << " page = " << *it << endl;
|
||
|
pageList.push_back( m_loadingInfo->m_name2page[*it] );
|
||
|
}
|
||
|
}
|
||
|
if ( ! pageList.empty() )
|
||
|
{
|
||
|
m_customListSlideShow.insert( name, pageList );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveOasisPresentationSettings( KoXmlWriter &contentTmpWriter, QMap<int, QString> &page2name )
|
||
|
{
|
||
|
//todo don't save when is not value by default (check with oo)
|
||
|
//FIXME
|
||
|
contentTmpWriter.startElement( "presentation:settings" );
|
||
|
contentTmpWriter.addAttribute( "presentation:endless", ( _spInfiniteLoop ? "true" : "false" ) );
|
||
|
contentTmpWriter.addAttribute( "presentation:show-end-of-presentation-slide", ( _spShowEndOfPresentationSlide ? "true" : "false" ) );
|
||
|
contentTmpWriter.addAttribute( "presentation:force-manual", ( _spManualSwitch ? "true" : "false" ) );
|
||
|
//add for default presentation
|
||
|
if ( !m_presentationName.isEmpty() )
|
||
|
contentTmpWriter.addAttribute( "presentation:show", m_presentationName );
|
||
|
|
||
|
saveOasisPresentationCustomSlideShow( contentTmpWriter, page2name );
|
||
|
contentTmpWriter.endElement();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveOasisPresentationCustomSlideShow( KoXmlWriter &contentTmpWriter, QMap<int, QString> &page2name )
|
||
|
{
|
||
|
if ( m_customListSlideShow.isEmpty() )
|
||
|
return;
|
||
|
|
||
|
CustomSlideShowMap::Iterator it;
|
||
|
for ( it = m_customListSlideShow.begin(); it != m_customListSlideShow.end(); ++it )
|
||
|
{
|
||
|
contentTmpWriter.startElement( "presentation:show" );
|
||
|
contentTmpWriter.addAttribute( "presentation:name", it.key() );
|
||
|
QString tmp;
|
||
|
QValueListIterator<KPrPage*> itPage ;
|
||
|
for( itPage = ( *it ).begin(); itPage != ( *it ).end(); ++itPage )
|
||
|
{
|
||
|
int posPage = m_pageList.find(*itPage );
|
||
|
if ( posPage != -1 )
|
||
|
{
|
||
|
if ( itPage != ( *it ).begin() )
|
||
|
tmp += ",";
|
||
|
//tmp+=( *itPage )->oasisNamePage(posPage+1)+",";
|
||
|
tmp += page2name[posPage + 1];
|
||
|
}
|
||
|
}
|
||
|
contentTmpWriter.addAttribute( "presentation:pages", tmp );
|
||
|
contentTmpWriter.endElement();
|
||
|
}
|
||
|
//<presentation:show presentation:name="New Custom Slide Show" presentation:pages="page1,page1,page1,page1,page1"/>
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveOasisDocumentStyles( KoStore* store, KoGenStyles& mainStyles, QFile* masterStyles,
|
||
|
KoSavingContext & savingContext, SaveFlag saveFlag ) const
|
||
|
{
|
||
|
KoStoreDevice stylesDev( store );
|
||
|
KoXmlWriter* stylesWriter = createOasisXmlWriter( &stylesDev, "office:document-styles" );
|
||
|
|
||
|
// Yeah we need to save the same font faces in both content.xml and styles.xml...
|
||
|
savingContext.writeFontFaces( *stylesWriter );
|
||
|
|
||
|
stylesWriter->startElement( "office:styles" );
|
||
|
QValueList<KoGenStyles::NamedStyle> styles = mainStyles.styles( KoGenStyle::STYLE_USER );
|
||
|
QValueList<KoGenStyles::NamedStyle>::const_iterator it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "style:style", (*it).name, "style:paragraph-properties" );
|
||
|
}
|
||
|
styles = mainStyles.styles( KoGenStyle::STYLE_LIST );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "text:list-style", (*it).name, 0 );
|
||
|
}
|
||
|
styles = mainStyles.styles( KoGenStyle::STYLE_HATCH );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "draw:hatch", (*it).name, "style:graphic-properties" , true, true /*add draw:name*/);
|
||
|
}
|
||
|
styles = mainStyles.styles( STYLE_GRADIENT );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "draw:gradient", (*it).name, "style:graphic-properties" , true, true /*add draw:name*/);
|
||
|
}
|
||
|
|
||
|
styles = mainStyles.styles( STYLE_STROKE );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "draw:stroke-dash", (*it).name, "style:graphic-properties" , true, true /*add draw:name*/);
|
||
|
}
|
||
|
|
||
|
styles = mainStyles.styles( STYLE_MARKER );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "draw:marker", (*it).name, "style:graphic-properties" , true, true /*add draw:name*/);
|
||
|
}
|
||
|
styles = mainStyles.styles( STYLE_PICTURE );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "draw:fill-image", (*it).name, "style:image-properties" , true, true /*add draw:name*/);
|
||
|
}
|
||
|
|
||
|
stylesWriter->endElement(); // office:styles
|
||
|
|
||
|
if ( saveFlag == SaveAll )
|
||
|
{
|
||
|
stylesWriter->startElement( "office:automatic-styles" );
|
||
|
// this has to be the first
|
||
|
if ( masterStyles )
|
||
|
{
|
||
|
writeAutomaticStyles( *stylesWriter, mainStyles, savingContext, true );
|
||
|
}
|
||
|
|
||
|
styles = mainStyles.styles( STYLE_BACKGROUNDPAGE );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "style:style", (*it).name , "style:drawing-page-properties" );
|
||
|
}
|
||
|
|
||
|
// if there's more than one pagemaster we need to rethink all this
|
||
|
styles = mainStyles.styles( KoGenStyle::STYLE_PAGELAYOUT );
|
||
|
Q_ASSERT( styles.count() == 1 );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "style:page-layout", (*it).name, "style:page-layout-properties", false /*don't close*/ );
|
||
|
stylesWriter->endElement();
|
||
|
}
|
||
|
|
||
|
styles = mainStyles.styles( STYLE_PRESENTATIONSTICKYOBJECT );
|
||
|
it = styles.begin();
|
||
|
for ( ; it != styles.end() ; ++it ) {
|
||
|
//TODO fix me graphic-properties ???
|
||
|
(*it).style->writeStyle( stylesWriter, mainStyles, "style:style", (*it).name , "style:graphic-properties" );
|
||
|
}
|
||
|
|
||
|
stylesWriter->endElement(); // office:automatic-styles
|
||
|
|
||
|
|
||
|
if ( masterStyles )
|
||
|
{
|
||
|
stylesWriter->startElement( "office:master-styles" );
|
||
|
stylesWriter->addCompleteElement( masterStyles );
|
||
|
stylesWriter->endElement();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
stylesWriter->endElement(); // root element (office:document-styles)
|
||
|
stylesWriter->endDocument();
|
||
|
delete stylesWriter;
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::loadOasis( const QDomDocument& doc, KoOasisStyles&oasisStyles, const QDomDocument&settingsDoc, KoStore*store )
|
||
|
{
|
||
|
QTime dt;
|
||
|
dt.start();
|
||
|
m_loadingInfo = new KPrLoadingInfo;
|
||
|
ignoreSticky = FALSE;
|
||
|
emit sigProgress( 0 );
|
||
|
|
||
|
lastObj = -1;
|
||
|
// clean
|
||
|
if ( _clean ) {
|
||
|
m_styleColl->clear();
|
||
|
// Some simple import filters don't define any style,
|
||
|
// so let's have a Standard style at least
|
||
|
KoParagStyle * standardStyle = new KoParagStyle( "Standard" ); // This gets translated later on
|
||
|
//kdDebug() << "KWDocument::KWDocument creating standardStyle " << standardStyle << endl;
|
||
|
standardStyle->format().setFont( m_defaultFont );
|
||
|
m_styleColl->addStyle( standardStyle );
|
||
|
|
||
|
__pgLayout = KoPageLayout::standardLayout();
|
||
|
_spInfiniteLoop = false;
|
||
|
_spShowEndOfPresentationSlide = true;
|
||
|
_spManualSwitch = true;
|
||
|
_showPresentationDuration = false;
|
||
|
_xRnd = 20;
|
||
|
_yRnd = 20;
|
||
|
urlIntern = url().path();
|
||
|
}
|
||
|
else
|
||
|
m_spellCheckIgnoreList.clear();
|
||
|
emit sigProgress( 5 );
|
||
|
|
||
|
QDomElement content = doc.documentElement();
|
||
|
QDomElement realBody (KoDom::namedItemNS( content, KoXmlNS::office, "body" ) );
|
||
|
if ( realBody.isNull() )
|
||
|
{
|
||
|
kdError(33001) << "No office:body found!" << endl;
|
||
|
setErrorMessage( i18n( "Invalid OASIS OpenDocument file. No office:body tag found." ) );
|
||
|
return false;
|
||
|
}
|
||
|
QDomElement body = KoDom::namedItemNS( realBody, KoXmlNS::office, "presentation" );
|
||
|
if ( body.isNull() )
|
||
|
{
|
||
|
kdError(33001) << "No office:presentation found!" << endl;
|
||
|
QDomElement childElem;
|
||
|
QString localName;
|
||
|
forEachElement( childElem, realBody ) {
|
||
|
localName = childElem.localName();
|
||
|
}
|
||
|
if ( localName.isEmpty() )
|
||
|
setErrorMessage( i18n( "Invalid OASIS OpenDocument file. No tag found inside office:body." ) );
|
||
|
else
|
||
|
setErrorMessage( i18n( "This document is not a presentation, but a %1. Please try opening it with the appropriate application." ).arg( KoDocument::tagNameToDocumentType( localName ) ) );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// it seems that ooimpress has different paper-settings for every slide.
|
||
|
// we take the settings of the first slide for the whole document.
|
||
|
QDomNode drawPage = KoDom::namedItemNS( body, KoXmlNS::draw, "page" );
|
||
|
if ( drawPage.isNull() ) // no slides? give up.
|
||
|
return false;
|
||
|
QDomElement dp = drawPage.toElement();
|
||
|
|
||
|
//code from kword
|
||
|
// TODO variable settings
|
||
|
// By default display real variable value
|
||
|
if ( !isReadWrite())
|
||
|
getVariableCollection()->variableSetting()->setDisplayFieldCode(false);
|
||
|
|
||
|
KoOasisContext context( this, *m_varColl, oasisStyles, store );
|
||
|
Q_ASSERT( !oasisStyles.officeStyle().isNull() );
|
||
|
|
||
|
// Load all styles before the corresponding paragraphs try to use them!
|
||
|
m_styleColl->loadOasisStyles( context );
|
||
|
|
||
|
// if we only copy a page we have no master
|
||
|
// also don't copy master when you insert file as long as we don't have multiple masters
|
||
|
if ( !m_pageWhereLoadObject && _clean )
|
||
|
{
|
||
|
QString masterPageName = drawPage.toElement().attributeNS( KoXmlNS::draw, "master-page-name", QString::null );
|
||
|
QDomElement *master = oasisStyles.masterPages()[ masterPageName];
|
||
|
|
||
|
kdDebug()<<" master :"<<master<<endl;
|
||
|
kdDebug()<<" masterPageName:"<<masterPageName<<endl;
|
||
|
if ( ! master )
|
||
|
{
|
||
|
masterPageName = "Standard"; // use default layout as fallback (default in kpresenter)
|
||
|
master = oasisStyles.masterPages()[ masterPageName];
|
||
|
if ( !master ) //last test...
|
||
|
master = oasisStyles.masterPages()["Default"];
|
||
|
}
|
||
|
|
||
|
if ( master == 0 )
|
||
|
{
|
||
|
setErrorMessage( i18n( "Invalid OASIS OpenDocument file. No master-style found inside office:master-styles." ) );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
kdDebug()<<" load oasis master styles\n";
|
||
|
QDomNode node = *master;
|
||
|
QDomElement masterElement = node.toElement();
|
||
|
kdDebug()<<" node.isNull() :"<<node.isNull()<< ", " << masterElement.attributeNS( KoXmlNS::draw, "style-name", QString::null ) << endl;
|
||
|
// add the correct styles
|
||
|
const QDomElement* masterPageStyle = context.oasisStyles().findStyleAutoStyle( masterElement.attributeNS( KoXmlNS::draw, "style-name", QString::null ), "drawing-page" );
|
||
|
if (masterPageStyle)
|
||
|
context.styleStack().push( *masterPageStyle );
|
||
|
|
||
|
context.setUseStylesAutoStyles( true );
|
||
|
m_masterPage->loadOasis( context );
|
||
|
|
||
|
createPresentationAnimation( KoDom::namedItemNS( node, KoXmlNS::presentation, "animations"));
|
||
|
|
||
|
loadOasisObject( m_masterPage, node , context);
|
||
|
|
||
|
m_loadingInfo->clearAnimationShowDict(); // clear all show animations style
|
||
|
m_loadingInfo->clearAnimationHideDict(); // clear all hide animations style
|
||
|
|
||
|
loadOasisHeaderFooter( node,context );
|
||
|
context.setUseStylesAutoStyles( false );
|
||
|
|
||
|
kdDebug()<<" end load oasis master style \n";
|
||
|
|
||
|
Q_ASSERT( master );
|
||
|
const QDomElement *style = master ? oasisStyles.findStyle(master->attributeNS( KoXmlNS::style, "page-layout-name", QString::null )) : 0;
|
||
|
const QDomElement *backgroundStyle = oasisStyles.findStyle( "Standard-background", "presentation" );
|
||
|
kdDebug()<<"Standard background "<<backgroundStyle<<endl;
|
||
|
// parse all pages
|
||
|
Q_ASSERT( style );
|
||
|
if ( style )
|
||
|
{
|
||
|
__pgLayout.loadOasis( *style );
|
||
|
kdDebug()<<"Page size __pgLayout.ptWidth :"<<__pgLayout.ptWidth<<" __pgLayout.ptHeight :"<<__pgLayout.ptHeight<<endl;
|
||
|
kdDebug()<<"Page orientation :"<<(( __pgLayout.orientation== PG_LANDSCAPE )? " landscape " : " portrait ")<<endl;
|
||
|
|
||
|
kdDebug()<<" margin right:"<< __pgLayout.ptRight <<" __pgLayout.ptBottom :"<<__pgLayout.ptBottom<<" __pgLayout.ptLeft :"<<__pgLayout.ptLeft<<" __pgLayout.ptTop :"<<__pgLayout.ptTop<<endl;
|
||
|
}
|
||
|
if ( _clean )
|
||
|
{
|
||
|
/// ### this has already been done, no?
|
||
|
setPageLayout( __pgLayout );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int pos = m_insertFilePage;
|
||
|
for ( drawPage = body.firstChild(); !drawPage.isNull(); drawPage = drawPage.nextSibling() )
|
||
|
{
|
||
|
dp = drawPage.toElement();
|
||
|
kdDebug()<<"dp.tagName() :"<<dp.tagName()<<endl;
|
||
|
if ( dp.tagName()== "page" && dp.namespaceURI() == KoXmlNS::draw ) // don't try to parse "</draw:page>" as page
|
||
|
{
|
||
|
context.styleStack().clear(); // remove all styles
|
||
|
fillStyleStack( dp, context, "drawing-page" );
|
||
|
context.styleStack().save();
|
||
|
kdDebug ()<<"insert new page "<<pos<<endl;
|
||
|
KPrPage *newpage = 0L;
|
||
|
if ( m_pageWhereLoadObject )
|
||
|
{
|
||
|
newpage = m_pageWhereLoadObject;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( pos != 0 )
|
||
|
{
|
||
|
newpage = new KPrPage( this, m_masterPage );
|
||
|
m_pageList.insert( pos,newpage);
|
||
|
}
|
||
|
else //we create a first page into KPrDocument()
|
||
|
{
|
||
|
newpage = m_pageList.at(pos);
|
||
|
}
|
||
|
}
|
||
|
//only set the manual title if it is different to the draw:id. Only in this case it had one.
|
||
|
QString str = dp.attributeNS( KoXmlNS::draw, "name", QString::null );
|
||
|
m_loadingInfo->m_name2page.insert( str, newpage );
|
||
|
QString idPage = dp.attributeNS( KoXmlNS::draw, "id", QString::null );
|
||
|
|
||
|
if ( dp.hasAttributeNS( KoXmlNS::koffice, "name" ) )
|
||
|
{
|
||
|
str = dp.attributeNS( KoXmlNS::koffice, "name", QString::null );
|
||
|
newpage->insertManualTitle(str);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// OO uses /page[0-9]+$/ as default for no name set
|
||
|
QRegExp rx( "^page[0-9]+$" );
|
||
|
if ( rx.search( str ) == -1 )
|
||
|
newpage->insertManualTitle(str);
|
||
|
}
|
||
|
context.styleStack().setTypeProperties( "drawing-page" );
|
||
|
|
||
|
newpage->loadOasis( context );
|
||
|
|
||
|
//All animation object for current page is store into this element
|
||
|
createPresentationAnimation(KoDom::namedItemNS( drawPage, KoXmlNS::presentation, "animations"));
|
||
|
// parse all objects
|
||
|
loadOasisObject( newpage, drawPage, context );
|
||
|
|
||
|
context.styleStack().restore();
|
||
|
m_loadingInfo->clearAnimationShowDict(); // clear all show animations style
|
||
|
m_loadingInfo->clearAnimationHideDict(); // clear all hide animations style
|
||
|
++pos;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//load settings at the end as we need to know what the draw:name of a page is
|
||
|
QDomNode settings = KoDom::namedItemNS( body, KoXmlNS::presentation, "settings" );
|
||
|
kdDebug()<<"settings :"<<settings.isNull()<<endl;
|
||
|
if (!settings.isNull() && _clean /*don't load settings when we copy/paste a page*/)
|
||
|
loadOasisPresentationSettings( settings );
|
||
|
|
||
|
ignoreSticky = TRUE;
|
||
|
kdDebug()<<" _clean :"<<_clean<<endl;
|
||
|
if(_clean)
|
||
|
{
|
||
|
setModified(false);
|
||
|
#if 0 //FIXME
|
||
|
//it crashed, I don't know why for the moment.
|
||
|
startBackgroundSpellCheck();
|
||
|
#endif
|
||
|
}
|
||
|
kdDebug(33001) << "Loading took " << (float)(dt.elapsed()) / 1000.0 << " seconds" << endl;
|
||
|
|
||
|
if ( !settingsDoc.isNull() )
|
||
|
{
|
||
|
loadOasisSettings( settingsDoc );
|
||
|
}
|
||
|
|
||
|
// set the initial active page
|
||
|
if ( m_initialActivePage == 0 )
|
||
|
{
|
||
|
m_initialActivePage = m_pageList.at( 0 );
|
||
|
}
|
||
|
|
||
|
emit sigProgress( 100 );
|
||
|
recalcVariables( VT_ALL );
|
||
|
emit sigProgress( -1 );
|
||
|
|
||
|
setModified( false );
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
void KPrDocument::loadOasisObject( KPrPage * newpage, QDomNode & drawPage, KoOasisContext & context, KPrGroupObject *groupObject )
|
||
|
{
|
||
|
for ( QDomNode object = drawPage.firstChild(); !object.isNull(); object = object.nextSibling() )
|
||
|
{
|
||
|
QDomElement o = object.toElement();
|
||
|
QString name = o.tagName();
|
||
|
if ( !name.isEmpty() )
|
||
|
{
|
||
|
kdDebug()<<" name :"<<name<<endl;
|
||
|
if ( o.hasAttributeNS( KoXmlNS::presentation, "placeholder" ) &&
|
||
|
o.attributeNS( KoXmlNS::presentation, "placeholder", QString::null ) == "true" )
|
||
|
{
|
||
|
kdDebug(33001) << "Placeholder" << endl;
|
||
|
continue;
|
||
|
}
|
||
|
context.styleStack().save();
|
||
|
const bool isDrawNS = o.namespaceURI() == KoXmlNS::draw;
|
||
|
// draw:frame
|
||
|
if ( name == "frame" && isDrawNS )
|
||
|
{
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
QDomElement elem;
|
||
|
forEachElement( elem, o )
|
||
|
{
|
||
|
if ( elem.namespaceURI() != KoXmlNS::draw )
|
||
|
continue;
|
||
|
const QString localName = elem.localName();
|
||
|
if ( localName == "text-box" )
|
||
|
{
|
||
|
KPrTextObject *kptextobject = new KPrTextObject( this );
|
||
|
kptextobject->loadOasis(o, context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kptextobject );
|
||
|
else
|
||
|
newpage->appendObject(kptextobject);
|
||
|
break;
|
||
|
}
|
||
|
else if ( localName == "image" )
|
||
|
{
|
||
|
KPrPixmapObject *kppixmapobject = new KPrPixmapObject( pictureCollection() );
|
||
|
kppixmapobject->loadOasis( o, context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kppixmapobject );
|
||
|
else
|
||
|
newpage->appendObject(kppixmapobject);
|
||
|
break;
|
||
|
}
|
||
|
else if ( localName == "object" )
|
||
|
{
|
||
|
KPrChild *ch = new KPrChild( this );
|
||
|
QRect r;
|
||
|
KPrPartObject *kppartobject = new KPrPartObject( ch );
|
||
|
kppartobject->loadOasis( o, context, m_loadingInfo );
|
||
|
r = ch->geometry();
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kppartobject );
|
||
|
else
|
||
|
newpage->appendObject(kppartobject);
|
||
|
insertChild( ch );
|
||
|
kppartobject->setOrig( r.x(), r.y() );
|
||
|
kppartobject->setSize( r.width(), r.height() );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if ( name == "rect" && isDrawNS) // rectangle
|
||
|
{
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
KPrRectObject *kprectobject = new KPrRectObject();
|
||
|
kprectobject->loadOasis(o, context , m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kprectobject );
|
||
|
else
|
||
|
newpage->appendObject(kprectobject);
|
||
|
}
|
||
|
else if ( ( name == "circle" || name == "ellipse" )&& isDrawNS)
|
||
|
{
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
if ( o.hasAttributeNS( KoXmlNS::draw, "kind" ) ) // pie, chord or arc
|
||
|
{
|
||
|
KPrPieObject *kppieobject = new KPrPieObject();
|
||
|
kppieobject->loadOasis(o, context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kppieobject );
|
||
|
else
|
||
|
newpage->appendObject(kppieobject);
|
||
|
}
|
||
|
else // circle or ellipse
|
||
|
{
|
||
|
KPrEllipseObject *kpellipseobject = new KPrEllipseObject();
|
||
|
kpellipseobject->loadOasis(o,context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpellipseobject );
|
||
|
else
|
||
|
newpage->appendObject(kpellipseobject);
|
||
|
}
|
||
|
}
|
||
|
else if ( name == "line" && isDrawNS) // line
|
||
|
{
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
KPrLineObject *kplineobject = new KPrLineObject();
|
||
|
kplineobject->loadOasis(o, context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kplineobject );
|
||
|
else
|
||
|
newpage->appendObject( kplineobject );
|
||
|
}
|
||
|
else if (name=="polyline" && isDrawNS) { // polyline
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
KPrPolylineObject *kppolylineobject = new KPrPolylineObject();
|
||
|
kppolylineobject->loadOasis(o, context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kppolylineobject );
|
||
|
else
|
||
|
newpage->appendObject(kppolylineobject);
|
||
|
}
|
||
|
else if (name=="polygon" && isDrawNS) { // plcloseobject
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
KPrClosedLineObject *kpClosedObject = new KPrClosedLineObject();
|
||
|
kpClosedObject->loadOasis( o, context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpClosedObject );
|
||
|
else
|
||
|
newpage->appendObject(kpClosedObject);
|
||
|
}
|
||
|
else if (name=="regular-polygon"&& isDrawNS) { // kppolygone object
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
KPrPolygonObject *kpPolygoneObject = new KPrPolygonObject();
|
||
|
kpPolygoneObject->loadOasis( o, context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpPolygoneObject );
|
||
|
else
|
||
|
newpage->appendObject(kpPolygoneObject);
|
||
|
}
|
||
|
else if ( name == "path" && isDrawNS)
|
||
|
{
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
QString d = o.attributeNS( KoXmlNS::svg, "d", QString::null);
|
||
|
|
||
|
KPrSVGPathParser parser;
|
||
|
ObjType objType = parser.getType( d );
|
||
|
|
||
|
switch ( objType )
|
||
|
{
|
||
|
case OT_CUBICBEZIERCURVE:
|
||
|
{
|
||
|
kdDebug(33001) << "Cubicbeziercurve" << endl;
|
||
|
KPrCubicBezierCurveObject *kpCurveObject = new KPrCubicBezierCurveObject();
|
||
|
kpCurveObject->loadOasis( o, context, m_loadingInfo );
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpCurveObject );
|
||
|
else
|
||
|
newpage->appendObject( kpCurveObject );
|
||
|
} break;
|
||
|
case OT_QUADRICBEZIERCURVE:
|
||
|
{
|
||
|
kdDebug(33001) << "Quadricbeziercurve" << endl;
|
||
|
KPrQuadricBezierCurveObject *kpQuadricObject = new KPrQuadricBezierCurveObject();
|
||
|
kpQuadricObject->loadOasis( o, context, m_loadingInfo );
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpQuadricObject );
|
||
|
else
|
||
|
newpage->appendObject( kpQuadricObject );
|
||
|
} break;
|
||
|
case OT_FREEHAND:
|
||
|
{
|
||
|
kdDebug(33001) << "Freehand" << endl;
|
||
|
KPrFreehandObject *kpFreeHandObject = new KPrFreehandObject();
|
||
|
kpFreeHandObject->loadOasis( o, context, m_loadingInfo );
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpFreeHandObject );
|
||
|
else
|
||
|
newpage->appendObject( kpFreeHandObject );
|
||
|
} break;
|
||
|
case OT_CLOSED_LINE:
|
||
|
{
|
||
|
kdDebug(33001) << "Closed Line" << endl;
|
||
|
KPrClosedLineObject *kpClosedObject = new KPrClosedLineObject();
|
||
|
kpClosedObject->loadOasis( o, context, m_loadingInfo );
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpClosedObject );
|
||
|
else
|
||
|
newpage->appendObject( kpClosedObject );
|
||
|
} break;
|
||
|
default:
|
||
|
kdDebug(33001) << "draw:path found unsupported object type " << objType << " in svg:d " << d << endl;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else if ( name == "custom-shape" && isDrawNS )
|
||
|
{
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
|
||
|
QDomElement enhancedGeometry = KoDom::namedItemNS( o, KoXmlNS::draw, "enhanced-geometry" );
|
||
|
|
||
|
if ( !enhancedGeometry.isNull() )
|
||
|
{
|
||
|
QString d = enhancedGeometry.attributeNS( KoXmlNS::draw, "enhanced-path", QString::null );
|
||
|
QRegExp rx( "^([0-9 ML]+Z) N$" );
|
||
|
if ( rx.search( d ) != -1 )
|
||
|
{
|
||
|
d = rx.cap( 1 );
|
||
|
KPrSVGPathParser parser;
|
||
|
ObjType objType = parser.getType( d );
|
||
|
|
||
|
switch ( objType )
|
||
|
{
|
||
|
#if 0 // not yet supported
|
||
|
case OT_CUBICBEZIERCURVE:
|
||
|
{
|
||
|
kdDebug(33001) << "Cubicbeziercurve" << endl;
|
||
|
KPrCubicBezierCurveObject *kpCurveObject = new KPrCubicBezierCurveObject();
|
||
|
kpCurveObject->loadOasis( o, context, m_loadingInfo );
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpCurveObject );
|
||
|
else
|
||
|
newpage->appendObject( kpCurveObject );
|
||
|
} break;
|
||
|
case OT_QUADRICBEZIERCURVE:
|
||
|
{
|
||
|
kdDebug(33001) << "Quadricbeziercurve" << endl;
|
||
|
KPrQuadricBezierCurveObject *kpQuadricObject = new KPrQuadricBezierCurveObject();
|
||
|
kpQuadricObject->loadOasis( o, context, m_loadingInfo );
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpQuadricObject );
|
||
|
else
|
||
|
newpage->appendObject( kpQuadricObject );
|
||
|
} break;
|
||
|
case OT_FREEHAND:
|
||
|
{
|
||
|
kdDebug(33001) << "Freehand" << endl;
|
||
|
KPrFreehandObject *kpFreeHandObject = new KPrFreehandObject();
|
||
|
kpFreeHandObject->loadOasis( o, context, m_loadingInfo );
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpFreeHandObject );
|
||
|
else
|
||
|
newpage->appendObject( kpFreeHandObject );
|
||
|
} break;
|
||
|
#endif
|
||
|
case OT_CLOSED_LINE:
|
||
|
{
|
||
|
kdDebug(33001) << "Closed Line" << endl;
|
||
|
KPrClosedLineObject *kpClosedObject = new KPrClosedLineObject();
|
||
|
kpClosedObject->loadOasis( o, context, m_loadingInfo );
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpClosedObject );
|
||
|
else
|
||
|
newpage->appendObject( kpClosedObject );
|
||
|
} break;
|
||
|
default:
|
||
|
kdDebug(33001) << "draw:custom-shape found unsupported object type " << objType << " in draw:enhanced-path " << d << endl;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
kdDebug(33001) << "draw:custom-shape not supported" << endl;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if ( name == "g" && isDrawNS)
|
||
|
{
|
||
|
fillStyleStack( o, context, "graphic" );
|
||
|
KPrGroupObject *kpgroupobject = new KPrGroupObject();
|
||
|
QDomNode nodegroup = object.firstChild();
|
||
|
|
||
|
kpgroupobject->loadOasisGroupObject( this, newpage, object, context, m_loadingInfo);
|
||
|
if ( groupObject )
|
||
|
groupObject->addObjects( kpgroupobject );
|
||
|
else
|
||
|
newpage->appendObject(kpgroupobject);
|
||
|
}
|
||
|
else if ( name == "notes" && o.namespaceURI() == KoXmlNS::presentation ) // notes
|
||
|
{
|
||
|
//we must extend note attribute
|
||
|
//kdDebug()<<"presentation:notes----------------------------------\n";
|
||
|
QDomNode frameBox = KoDom::namedItemNS( o, KoXmlNS::draw, "frame" );
|
||
|
QString note;
|
||
|
|
||
|
while ( !frameBox.isNull() )
|
||
|
{
|
||
|
//add an empty line between the different frames
|
||
|
if ( !note.isEmpty() )
|
||
|
note += "\n";
|
||
|
|
||
|
//todo load layout for note.
|
||
|
QDomNode textBox = KoDom::namedItemNS( frameBox, KoXmlNS::draw, "text-box" );
|
||
|
|
||
|
if ( !textBox.isNull() )
|
||
|
{
|
||
|
for ( QDomNode text = textBox.firstChild(); !text.isNull(); text = text.nextSibling() )
|
||
|
{
|
||
|
// We don't care about styles as they are not supported in kpresenter.
|
||
|
// Only add a linebreak for every child.
|
||
|
QDomElement t = text.toElement();
|
||
|
if ( t.tagName() == "p" )
|
||
|
{
|
||
|
note += t.text() + "\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
frameBox = frameBox.nextSibling();
|
||
|
}
|
||
|
newpage->setNoteText( note );
|
||
|
}
|
||
|
else if ( ( name == "header" || name == "footer" ) && o.namespaceURI() == KoXmlNS::style ||
|
||
|
( name == "animations" && o.namespaceURI() == KoXmlNS::presentation) )
|
||
|
{
|
||
|
//nothing
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
kdDebug() << "Unsupported object '" << name << "'" << endl;
|
||
|
}
|
||
|
context.styleStack().restore();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
int KPrDocument::createPresentationAnimation(const QDomElement& element, int order, bool increaseOrder)
|
||
|
{
|
||
|
kdDebug()<<"void KPrDocument::createPresentationAnimation(const QDomElement& element)\n";
|
||
|
int orderAnimation = increaseOrder ? 0 : order;
|
||
|
for ( QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling() )
|
||
|
{
|
||
|
QDomElement e = n.toElement();
|
||
|
QCString tagName = e.tagName().latin1();
|
||
|
if ( ! tagName.isEmpty() ) // only tags that open
|
||
|
{
|
||
|
const bool isPresentationNS = e.namespaceURI() == KoXmlNS::presentation;
|
||
|
if ( isPresentationNS &&
|
||
|
( tagName == "show-shape" || tagName == "hide-shape" ) )
|
||
|
{
|
||
|
Q_ASSERT( e.hasAttributeNS( KoXmlNS::draw, "shape-id" ) );
|
||
|
QString name = e.attributeNS( KoXmlNS::draw, "shape-id", QString::null );
|
||
|
kdDebug()<<" insert animation " << tagName << " name :" << name << endl;
|
||
|
|
||
|
if ( e.hasAttributeNS( KoXmlNS::koffice, "order-id" ) )
|
||
|
{
|
||
|
orderAnimation = e.attributeNS( KoXmlNS::koffice, "order-id", QString::null ).toInt();
|
||
|
}
|
||
|
|
||
|
lstAnimation *tmp = new lstAnimation;
|
||
|
tmp->element = new QDomElement( e );
|
||
|
tmp->order = orderAnimation;
|
||
|
if ( tagName == "show-shape" )
|
||
|
{
|
||
|
m_loadingInfo->storePresentationShowAnimation( tmp, name );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_loadingInfo->storePresentationHideAnimation( tmp, name );
|
||
|
}
|
||
|
if ( increaseOrder )
|
||
|
++orderAnimation;
|
||
|
}
|
||
|
else if ( tagName == "animation-group" && isPresentationNS )
|
||
|
{
|
||
|
orderAnimation = createPresentationAnimation( e, orderAnimation, false );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//increase when we finish it necessary for group object
|
||
|
++orderAnimation;
|
||
|
return orderAnimation;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::fillStyleStack( const QDomElement& object, KoOasisContext & context, const char* family )
|
||
|
{
|
||
|
// See OpenDoc 9.2.15 Common Drawing Shape Attributes
|
||
|
// presentation:style-name is allways family presentation
|
||
|
if ( object.hasAttributeNS( KoXmlNS::presentation, "style-name" ))
|
||
|
{
|
||
|
context.fillStyleStack( object, KoXmlNS::presentation, "style-name", "presentation" );
|
||
|
}
|
||
|
if ( object.hasAttributeNS( KoXmlNS::draw, "style-name" ) )
|
||
|
{
|
||
|
context.fillStyleStack( object, KoXmlNS::draw, "style-name", family );
|
||
|
}
|
||
|
// draw:tex-style-name is allways family paragraph
|
||
|
if ( object.hasAttributeNS( KoXmlNS::draw, "text-style-name" ) )
|
||
|
{
|
||
|
context.fillStyleStack( object, KoXmlNS::draw, "text-style-name", "paragraph" );
|
||
|
}
|
||
|
if ( object.hasAttributeNS( KoXmlNS::text, "style-name" ) )
|
||
|
{
|
||
|
context.fillStyleStack( object, KoXmlNS::text, "style-name", family );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::loadXML( QIODevice * dev, const QDomDocument& doc )
|
||
|
{
|
||
|
QTime dt;
|
||
|
dt.start();
|
||
|
m_loadingInfo = new KPrLoadingInfo( true );
|
||
|
|
||
|
ignoreSticky = FALSE;
|
||
|
bool b=false;
|
||
|
QDomElement docelem = doc.documentElement();
|
||
|
const int syntaxVersion = docelem.attribute( "syntaxVersion" ).toInt();
|
||
|
if ( syntaxVersion < 2 )
|
||
|
{
|
||
|
// This is an old style document, before the current TextObject
|
||
|
// We have kprconverter.pl for it
|
||
|
kdWarning(33001) << "KPresenter document version 1. Launching perl script to convert it." << endl;
|
||
|
|
||
|
// Read the full XML and write it to a temp file
|
||
|
KTempFile tmpFileIn;
|
||
|
tmpFileIn.setAutoDelete( true );
|
||
|
dev->reset();
|
||
|
tmpFileIn.file()->writeBlock( dev->readAll() ); // copy stresm to temp file
|
||
|
tmpFileIn.close();
|
||
|
|
||
|
// Launch the perl script on it
|
||
|
KTempFile tmpFileOut;
|
||
|
tmpFileOut.setAutoDelete( true );
|
||
|
QString cmd = KGlobal::dirs()->findExe("perl");
|
||
|
if (cmd.isEmpty())
|
||
|
{
|
||
|
setErrorMessage( i18n("You don't appear to have PERL installed.\nIt is needed to convert this document.\nPlease install PERL and try again."));
|
||
|
return false;
|
||
|
}
|
||
|
cmd += " ";
|
||
|
cmd += locate( "exe", "kprconverter.pl" );
|
||
|
cmd += " ";
|
||
|
cmd += KProcess::quote( tmpFileIn.name() );
|
||
|
cmd += " ";
|
||
|
cmd += KProcess::quote( tmpFileOut.name() );
|
||
|
system( QFile::encodeName(cmd) );
|
||
|
|
||
|
// Build a new QDomDocument from the result
|
||
|
QString errorMsg;
|
||
|
int errorLine;
|
||
|
int errorColumn;
|
||
|
QDomDocument newdoc;
|
||
|
if ( ! newdoc.setContent( tmpFileOut.file(), &errorMsg, &errorLine, &errorColumn ) )
|
||
|
{
|
||
|
kdError (33001) << "Parsing Error! Aborting! (in KPrDocument::loadXML)" << endl
|
||
|
<< " Line: " << errorLine << " Column: " << errorColumn << endl
|
||
|
<< " Message: " << errorMsg << endl;
|
||
|
setErrorMessage( i18n( "parsing error in the main document (converted from an old KPresenter format) at line %1, column %2\nError message: %3" )
|
||
|
.arg( errorLine ).arg( errorColumn ).arg( i18n ( errorMsg.utf8() ) ) );
|
||
|
return false;
|
||
|
}
|
||
|
b = loadXML( newdoc );
|
||
|
}
|
||
|
else
|
||
|
b = loadXML( doc );
|
||
|
|
||
|
ignoreSticky = TRUE;
|
||
|
|
||
|
if(_clean)
|
||
|
{
|
||
|
startBackgroundSpellCheck();
|
||
|
}
|
||
|
if ( m_pageWhereLoadObject == 0 && m_insertFilePage == 0 )
|
||
|
setModified( false );
|
||
|
kdDebug(33001) << "Loading took " << (float)(dt.elapsed()) / 1000.0 << " seconds" << endl;
|
||
|
return b;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::createHeaderFooter()
|
||
|
{
|
||
|
//add header/footer to sticky page
|
||
|
KoRect pageRect=m_masterPage->getPageRect();
|
||
|
_header->setOrig(pageRect.topLeft());
|
||
|
_header->setSize(pageRect.width(),20);
|
||
|
|
||
|
_footer->setOrig(pageRect.left(),pageRect.bottom()-20);
|
||
|
_footer->setSize(pageRect.width(),20);
|
||
|
|
||
|
m_masterPage->appendObject(_header);
|
||
|
m_masterPage->appendObject(_footer);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::insertEmbedded( KoStore *store, QDomElement topElem, KMacroCommand * macroCmd, KPrPage *page, int pos )
|
||
|
{
|
||
|
QDomElement elem = topElem.firstChild().toElement();
|
||
|
for ( ; !elem.isNull() ; elem = elem.nextSibling().toElement() )
|
||
|
{
|
||
|
kdDebug(33001) << "Element name: " << elem.tagName() << endl;
|
||
|
if(elem.tagName()=="EMBEDDED") {
|
||
|
KPrChild *ch = new KPrChild( this );
|
||
|
KPrPartObject *kppartobject = 0L;
|
||
|
QRect r;
|
||
|
|
||
|
QDomElement object=elem.namedItem("OBJECT").toElement();
|
||
|
if(!object.isNull()) {
|
||
|
ch->load(object, true); // true == uppercase
|
||
|
r = ch->geometry();
|
||
|
ch->loadDocument( store );
|
||
|
insertChild( ch );
|
||
|
kppartobject = new KPrPartObject( ch );
|
||
|
}
|
||
|
QDomElement settings=elem.namedItem("SETTINGS").toElement();
|
||
|
int zIndex = 0;
|
||
|
if ( settings.hasAttribute( "z-index" ) )
|
||
|
{
|
||
|
zIndex = settings.attribute( "z-index" ).toInt();
|
||
|
}
|
||
|
double offset = 0.0;
|
||
|
if(!settings.isNull() && kppartobject!=0)
|
||
|
offset=kppartobject->load(settings);
|
||
|
else if ( settings.isNull() ) // all embedded obj must have SETTING tags
|
||
|
{
|
||
|
delete kppartobject;
|
||
|
kppartobject = 0L;
|
||
|
return;
|
||
|
}
|
||
|
int index = m_pageList.findRef(page);
|
||
|
int pageIndex = (int)(offset/__pgLayout.ptHeight)+index;
|
||
|
int newPos=(int)((offset+index*__pgLayout.ptHeight)-pageIndex*__pgLayout.ptHeight);
|
||
|
kppartobject->setOrig(kppartobject->getOrig().x(),newPos);
|
||
|
|
||
|
KPrInsertCmd *insertCmd = new KPrInsertCmd( i18n( "Insert Part Object" ), kppartobject, this,page );
|
||
|
insertCmd->execute();
|
||
|
if ( !macroCmd )
|
||
|
macroCmd = new KMacroCommand( i18n("Insert Part Object"));
|
||
|
macroCmd->addCommand( insertCmd );
|
||
|
if ( pos != 0 )
|
||
|
{
|
||
|
const QPtrList<KPrObject>& oldList( page->objectList() );
|
||
|
// tz TODO this is not 100% correct
|
||
|
if ( static_cast<int>( oldList.count() ) > pos + zIndex )
|
||
|
{
|
||
|
page->takeObject( kppartobject );
|
||
|
page->insertObject( kppartobject, pos + zIndex );
|
||
|
KPrLowerRaiseCmd *lrCmd = new KPrLowerRaiseCmd( i18n("Insert Part Object"),
|
||
|
oldList, page->objectList(),
|
||
|
this, page );
|
||
|
macroCmd->addCommand( lrCmd );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::loadXML( const QDomDocument &doc )
|
||
|
{
|
||
|
emit sigProgress( 0 );
|
||
|
int activePage=0;
|
||
|
lastObj = -1;
|
||
|
bool allSlides = false;
|
||
|
// clean
|
||
|
if ( _clean ) {
|
||
|
__pgLayout = KoPageLayout::standardLayout();
|
||
|
_spInfiniteLoop = false;
|
||
|
_spShowEndOfPresentationSlide = true;
|
||
|
_spManualSwitch = true;
|
||
|
_showPresentationDuration = false;
|
||
|
_xRnd = 20;
|
||
|
_yRnd = 20;
|
||
|
//_txtBackCol = white;
|
||
|
urlIntern = url().path();
|
||
|
}
|
||
|
else
|
||
|
m_spellCheckIgnoreList.clear();
|
||
|
emit sigProgress( 5 );
|
||
|
|
||
|
QDomElement document=doc.documentElement();
|
||
|
// DOC
|
||
|
if(document.tagName()!="DOC") {
|
||
|
kdWarning(33001) << "Missing DOC" << endl;
|
||
|
setErrorMessage( i18n("Invalid document, DOC tag missing.") );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if(!document.hasAttribute("mime") || (
|
||
|
document.attribute("mime")!="application/x-kpresenter" &&
|
||
|
document.attribute("mime")!="application/vnd.kde.kpresenter" ) ) {
|
||
|
kdError(33001) << "Unknown mime type " << document.attribute("mime") << endl;
|
||
|
setErrorMessage( i18n("Invalid document, expected mimetype application/x-kpresenter or application/vnd.kde.kpresenter, got %1").arg(document.attribute("mime")) );
|
||
|
return false;
|
||
|
}
|
||
|
if(document.hasAttribute("url"))
|
||
|
urlIntern=KURL(document.attribute("url")).path();
|
||
|
|
||
|
emit sigProgress( 10 );
|
||
|
|
||
|
QDomElement elem=document.firstChild().toElement();
|
||
|
|
||
|
uint childTotalCount=document.childNodes().count();
|
||
|
uint childCount = 0;
|
||
|
|
||
|
loadTextStyle( document );
|
||
|
|
||
|
while(!elem.isNull()) {
|
||
|
kdDebug(33001) << "Element name: " << elem.tagName() << endl;
|
||
|
if(elem.tagName()=="EMBEDDED") {
|
||
|
KPrChild *ch = new KPrChild( this );
|
||
|
KPrPartObject *kppartobject = 0L;
|
||
|
QRect r;
|
||
|
|
||
|
QDomElement object=elem.namedItem("OBJECT").toElement();
|
||
|
if(!object.isNull()) {
|
||
|
ch->load(object, true); // true == uppercase
|
||
|
r = ch->geometry();
|
||
|
insertChild( ch );
|
||
|
kppartobject = new KPrPartObject( ch );
|
||
|
//emit sig_insertObject( ch, kppartobject );
|
||
|
}
|
||
|
QDomElement settings=elem.namedItem("SETTINGS").toElement();
|
||
|
int tmp=0;
|
||
|
int pos = -1;
|
||
|
if ( settings.hasAttribute( "z-index" ) )
|
||
|
{
|
||
|
pos = settings.attribute( "z-index" ).toInt();
|
||
|
}
|
||
|
if(settings.hasAttribute("sticky"))
|
||
|
tmp=settings.attribute("sticky").toInt();
|
||
|
bool sticky=static_cast<bool>(tmp);
|
||
|
double offset = 0.0;
|
||
|
if(!settings.isNull() && kppartobject!=0)
|
||
|
{
|
||
|
offset=kppartobject->load(settings);
|
||
|
}
|
||
|
else if ( settings.isNull() ) // all embedded obj must have SETTING tags
|
||
|
{
|
||
|
delete kppartobject;
|
||
|
kppartobject = 0L;
|
||
|
}
|
||
|
//hack for some old file, they don't have ORIG tag !
|
||
|
if ( offset == -1.0 )
|
||
|
offset = r.y();
|
||
|
if ( sticky && !ignoreSticky && kppartobject )
|
||
|
{
|
||
|
if ( pos == -1 )
|
||
|
{
|
||
|
m_masterPage->appendObject( kppartobject );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_masterPage->insertObject( kppartobject, pos );
|
||
|
}
|
||
|
kppartobject->setOrig(kppartobject->getOrig().x(), offset);
|
||
|
}
|
||
|
else if ( kppartobject ) {
|
||
|
if ( m_pageWhereLoadObject )
|
||
|
{
|
||
|
kppartobject->setOrig(kppartobject->getOrig().x(), offset);
|
||
|
m_pageWhereLoadObject->insertObject( kppartobject, pos );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
insertObjectInPage( offset, kppartobject, pos );
|
||
|
}
|
||
|
}
|
||
|
} else if(elem.tagName()=="PAPER" && _clean) {
|
||
|
if(elem.hasAttribute("format"))
|
||
|
__pgLayout.format=static_cast<KoFormat>(elem.attribute("format").toInt());
|
||
|
if(elem.hasAttribute("orientation"))
|
||
|
__pgLayout.orientation=static_cast<KoOrientation>(elem.attribute("orientation").toInt());
|
||
|
if(elem.hasAttribute("ptWidth"))
|
||
|
__pgLayout.ptWidth = elem.attribute("ptWidth").toDouble();
|
||
|
else if(elem.hasAttribute("inchWidth")) //compatibility
|
||
|
__pgLayout.ptWidth = INCH_TO_POINT( elem.attribute("inchWidth").toDouble() );
|
||
|
else if(elem.hasAttribute("mmWidth")) //compatibility
|
||
|
__pgLayout.ptWidth = MM_TO_POINT( elem.attribute("mmWidth").toDouble() );
|
||
|
if(elem.hasAttribute("ptHeight"))
|
||
|
__pgLayout.ptHeight = elem.attribute("ptHeight").toDouble();
|
||
|
else if(elem.hasAttribute("inchHeight")) //compatibility
|
||
|
__pgLayout.ptHeight = INCH_TO_POINT( elem.attribute("inchHeight").toDouble() );
|
||
|
else if(elem.hasAttribute("mmHeight")) //compatibility
|
||
|
__pgLayout.ptHeight = MM_TO_POINT( elem.attribute("mmHeight").toDouble() );
|
||
|
if(elem.hasAttribute("unit"))
|
||
|
setUnit( static_cast<KoUnit::Unit>(elem.attribute("unit").toInt()) );
|
||
|
if ( elem.hasAttribute("tabStopValue"))
|
||
|
m_tabStop = elem.attribute("tabStopValue").toDouble();
|
||
|
|
||
|
if(elem.hasAttribute("width"))
|
||
|
__pgLayout.ptWidth = MM_TO_POINT( elem.attribute("width").toDouble() );
|
||
|
if(elem.hasAttribute("height"))
|
||
|
__pgLayout.ptHeight = MM_TO_POINT( elem.attribute("height").toDouble() );
|
||
|
|
||
|
QDomElement borders=elem.namedItem("PAPERBORDERS").toElement();
|
||
|
if(!borders.isNull()) {
|
||
|
if(borders.hasAttribute("left"))
|
||
|
__pgLayout.ptLeft = MM_TO_POINT( borders.attribute("left").toDouble() );
|
||
|
if(borders.hasAttribute("top"))
|
||
|
__pgLayout.ptTop = MM_TO_POINT( borders.attribute("top").toDouble() );
|
||
|
if(borders.hasAttribute("right"))
|
||
|
__pgLayout.ptRight = MM_TO_POINT( borders.attribute("right").toDouble() );
|
||
|
if(borders.hasAttribute("bottom"))
|
||
|
__pgLayout.ptBottom = MM_TO_POINT( borders.attribute("bottom").toDouble() );
|
||
|
if(borders.hasAttribute("ptLeft"))
|
||
|
__pgLayout.ptLeft = borders.attribute("ptLeft").toDouble();
|
||
|
else if(borders.hasAttribute("inchLeft")) //compatibility
|
||
|
__pgLayout.ptLeft = INCH_TO_POINT( borders.attribute("inchLeft").toDouble() );
|
||
|
else if(borders.hasAttribute("mmLeft")) //compatibility
|
||
|
__pgLayout.ptLeft = MM_TO_POINT( borders.attribute("mmLeft").toDouble() );
|
||
|
if(borders.hasAttribute("ptRight"))
|
||
|
__pgLayout.ptRight = borders.attribute("ptRight").toDouble();
|
||
|
else if(borders.hasAttribute("inchRight")) //compatibility
|
||
|
__pgLayout.ptRight = INCH_TO_POINT( borders.attribute("inchRight").toDouble() );
|
||
|
else if(borders.hasAttribute("mmRight")) //compatibility
|
||
|
__pgLayout.ptRight = MM_TO_POINT( borders.attribute("mmRight").toDouble() );
|
||
|
if(borders.hasAttribute("ptTop"))
|
||
|
__pgLayout.ptTop = borders.attribute("ptTop").toDouble();
|
||
|
else if(borders.hasAttribute("inchTop")) //compatibility
|
||
|
__pgLayout.ptTop = INCH_TO_POINT( borders.attribute("inchTop").toDouble() );
|
||
|
else if(borders.hasAttribute("mmTop")) //compatibility
|
||
|
__pgLayout.ptTop = MM_TO_POINT( borders.attribute("mmTop").toDouble() );
|
||
|
if(borders.hasAttribute("ptBottom"))
|
||
|
__pgLayout.ptBottom = borders.attribute("ptBottom").toDouble();
|
||
|
else if(borders.hasAttribute("inchBottom")) //compatibility
|
||
|
__pgLayout.ptBottom = INCH_TO_POINT( borders.attribute("inchBottom").toDouble() );
|
||
|
else if(borders.hasAttribute("mmBottom")) //compatibility
|
||
|
__pgLayout.ptBottom = MM_TO_POINT( borders.attribute("inchBottom").toDouble() );
|
||
|
}
|
||
|
// PAPER found and parsed -> apply page layout
|
||
|
// e.g. the text objects need it
|
||
|
if ( _clean )
|
||
|
setPageLayout( __pgLayout );
|
||
|
|
||
|
} else if(elem.tagName()=="VARIABLESETTINGS" && _clean){
|
||
|
getVariableCollection()->variableSetting()->load(document);
|
||
|
//by default display real variable value
|
||
|
if ( !isReadWrite())
|
||
|
getVariableCollection()->variableSetting()->setDisplayFieldCode(false);
|
||
|
|
||
|
}
|
||
|
else if(elem.tagName()=="BACKGROUND") {
|
||
|
int red=0, green=0, blue=0;
|
||
|
if(elem.hasAttribute("xRnd"))
|
||
|
_xRnd = elem.attribute("xRnd").toInt();
|
||
|
if(elem.hasAttribute("yRnd"))
|
||
|
_yRnd = elem.attribute("yRnd").toInt();
|
||
|
if(elem.hasAttribute("bred"))
|
||
|
red = elem.attribute("bred").toInt();
|
||
|
if(elem.hasAttribute("bgreen"))
|
||
|
green = elem.attribute("bgreen").toInt();
|
||
|
if(elem.hasAttribute("bblue"))
|
||
|
blue = elem.attribute("bblue").toInt();
|
||
|
loadBackground(elem);
|
||
|
} else if(elem.tagName()=="HEADER") {
|
||
|
if ( _clean /*don't reload header footer, header/footer was created at the beginning || !hasHeader()*/ ) {
|
||
|
if(elem.hasAttribute("show")) {
|
||
|
setHeader(static_cast<bool>(elem.attribute("show").toInt()));
|
||
|
}
|
||
|
_header->load(elem);
|
||
|
}
|
||
|
} else if ( elem.tagName()=="HEADERFOOTERBYPAGE" ) {
|
||
|
if ( elem.hasAttribute( "value" ) ) {
|
||
|
m_loadingInfo->m_headerFooterByPage = true;
|
||
|
}
|
||
|
} else if(elem.tagName()=="FOOTER") {
|
||
|
if ( _clean /*|| !hasFooter()*/ ) {
|
||
|
if(elem.hasAttribute("show")) {
|
||
|
setFooter( static_cast<bool>(elem.attribute("show").toInt() ) );
|
||
|
}
|
||
|
_footer->load(elem);
|
||
|
}
|
||
|
}else if( elem.tagName()=="HELPLINES"){
|
||
|
if ( _clean ) {
|
||
|
if(elem.hasAttribute("show")) {
|
||
|
setShowGuideLines( static_cast<bool>(elem.attribute("show").toInt() ) );
|
||
|
}
|
||
|
loadGuideLines( elem );
|
||
|
}
|
||
|
}else if( elem.tagName()=="SPELLCHECKIGNORELIST"){
|
||
|
QDomElement spellWord=elem.toElement();
|
||
|
spellWord=spellWord.firstChild().toElement();
|
||
|
while ( !spellWord.isNull() )
|
||
|
{
|
||
|
if ( spellWord.tagName()=="SPELLCHECKIGNOREWORD" )
|
||
|
{
|
||
|
m_spellCheckIgnoreList.append(spellWord.attribute("word"));
|
||
|
}
|
||
|
spellWord=spellWord.nextSibling().toElement();
|
||
|
}
|
||
|
}else if(elem.tagName()=="ATTRIBUTES" && _clean) {
|
||
|
if(elem.hasAttribute("activePage"))
|
||
|
activePage=elem.attribute("activePage").toInt();
|
||
|
if(elem.hasAttribute("gridx"))
|
||
|
m_gridX = elem.attribute("gridx").toDouble();
|
||
|
if(elem.hasAttribute("gridy"))
|
||
|
m_gridY = elem.attribute("gridy").toDouble();
|
||
|
if(elem.hasAttribute("snaptogrid"))
|
||
|
m_bSnapToGrid = (bool)elem.attribute("snaptogrid").toInt();
|
||
|
} else if(elem.tagName()=="PAGETITLES") {
|
||
|
loadTitle(elem);
|
||
|
} else if(elem.tagName()=="PAGENOTES") {
|
||
|
loadNote(elem);
|
||
|
} else if(elem.tagName()=="OBJECTS") {
|
||
|
//FIXME**********************
|
||
|
#if 0
|
||
|
lastObj = _objectList->count() - 1;
|
||
|
#endif
|
||
|
//don't add command we don't paste object
|
||
|
KCommand * cmd =loadObjects(elem);
|
||
|
if ( cmd )
|
||
|
delete cmd;
|
||
|
} else if(elem.tagName()=="INFINITLOOP") {
|
||
|
if(_clean) {
|
||
|
if(elem.hasAttribute("value"))
|
||
|
_spInfiniteLoop = static_cast<bool>(elem.attribute("value").toInt());
|
||
|
}
|
||
|
} else if(elem.tagName()=="SHOWENDOFPRESENTATIONSLIDE") {
|
||
|
if(_clean) {
|
||
|
if(elem.hasAttribute("value"))
|
||
|
_spShowEndOfPresentationSlide = static_cast<bool>(elem.attribute("value").toInt());
|
||
|
}
|
||
|
} else if(elem.tagName()=="PRESSPEED") {
|
||
|
if(_clean) {
|
||
|
if(elem.hasAttribute("value"))
|
||
|
m_loadingInfo->presSpeed = elem.attribute("value").toInt();
|
||
|
}
|
||
|
} else if(elem.tagName()=="MANUALSWITCH") {
|
||
|
if(_clean) {
|
||
|
if(elem.hasAttribute("value"))
|
||
|
_spManualSwitch = static_cast<bool>(elem.attribute("value").toInt());
|
||
|
}
|
||
|
} else if(elem.tagName()=="SHOWPRESENTATIONDURATION") {
|
||
|
if(_clean) {
|
||
|
if(elem.hasAttribute("value"))
|
||
|
_showPresentationDuration = static_cast<bool>(elem.attribute("value").toInt());
|
||
|
}
|
||
|
} else if(elem.tagName()=="PRESSLIDES") {
|
||
|
if(elem.hasAttribute("value") && elem.attribute("value").toInt()==0)
|
||
|
allSlides = TRUE;
|
||
|
} else if ( elem.tagName()=="DEFAULTCUSTOMSLIDESHOWNAME" ) {
|
||
|
if(elem.hasAttribute("name") )
|
||
|
m_presentationName=elem.attribute( "name" );
|
||
|
} else if ( elem.tagName()=="CUSTOMSLIDESHOWCONFIG" ) {
|
||
|
if ( _clean ) {
|
||
|
QMap<QString, KPrPage *> name2page;
|
||
|
int pos = 1;
|
||
|
for ( QPtrListIterator<KPrPage> it( m_pageList ); it.current(); ++it )
|
||
|
{
|
||
|
name2page.insert( "page" + QString::number( pos++ ), it.current() ) ;
|
||
|
}
|
||
|
|
||
|
QDomElement slide=elem.firstChild().toElement();
|
||
|
while(!slide.isNull()) {
|
||
|
if(slide.tagName()=="CUSTOMSLIDESHOW") {
|
||
|
QStringList tmp = QStringList::split( ",", slide.attribute( "pages" ) );
|
||
|
QValueList<KPrPage *> pageList;
|
||
|
for ( QStringList::Iterator it = tmp.begin(); it != tmp.end(); ++it )
|
||
|
{
|
||
|
if ( name2page.contains( *it ) )
|
||
|
{
|
||
|
kdDebug(33001) << "slide show " << slide.attribute( "name" ) << " page = " << *it << endl;
|
||
|
pageList.push_back( name2page[*it] );
|
||
|
}
|
||
|
}
|
||
|
if ( ! pageList.empty() )
|
||
|
{
|
||
|
m_customListSlideShow.insert( slide.attribute( "name" ), pageList );
|
||
|
}
|
||
|
}
|
||
|
slide=slide.nextSibling().toElement();
|
||
|
}
|
||
|
}
|
||
|
} else if(elem.tagName()=="SELSLIDES") {
|
||
|
if( _clean ) { // Skip this when loading a single page
|
||
|
QDomElement slide=elem.firstChild().toElement();
|
||
|
while(!slide.isNull()) {
|
||
|
if(slide.tagName()=="SLIDE") {
|
||
|
int nr = -1;
|
||
|
bool show = false;
|
||
|
if(slide.hasAttribute("nr"))
|
||
|
nr=slide.attribute("nr").toInt();
|
||
|
if(slide.hasAttribute("show"))
|
||
|
show=static_cast<bool>(slide.attribute("show").toInt());
|
||
|
if ( nr >= 0 )
|
||
|
{
|
||
|
//kdDebug(33001) << "KPrDocument::loadXML m_selectedSlides nr=" << nr << " show=" << show << endl;
|
||
|
if ( nr > ( (int)m_pageList.count() - 1 ) )
|
||
|
{
|
||
|
for (int i=(m_pageList.count()-1); i<nr;i++)
|
||
|
m_pageList.append( new KPrPage( this, m_masterPage ) );
|
||
|
}
|
||
|
m_pageList.at(nr)->slideSelected(show);
|
||
|
} else kdWarning(33001) << "Parse error. No nr in <SLIDE> !" << endl;
|
||
|
}
|
||
|
slide=slide.nextSibling().toElement();
|
||
|
}
|
||
|
}
|
||
|
} else if ( elem.tagName() == "SOUNDS" ) {
|
||
|
loadUsedSoundFileFromXML( elem );
|
||
|
}
|
||
|
elem=elem.nextSibling().toElement();
|
||
|
|
||
|
emit sigProgress( childCount * ( 70/childTotalCount ) + 15 );
|
||
|
childCount += 1;
|
||
|
}
|
||
|
|
||
|
loadPictureMap( document );
|
||
|
|
||
|
if(activePage!=-1)
|
||
|
m_initialActivePage=m_pageList.at(activePage);
|
||
|
if ( m_pageWhereLoadObject == 0 && m_insertFilePage == 0 )
|
||
|
setModified(false);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadTextStyle( const QDomElement& domElement )
|
||
|
{
|
||
|
QDomElement style = domElement.namedItem( "STYLES" ).toElement();
|
||
|
if ( _clean && ! style.isNull() )
|
||
|
loadStyleTemplates( style );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadPictureMap ( const QDomElement& domElement )
|
||
|
{
|
||
|
m_pictureMap.clear();
|
||
|
|
||
|
// <PICTURES>
|
||
|
QDomElement picturesElem = domElement.namedItem( "PICTURES" ).toElement();
|
||
|
if ( !picturesElem.isNull() )
|
||
|
m_pictureCollection.readXML( picturesElem, m_pictureMap );
|
||
|
|
||
|
// <PIXMAPS>
|
||
|
QDomElement pixmapsElem = domElement.namedItem( "PIXMAPS" ).toElement();
|
||
|
if ( !pixmapsElem.isNull() )
|
||
|
m_pictureCollection.readXML( pixmapsElem, m_pictureMap );
|
||
|
|
||
|
// <CLIPARTS>
|
||
|
QDomElement clipartsElem = domElement.namedItem( "CLIPARTS" ).toElement();
|
||
|
if ( !clipartsElem.isNull() )
|
||
|
m_pictureCollection.readXML( pixmapsElem, m_pictureMap );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadBackground( const QDomElement &element )
|
||
|
{
|
||
|
kdDebug(33001) << "KPrDocument::loadBackground" << endl;
|
||
|
QDomElement page=element.firstChild().toElement();
|
||
|
int i=m_insertFilePage;
|
||
|
while(!page.isNull()) {
|
||
|
if(m_pageWhereLoadObject)
|
||
|
{
|
||
|
kdDebug(33001) << "m_pageWhereLoadObject->load(...)" << m_pageWhereLoadObject << endl;
|
||
|
m_pageWhereLoadObject->load(page);
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( page.tagName() == "MASTERPAGE" )
|
||
|
{
|
||
|
m_masterPage->load( page );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//test if there is a page at this index
|
||
|
//=> don't add new page if there is again a page
|
||
|
if ( i > ( (int)m_pageList.count() - 1 ) )
|
||
|
m_pageList.append( new KPrPage( this, m_masterPage ) );
|
||
|
m_pageList.at(i)->load(page);
|
||
|
i++;
|
||
|
}
|
||
|
}
|
||
|
page=page.nextSibling().toElement();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
KCommand *KPrDocument::loadObjects( const QDomElement &element, bool paste )
|
||
|
{
|
||
|
ObjType t = OT_LINE;
|
||
|
QDomElement obj=element.firstChild().toElement();
|
||
|
QValueList<KPrObject *> pasteObjects;
|
||
|
while(!obj.isNull()) {
|
||
|
if(obj.tagName()=="OBJECT" ) {
|
||
|
bool sticky=false;
|
||
|
int tmp=0;
|
||
|
if(obj.hasAttribute("type"))
|
||
|
tmp=obj.attribute("type").toInt();
|
||
|
t=static_cast<ObjType>(tmp);
|
||
|
tmp=0;
|
||
|
if(obj.hasAttribute("sticky"))
|
||
|
tmp=obj.attribute("sticky").toInt();
|
||
|
sticky=static_cast<bool>(tmp);
|
||
|
double offset=0;
|
||
|
switch ( t ) {
|
||
|
case OT_LINE: {
|
||
|
KPrLineObject *kplineobject = new KPrLineObject();
|
||
|
offset=kplineobject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kplineobject);
|
||
|
kplineobject->setOrig(kplineobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if (m_pageWhereLoadObject && paste) {
|
||
|
kplineobject->setOrig(kplineobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kplineobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kplineobject);
|
||
|
kplineobject->setOrig(kplineobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kplineobject);
|
||
|
} break;
|
||
|
case OT_RECT: {
|
||
|
KPrRectObject *kprectobject = new KPrRectObject();
|
||
|
offset=kprectobject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kprectobject);
|
||
|
kprectobject->setOrig(kprectobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if (m_pageWhereLoadObject && paste) {
|
||
|
kprectobject->setOrig(kprectobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kprectobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kprectobject);
|
||
|
kprectobject->setOrig(kprectobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kprectobject);
|
||
|
} break;
|
||
|
case OT_ELLIPSE: {
|
||
|
KPrEllipseObject *kpellipseobject = new KPrEllipseObject();
|
||
|
offset=kpellipseobject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kpellipseobject);
|
||
|
kpellipseobject->setOrig(kpellipseobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste)
|
||
|
{
|
||
|
kpellipseobject->setOrig(kpellipseobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kpellipseobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kpellipseobject);
|
||
|
kpellipseobject->setOrig(kpellipseobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kpellipseobject);
|
||
|
} break;
|
||
|
case OT_PIE: {
|
||
|
KPrPieObject *kppieobject = new KPrPieObject();
|
||
|
offset=kppieobject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kppieobject);
|
||
|
kppieobject->setOrig(kppieobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste) {
|
||
|
kppieobject->setOrig(kppieobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kppieobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kppieobject);
|
||
|
kppieobject->setOrig(kppieobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kppieobject);
|
||
|
} break;
|
||
|
case OT_AUTOFORM: {
|
||
|
KPrAutoformObject *kpautoformobject = new KPrAutoformObject();
|
||
|
offset=kpautoformobject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kpautoformobject);
|
||
|
kpautoformobject->setOrig(kpautoformobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject&& paste) {
|
||
|
kpautoformobject->setOrig(kpautoformobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kpautoformobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kpautoformobject);
|
||
|
kpautoformobject->setOrig(kpautoformobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kpautoformobject);
|
||
|
} break;
|
||
|
case OT_TEXT: {
|
||
|
KPrTextObject *kptextobject = new KPrTextObject( this );
|
||
|
offset=kptextobject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kptextobject);
|
||
|
kptextobject->setOrig(kptextobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste) {
|
||
|
kptextobject->setOrig(kptextobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kptextobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kptextobject);
|
||
|
kptextobject->setOrig(kptextobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kptextobject);
|
||
|
} break;
|
||
|
case OT_CLIPART:
|
||
|
case OT_PICTURE: {
|
||
|
KPrPixmapObject *kppixmapobject = new KPrPixmapObject( pictureCollection() );
|
||
|
offset=kppixmapobject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kppixmapobject);
|
||
|
kppixmapobject->setOrig(kppixmapobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste) {
|
||
|
kppixmapobject->setOrig(kppixmapobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kppixmapobject );
|
||
|
kppixmapobject->reload();
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kppixmapobject);
|
||
|
kppixmapobject->setOrig(kppixmapobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kppixmapobject);
|
||
|
} break;
|
||
|
case OT_FREEHAND: {
|
||
|
KPrFreehandObject *kpfreehandobject = new KPrFreehandObject();
|
||
|
offset=kpfreehandobject->load(obj);
|
||
|
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kpfreehandobject);
|
||
|
kpfreehandobject->setOrig(kpfreehandobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste) {
|
||
|
kpfreehandobject->setOrig(kpfreehandobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kpfreehandobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kpfreehandobject);
|
||
|
kpfreehandobject->setOrig(kpfreehandobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset,kpfreehandobject);
|
||
|
} break;
|
||
|
case OT_POLYLINE: {
|
||
|
KPrPolylineObject *kppolylineobject = new KPrPolylineObject();
|
||
|
offset=kppolylineobject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kppolylineobject);
|
||
|
kppolylineobject->setOrig(kppolylineobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if (m_pageWhereLoadObject && paste) {
|
||
|
kppolylineobject->setOrig(kppolylineobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kppolylineobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kppolylineobject);
|
||
|
kppolylineobject->setOrig(kppolylineobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kppolylineobject);
|
||
|
} break;
|
||
|
case OT_QUADRICBEZIERCURVE: {
|
||
|
KPrQuadricBezierCurveObject *kpQuadricBezierCurveObject = new KPrQuadricBezierCurveObject();
|
||
|
offset=kpQuadricBezierCurveObject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kpQuadricBezierCurveObject);
|
||
|
kpQuadricBezierCurveObject->setOrig(kpQuadricBezierCurveObject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste) {
|
||
|
kpQuadricBezierCurveObject->setOrig(kpQuadricBezierCurveObject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kpQuadricBezierCurveObject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kpQuadricBezierCurveObject);
|
||
|
kpQuadricBezierCurveObject->setOrig(kpQuadricBezierCurveObject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kpQuadricBezierCurveObject);
|
||
|
} break;
|
||
|
case OT_CUBICBEZIERCURVE: {
|
||
|
KPrCubicBezierCurveObject *kpCubicBezierCurveObject = new KPrCubicBezierCurveObject();
|
||
|
offset=kpCubicBezierCurveObject->load(obj);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kpCubicBezierCurveObject);
|
||
|
kpCubicBezierCurveObject->setOrig(kpCubicBezierCurveObject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste) {
|
||
|
kpCubicBezierCurveObject->setOrig(kpCubicBezierCurveObject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kpCubicBezierCurveObject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kpCubicBezierCurveObject);
|
||
|
kpCubicBezierCurveObject->setOrig(kpCubicBezierCurveObject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kpCubicBezierCurveObject);
|
||
|
} break;
|
||
|
case OT_POLYGON: {
|
||
|
KPrPolygonObject *kpPolygonObject = new KPrPolygonObject();
|
||
|
offset=kpPolygonObject->load( obj );
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kpPolygonObject);
|
||
|
kpPolygonObject->setOrig(kpPolygonObject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste) {
|
||
|
kpPolygonObject->setOrig(kpPolygonObject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kpPolygonObject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kpPolygonObject);
|
||
|
kpPolygonObject->setOrig(kpPolygonObject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kpPolygonObject);
|
||
|
} break;
|
||
|
case OT_CLOSED_LINE: {
|
||
|
KPrClosedLineObject *kpClosedLinneObject = new KPrClosedLineObject();
|
||
|
offset = kpClosedLinneObject->load( obj );
|
||
|
if ( sticky && !ignoreSticky) {
|
||
|
m_masterPage->appendObject( kpClosedLinneObject );
|
||
|
kpClosedLinneObject->setOrig( kpClosedLinneObject->getOrig().x(), offset );
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste ) {
|
||
|
kpClosedLinneObject->setOrig( kpClosedLinneObject->getOrig().x(), offset );
|
||
|
pasteObjects.append( kpClosedLinneObject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject( kpClosedLinneObject );
|
||
|
kpClosedLinneObject->setOrig( kpClosedLinneObject->getOrig().x(), offset );
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage( offset, kpClosedLinneObject );
|
||
|
} break;
|
||
|
case OT_GROUP: {
|
||
|
KPrGroupObject *kpgroupobject = new KPrGroupObject();
|
||
|
offset=kpgroupobject->load(obj, this);
|
||
|
if ( sticky && !ignoreSticky)
|
||
|
{
|
||
|
m_masterPage->appendObject(kpgroupobject);
|
||
|
kpgroupobject->setOrig(kpgroupobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else if ( m_pageWhereLoadObject && paste) {
|
||
|
kpgroupobject->setOrig(kpgroupobject->getOrig().x(),offset);
|
||
|
pasteObjects.append( kpgroupobject );
|
||
|
}
|
||
|
else if( m_pageWhereLoadObject &&!paste)
|
||
|
{
|
||
|
m_pageWhereLoadObject->appendObject(kpgroupobject);
|
||
|
kpgroupobject->setOrig(kpgroupobject->getOrig().x(),offset);
|
||
|
}
|
||
|
else
|
||
|
insertObjectInPage(offset, kpgroupobject);
|
||
|
} break;
|
||
|
default: break;
|
||
|
}
|
||
|
}
|
||
|
obj=obj.nextSibling().toElement();
|
||
|
}
|
||
|
|
||
|
KPrInsertCmd *insertCmd = 0;
|
||
|
if ( ! pasteObjects.empty() )
|
||
|
{
|
||
|
insertCmd = new KPrInsertCmd( i18n( "Paste Objects" ), pasteObjects,
|
||
|
this , m_pageWhereLoadObject );
|
||
|
insertCmd->execute();
|
||
|
}
|
||
|
return insertCmd;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadTitle( const QDomElement &element )
|
||
|
{
|
||
|
QDomElement title=element.firstChild().toElement();
|
||
|
int i=m_insertFilePage;
|
||
|
while ( !title.isNull() ) {
|
||
|
if ( title.tagName()=="Title" )
|
||
|
{
|
||
|
//test if there is a page at this index
|
||
|
//=> don't add new page if there is again a page
|
||
|
if(!m_pageWhereLoadObject)
|
||
|
{
|
||
|
if ( i > ( (int)m_pageList.count() - 1 ) )
|
||
|
m_pageList.append( new KPrPage( this, m_masterPage ) );
|
||
|
m_pageList.at(i)->insertManualTitle(title.attribute("title"));
|
||
|
i++;
|
||
|
}
|
||
|
else
|
||
|
m_pageWhereLoadObject->insertManualTitle(title.attribute("title"));
|
||
|
}
|
||
|
title=title.nextSibling().toElement();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadNote( const QDomElement &element )
|
||
|
{
|
||
|
QDomElement note=element.firstChild().toElement();
|
||
|
int i=m_insertFilePage;
|
||
|
while ( !note.isNull() ) {
|
||
|
if ( note.tagName()=="Note" )
|
||
|
{
|
||
|
//test if there is a page at this index
|
||
|
//=> don't add new page if there is again a page
|
||
|
if(!m_pageWhereLoadObject)
|
||
|
{
|
||
|
if ( i > ( (int)m_pageList.count() - 1 ) )
|
||
|
m_pageList.append( new KPrPage( this, m_masterPage ) );
|
||
|
m_pageList.at(i)->setNoteText(note.attribute("note"));
|
||
|
i++;
|
||
|
}
|
||
|
else
|
||
|
m_pageWhereLoadObject->setNoteText(note.attribute("note"));
|
||
|
}
|
||
|
note=note.nextSibling().toElement();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadUsedSoundFileFromXML( const QDomElement &element )
|
||
|
{
|
||
|
usedSoundFile = QStringList();
|
||
|
haveNotOwnDiskSoundFile = QStringList();
|
||
|
QDomElement fileElement = element.firstChild().toElement();
|
||
|
while ( !fileElement.isNull() ) {
|
||
|
if ( fileElement.tagName() == "FILE" ) {
|
||
|
QString fileName;
|
||
|
if ( fileElement.hasAttribute( "name" ) )
|
||
|
fileName = fileElement.attribute( "name" );
|
||
|
|
||
|
if ( fileElement.hasAttribute( "filename" ) ) {
|
||
|
QString name = fileElement.attribute( "filename" );
|
||
|
QFile _file( name );
|
||
|
if ( _file.open( IO_ReadOnly ) ) {
|
||
|
fileName = name;
|
||
|
_file.close();
|
||
|
}
|
||
|
else
|
||
|
haveNotOwnDiskSoundFile.append( name );
|
||
|
}
|
||
|
|
||
|
usedSoundFile.append( fileName );
|
||
|
|
||
|
fileElement = fileElement.nextSibling().toElement();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadImagesFromStore( KoStore *_store )
|
||
|
{
|
||
|
if ( _store ) {
|
||
|
m_pictureCollection.readFromStore( _store, m_pictureMap );
|
||
|
m_pictureMap.clear(); // Release memory
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::completeLoading( KoStore* _store )
|
||
|
{
|
||
|
kdDebug()<<"bool KPrDocument::completeLoading( KoStore* _store )*************************\n";
|
||
|
emit sigProgress( 80 );
|
||
|
|
||
|
if ( _store ) {
|
||
|
loadImagesFromStore( _store );
|
||
|
emit sigProgress( 90 );
|
||
|
|
||
|
if ( !usedSoundFile.isEmpty() )
|
||
|
loadUsedSoundFileFromStore( _store, usedSoundFile );
|
||
|
|
||
|
if ( _clean )
|
||
|
createHeaderFooter();
|
||
|
//else {
|
||
|
//m_pageList.last()->updateBackgroundSize();
|
||
|
//}
|
||
|
|
||
|
|
||
|
if ( saveOnlyPage == -1 ) {
|
||
|
// ### following call independant of saveOnlyPage's value?
|
||
|
m_masterPage->completeLoading( _clean, lastObj );
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it )
|
||
|
it.current()->completeLoading( _clean, lastObj );
|
||
|
}
|
||
|
} else {
|
||
|
if ( _clean )
|
||
|
{
|
||
|
/// ### this has already been done, no?
|
||
|
setPageLayout( __pgLayout );
|
||
|
}
|
||
|
else
|
||
|
setPageLayout( m_pageLayout );
|
||
|
}
|
||
|
|
||
|
compatibilityFromOldFileFormat();
|
||
|
|
||
|
emit sigProgress( 100 );
|
||
|
recalcVariables( VT_FIELD );
|
||
|
emit sigProgress( -1 );
|
||
|
|
||
|
connect( documentInfo(), SIGNAL( sigDocumentInfoModifed()),this,SLOT(slotDocumentInfoModifed() ) );
|
||
|
//desactivate bgspellchecking
|
||
|
//attributes isReadWrite is not placed at the beginning !
|
||
|
if ( !isReadWrite())
|
||
|
enableBackgroundSpellCheck( false );
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadUsedSoundFileFromStore( KoStore *_store, QStringList _list )
|
||
|
{
|
||
|
int i = m_insertFilePage;
|
||
|
QStringList::Iterator it = _list.begin();
|
||
|
for ( ; it != _list.end(); ++it ) {
|
||
|
QString soundFile = *it;
|
||
|
|
||
|
if ( _store->open( soundFile ) ) {
|
||
|
kdDebug( 33001 ) << "Not found file on disk. Use this( " << soundFile << " ) file." << endl;
|
||
|
KoStoreDevice dev( _store );
|
||
|
int size = _store->size();
|
||
|
char *data = new char[size];
|
||
|
dev.readBlock( data, size );
|
||
|
|
||
|
int position = soundFile.findRev( '.' );
|
||
|
QString format = soundFile.right( soundFile.length() - position );
|
||
|
KTempFile *tmpFile = new KTempFile( QString::null, format );
|
||
|
tmpFile->setAutoDelete( true );
|
||
|
tmpFile->file()->writeBlock( data, size );
|
||
|
tmpFile->close();
|
||
|
|
||
|
QString tmpFileName = tmpFile->name();
|
||
|
tmpSoundFileList.append( tmpFile );
|
||
|
|
||
|
QString _fileName = *haveNotOwnDiskSoundFile.at( i );
|
||
|
++i;
|
||
|
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it ) {
|
||
|
QString _file = it.current()->getPageSoundFileName();
|
||
|
if ( !_file.isEmpty() && _file == _fileName )
|
||
|
it.current()->setPageSoundFileName( tmpFileName );
|
||
|
|
||
|
QPtrListIterator<KPrObject> oIt( it.current()->objectList() );
|
||
|
for ( ; oIt.current(); ++oIt ) {
|
||
|
_file = oIt.current()->getAppearSoundEffectFileName();
|
||
|
if ( !_file.isEmpty() && _file == _fileName )
|
||
|
oIt.current()->setAppearSoundEffectFileName( tmpFileName );
|
||
|
|
||
|
_file = oIt.current()->getDisappearSoundEffectFileName();
|
||
|
if ( !_file.isEmpty() && _file == _fileName )
|
||
|
oIt.current()->setDisappearSoundEffectFileName( tmpFileName );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_store->close();
|
||
|
delete[] data;
|
||
|
}
|
||
|
else {
|
||
|
kdDebug( 33001 ) << "Found this( " << soundFile << " ) file on disk" << endl;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setPageLayout( const KoPageLayout &pgLayout )
|
||
|
{
|
||
|
// if ( _pageLayout == pgLayout )
|
||
|
// return;
|
||
|
|
||
|
m_pageLayout = pgLayout;
|
||
|
|
||
|
//for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ )
|
||
|
// m_pageList.at( i )->updateBackgroundSize();
|
||
|
|
||
|
repaint( false );
|
||
|
layout();
|
||
|
// don't setModified(true) here, since this is called on startup
|
||
|
}
|
||
|
|
||
|
//when we change pagelayout we must re-position header/footer
|
||
|
void KPrDocument::updateHeaderFooterPosition( )
|
||
|
{
|
||
|
KoRect pageRect=m_masterPage->getPageRect();
|
||
|
QRect oldBoundingRect = zoomHandler()->zoomRect( _header->getRepaintRect() );
|
||
|
_header->setOrig(pageRect.topLeft ());
|
||
|
_header->setSize(pageRect.width(),_header->getSize().height());
|
||
|
repaint( oldBoundingRect );
|
||
|
repaint(_header);
|
||
|
|
||
|
oldBoundingRect = zoomHandler()->zoomRect( _footer->getRepaintRect() );
|
||
|
_footer->setOrig(pageRect.left(),pageRect.bottom()-_footer->getSize().height());
|
||
|
_footer->setSize(pageRect.width(),_footer->getSize().height());
|
||
|
repaint(oldBoundingRect);
|
||
|
repaint(_footer);
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::initDoc(InitDocFlags flags, QWidget* parentWidget)
|
||
|
{
|
||
|
|
||
|
if (flags==KoDocument::InitDocEmpty)
|
||
|
{
|
||
|
QString fileName( locate("kpresenter_template", "Screenpresentations/.source/Plain.kpt",
|
||
|
KPrFactory::global() ) );
|
||
|
objStartY = 0;
|
||
|
_clean = true;
|
||
|
bool ok = loadNativeFormat( fileName );
|
||
|
if ( !ok )
|
||
|
showLoadingErrorDialog();
|
||
|
resetURL();
|
||
|
setEmpty();
|
||
|
return ok;
|
||
|
}
|
||
|
|
||
|
QString file;
|
||
|
KoTemplateChooseDia::ReturnType ret;
|
||
|
KoTemplateChooseDia::DialogType dlgtype;
|
||
|
if (flags != InitDocFileNew)
|
||
|
dlgtype = KoTemplateChooseDia::Everything;
|
||
|
else
|
||
|
dlgtype = KoTemplateChooseDia::OnlyTemplates;
|
||
|
|
||
|
ret = KoTemplateChooseDia::choose( KPrFactory::global(), file,
|
||
|
dlgtype, "kpresenter_template", parentWidget );
|
||
|
if ( ret == KoTemplateChooseDia::Template ) {
|
||
|
_clean = true; //was a parameter called "clean", but unused
|
||
|
bool ok = loadNativeFormat( file );
|
||
|
if ( !ok )
|
||
|
showLoadingErrorDialog();
|
||
|
objStartY = 0;
|
||
|
_clean = true;
|
||
|
resetURL();
|
||
|
setEmpty();
|
||
|
return ok;
|
||
|
} else if ( ret == KoTemplateChooseDia::File ) {
|
||
|
objStartY = 0;
|
||
|
_clean = true;
|
||
|
KURL url( file );
|
||
|
bool ok = openURL( url );
|
||
|
return ok;
|
||
|
} else if ( ret == KoTemplateChooseDia::Empty ) {
|
||
|
QString fileName( locate("kpresenter_template", "Screenpresentations/.source/Plain.kpt",
|
||
|
KPrFactory::global() ) );
|
||
|
objStartY = 0;
|
||
|
_clean = true;
|
||
|
bool ok = loadNativeFormat( fileName );
|
||
|
if ( !ok )
|
||
|
showLoadingErrorDialog();
|
||
|
resetURL();
|
||
|
setEmpty();
|
||
|
return ok;
|
||
|
} else
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::openExistingFile( const QString& file )
|
||
|
{
|
||
|
objStartY = 0;
|
||
|
_clean = true;
|
||
|
KoDocument::openExistingFile( file );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::openTemplate( const QString& file )
|
||
|
{
|
||
|
KoDocument::openTemplate( file );
|
||
|
objStartY = 0;
|
||
|
_clean = true;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::initEmpty()
|
||
|
{
|
||
|
QString fileName( locate("kpresenter_template", "Screenpresentations/.source/Plain.kpt",
|
||
|
KPrFactory::global() ) );
|
||
|
objStartY = 0;
|
||
|
_clean = true;
|
||
|
setModified(true);
|
||
|
bool ok = loadNativeFormat( fileName );
|
||
|
if ( !ok )
|
||
|
showLoadingErrorDialog();
|
||
|
resetURL();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setEmpty()
|
||
|
{
|
||
|
KoDocument::setEmpty();
|
||
|
// Whether loaded from template or from empty doc: this is a new one -> set creation date
|
||
|
m_varColl->variableSetting()->setCreationDate(QDateTime::currentDateTime());
|
||
|
recalcVariables( VT_DATE ); // , VST_CREATION_DATE ...
|
||
|
// If we then load a document, it will override that date.
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setGridValue( double _x, double _y, bool _replace )
|
||
|
{
|
||
|
oldGridX = m_gridX;
|
||
|
oldGridY = m_gridY;
|
||
|
m_gridX=_x;
|
||
|
m_gridY=_y;
|
||
|
if ( _replace )
|
||
|
replaceObjs();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::repaint( bool erase )
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for( ; it.current(); ++it ) {
|
||
|
KPrCanvas* canvas = ((KPrView*)it.current())->getCanvas();
|
||
|
canvas->repaint( erase );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::repaint( const QRect& rect )
|
||
|
{
|
||
|
QRect r;
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for( ; it.current(); ++it ) {
|
||
|
r = rect;
|
||
|
KPrCanvas* canvas = ((KPrView*)it.current())->getCanvas();
|
||
|
r.moveTopLeft( QPoint( r.x() - canvas->diffx(),
|
||
|
r.y() - canvas->diffy() ) );
|
||
|
canvas->update( r );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::layout(KPrObject *kpobject)
|
||
|
{
|
||
|
KPrTextObject * obj = dynamic_cast<KPrTextObject *>( kpobject );
|
||
|
if (obj)
|
||
|
obj->layout();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::layout()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for( ; it.current(); ++it ) {
|
||
|
KPrCanvas* canvas = ((KPrView*)it.current())->getCanvas();
|
||
|
canvas->layout();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::repaint( KPrObject *kpobject )
|
||
|
{
|
||
|
repaint( m_zoomHandler->zoomRect( kpobject->getRepaintRect() ) );
|
||
|
}
|
||
|
|
||
|
QValueList<int> KPrDocument::getPageEffectSteps( unsigned int num )
|
||
|
{
|
||
|
return m_pageList.at(num)->getEffectSteps();
|
||
|
}
|
||
|
|
||
|
QRect KPrDocument::getPageRect( bool decBorders ) const
|
||
|
{
|
||
|
int pw, ph, bl = static_cast<int>(m_pageLayout.ptLeft);
|
||
|
int br = static_cast<int>(m_pageLayout.ptRight);
|
||
|
int bt = static_cast<int>(m_pageLayout.ptTop);
|
||
|
int bb = static_cast<int>(m_pageLayout.ptBottom);
|
||
|
int wid = static_cast<int>(m_pageLayout.ptWidth);
|
||
|
int hei = static_cast<int>(m_pageLayout.ptHeight);
|
||
|
|
||
|
if ( !decBorders ) {
|
||
|
br = 0;
|
||
|
bt = 0;
|
||
|
bl = 0;
|
||
|
bb = 0;
|
||
|
}
|
||
|
|
||
|
pw = wid - ( bl + br );
|
||
|
ph = hei - ( bt + bb );
|
||
|
|
||
|
return QRect( bl, bt, pw, ph );
|
||
|
}
|
||
|
|
||
|
int KPrDocument::getLeftBorder() const
|
||
|
{
|
||
|
return static_cast<int>(m_pageLayout.ptLeft);
|
||
|
}
|
||
|
|
||
|
int KPrDocument::getTopBorder() const
|
||
|
{
|
||
|
return static_cast<int>(m_pageLayout.ptTop);
|
||
|
}
|
||
|
|
||
|
int KPrDocument::getBottomBorder() const
|
||
|
{
|
||
|
return static_cast<int>(m_pageLayout.ptBottom);
|
||
|
}
|
||
|
|
||
|
int KPrDocument::getRightBorder() const
|
||
|
{
|
||
|
return static_cast<int>(m_pageLayout.ptRight);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::deletePage( int _page )
|
||
|
{
|
||
|
kdDebug(33001) << "KPrDocument::deletePage " << _page << endl;
|
||
|
//m_pageList.at(_page)->deletePage();
|
||
|
if ( m_pageList.count()==1 )
|
||
|
return;
|
||
|
KPrDeletePageCmd *cmd = new KPrDeletePageCmd( i18n("Delete Slide"), _page, this );
|
||
|
cmd->execute();
|
||
|
addCommand(cmd);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::insertPage( KPrPage *page, int currentPageNum, int insertPageNum )
|
||
|
{
|
||
|
// check if page was allready deleted
|
||
|
int pos = m_deletedPageList.findRef( page );
|
||
|
if ( pos != -1 )
|
||
|
m_deletedPageList.take( pos );
|
||
|
|
||
|
m_pageList.insert( insertPageNum, page );
|
||
|
|
||
|
pageOrderChanged();
|
||
|
//activate this page in all views which on slide currentPageNum
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
KPrView *view = static_cast<KPrView*>( it.current() );
|
||
|
view->addSideBarItem( insertPageNum );
|
||
|
|
||
|
// change to the new page if the view was on the current page.
|
||
|
if ( (int)view->getCurrPgNum() - 1 == currentPageNum )
|
||
|
{
|
||
|
view->skipToPage( insertPageNum );
|
||
|
}
|
||
|
else // recalc the page number as it might have been changed
|
||
|
{
|
||
|
view->recalcCurrentPageNum();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::takePage( KPrPage *page, int pageNum )
|
||
|
{
|
||
|
int pos = m_pageList.findRef( page );
|
||
|
m_pageList.take( pos );
|
||
|
m_deletedPageList.append( page );
|
||
|
|
||
|
pageOrderChanged();
|
||
|
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
KPrView *view = static_cast<KPrView*>( it.current() );
|
||
|
view->removeSideBarItem( pos );
|
||
|
|
||
|
// change to the new page if the view was on the current page.
|
||
|
if ( (int)view->getCurrPgNum() - 1 == pos )
|
||
|
{
|
||
|
view->skipToPage( pageNum );
|
||
|
}
|
||
|
else // recalc the page number as it might have been changed
|
||
|
{
|
||
|
view->recalcCurrentPageNum();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
repaint( false );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::pageOrderChanged()
|
||
|
{
|
||
|
recalcVariables( VT_PGNUM );
|
||
|
|
||
|
//update statusbar
|
||
|
emit pageNumChanged();
|
||
|
emit sig_updateMenuBar();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::movePageTo( int oldPos, int newPos )
|
||
|
{
|
||
|
kdDebug(33001) << "movePage oldPos = " << oldPos << ", neuPos = " << newPos << endl;
|
||
|
|
||
|
KPrPage * page = m_pageList.take( oldPos );
|
||
|
m_pageList.insert( newPos, page );
|
||
|
|
||
|
pageOrderChanged();
|
||
|
|
||
|
// Update the sidebars
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
KPrView *view = static_cast<KPrView*>( it.current() );
|
||
|
view->moveSideBarItem( oldPos, newPos );
|
||
|
|
||
|
// change to the new page if the view was on the old pos.
|
||
|
if ( (int)view->getCurrPgNum() - 1 == oldPos )
|
||
|
{
|
||
|
view->skipToPage( newPos );
|
||
|
}
|
||
|
else // recalc the page number as it might have been changed
|
||
|
{
|
||
|
view->recalcCurrentPageNum();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
QString KPrDocument::templateFileName( bool chooseTemplate, const QString &theFile )
|
||
|
{
|
||
|
QString fileName;
|
||
|
if ( !chooseTemplate ) {
|
||
|
if ( theFile.isEmpty() )
|
||
|
fileName = locateLocal( "appdata", "default.kpr" );
|
||
|
else
|
||
|
fileName = theFile;
|
||
|
} else {
|
||
|
// TODO: pass parentWidget as parameter to this method
|
||
|
QWidget* parentWidget = 0;
|
||
|
QString _template;
|
||
|
if ( KoTemplateChooseDia::choose( KPrFactory::global(), _template,
|
||
|
KoTemplateChooseDia::OnlyTemplates,
|
||
|
"kpresenter_template", parentWidget ) == KoTemplateChooseDia::Cancel )
|
||
|
return QString::null;
|
||
|
QFileInfo fileInfo( _template );
|
||
|
fileName = fileInfo.dirPath( true ) + "/" + fileInfo.baseName() + ".kpt";
|
||
|
|
||
|
KURL src, dest;
|
||
|
src.setPath( fileName );
|
||
|
dest.setPath( locateLocal( "appdata", "default.kpr" ) );
|
||
|
kdDebug(33001) << "Copying template (in KPrDocument::templateFileName)" << endl
|
||
|
<< " from: " << src.prettyURL() << endl
|
||
|
<< " to: " << dest.prettyURL() << endl;
|
||
|
KIO::NetAccess::file_copy( src,
|
||
|
dest,
|
||
|
-1, /* default permissions */
|
||
|
true /* overwrite */ );
|
||
|
}
|
||
|
return fileName;
|
||
|
}
|
||
|
|
||
|
int KPrDocument::insertNewPage( const QString &cmdName, int _page, InsertPos _insPos,
|
||
|
bool chooseTemplate, const QString &theFile )
|
||
|
{
|
||
|
kdDebug(33001) << "KPrDocument::insertNewPage " << _page << endl;
|
||
|
|
||
|
QString fileName=templateFileName(chooseTemplate, theFile);
|
||
|
if(fileName.isEmpty())
|
||
|
return -1;
|
||
|
|
||
|
_clean = false;
|
||
|
|
||
|
objStartY=-1;
|
||
|
|
||
|
//insert page.
|
||
|
KPrPage *newpage = new KPrPage( this, m_masterPage );
|
||
|
|
||
|
m_pageWhereLoadObject=newpage;
|
||
|
m_childCountBeforeInsert = children().count();
|
||
|
|
||
|
bool ok = loadNativeFormat( fileName );
|
||
|
if ( !ok )
|
||
|
showLoadingErrorDialog();
|
||
|
|
||
|
objStartY = 0;
|
||
|
|
||
|
KPrInsertPageCmd *cmd = new KPrInsertPageCmd( cmdName, _page, _insPos, newpage, this );
|
||
|
cmd->execute();
|
||
|
addCommand(cmd);
|
||
|
|
||
|
_clean = true;
|
||
|
m_pageWhereLoadObject=0L;
|
||
|
m_childCountBeforeInsert = 0;
|
||
|
return _page;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::savePage( const QString &file, int pgnum, bool ignore )
|
||
|
{
|
||
|
saveOnlyPage = pgnum;
|
||
|
_duplicatePage=ignore;
|
||
|
saveNativeFormat( file );
|
||
|
_duplicatePage=false;
|
||
|
saveOnlyPage = -1;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::replaceObjs( bool createUndoRedo )
|
||
|
{
|
||
|
KMacroCommand * macroCmd = 0L;
|
||
|
QPtrListIterator<KPrPage> oIt(m_pageList);
|
||
|
for (; oIt.current(); ++oIt )
|
||
|
{
|
||
|
KCommand *cmd=oIt.current()->replaceObjs( createUndoRedo, oldGridX,oldGridY,_txtBackCol, _otxtBackCol);
|
||
|
if(cmd && createUndoRedo)
|
||
|
{
|
||
|
if ( !macroCmd)
|
||
|
macroCmd = new KMacroCommand( i18n("Set New Options") );
|
||
|
macroCmd->addCommand(cmd);
|
||
|
}
|
||
|
else
|
||
|
delete cmd;
|
||
|
}
|
||
|
|
||
|
if(macroCmd)
|
||
|
{
|
||
|
macroCmd->execute();
|
||
|
addCommand(macroCmd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::restoreBackground( KPrPage *page )
|
||
|
{
|
||
|
page->background()->reload();
|
||
|
}
|
||
|
|
||
|
KCommand * KPrDocument::loadPastedObjs( const QString &in, KPrPage* _page )
|
||
|
{
|
||
|
QDomDocument doc;
|
||
|
doc.setContent( in );
|
||
|
|
||
|
QDomElement document=doc.documentElement();
|
||
|
|
||
|
// DOC
|
||
|
if (document.tagName()!="DOC") {
|
||
|
kdError(33001) << "Missing DOC" << endl;
|
||
|
return 0L;
|
||
|
}
|
||
|
|
||
|
bool ok = false;
|
||
|
|
||
|
if(document.hasAttribute("mime") && document.attribute("mime")=="application/x-kpresenter")
|
||
|
ok=true;
|
||
|
|
||
|
if ( !ok )
|
||
|
return 0L;
|
||
|
m_pageWhereLoadObject=_page;
|
||
|
KCommand *cmd = loadObjects(document,true);
|
||
|
m_pageWhereLoadObject=0L;
|
||
|
|
||
|
repaint( false );
|
||
|
setModified( true );
|
||
|
return cmd;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::deSelectAllObj()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->getCanvas()->deSelectAllObj();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::deSelectObj(KPrObject *obj)
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->getCanvas()->deSelectObj( obj );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setDisplayObjectMasterPage( bool b )
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->updateDisplayObjectMasterPageButton();
|
||
|
repaint(b);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setDisplayBackground( bool b )
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->updateDisplayBackgroundButton();
|
||
|
repaint(b);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setHeader( bool b )
|
||
|
{
|
||
|
_header->setDrawEditRect( b );
|
||
|
_header->setDrawEmpty( b );
|
||
|
if(!b)
|
||
|
{
|
||
|
terminateEditing(_header);
|
||
|
deSelectObj(_header);
|
||
|
}
|
||
|
m_masterPage->setHeader( b, false );
|
||
|
updateHeaderFooterButton();
|
||
|
repaint(b);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setFooter( bool b )
|
||
|
{
|
||
|
_footer->setDrawEditRect( b );
|
||
|
_footer->setDrawEmpty( b );
|
||
|
if(!b)
|
||
|
{
|
||
|
terminateEditing(_footer);
|
||
|
deSelectObj(_footer);
|
||
|
}
|
||
|
m_masterPage->setFooter( b, false );
|
||
|
updateHeaderFooterButton();
|
||
|
repaint(b);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateHeaderFooterButton()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->updateHeaderFooterButton();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::makeUsedPixmapList()
|
||
|
{
|
||
|
usedPictures.clear();
|
||
|
|
||
|
for ( uint i = 0; i < m_pageList.count(); i++ ) {
|
||
|
if ( saveOnlyPage != -1 &&
|
||
|
static_cast<int>(i) != saveOnlyPage )
|
||
|
continue;
|
||
|
m_pageList.at(i)->makeUsedPixmapList();
|
||
|
}
|
||
|
// ### following call independant of saveOnlyPage's value?
|
||
|
if ( saveOnlyPage == -1 )
|
||
|
m_masterPage->makeUsedPixmapList();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::makeUsedSoundFileList()
|
||
|
{
|
||
|
if ( saveOnlyPage != -1 )
|
||
|
return;
|
||
|
|
||
|
usedSoundFile.clear();
|
||
|
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it ) {
|
||
|
QString _file = it.current()->getPageSoundFileName();
|
||
|
if ( !_file.isEmpty() && usedSoundFile.findIndex( _file ) == -1 )
|
||
|
usedSoundFile.append( _file );
|
||
|
|
||
|
QPtrListIterator<KPrObject> oIt( it.current()->objectList() );
|
||
|
for ( ; oIt.current(); ++oIt ) {
|
||
|
_file = oIt.current()->getAppearSoundEffectFileName();
|
||
|
if ( !_file.isEmpty() && usedSoundFile.findIndex( _file ) == -1 )
|
||
|
usedSoundFile.append( _file );
|
||
|
|
||
|
_file = oIt.current()->getDisappearSoundEffectFileName();
|
||
|
if ( !_file.isEmpty() && usedSoundFile.findIndex( _file ) == -1 )
|
||
|
usedSoundFile.append( _file );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
KoView* KPrDocument::createViewInstance( QWidget* parent, const char* name )
|
||
|
{
|
||
|
//the page numbers have to be recalced for the sticky objects
|
||
|
//as it could not be done during the constructor of KPrView
|
||
|
recalcPageNum();
|
||
|
return new KPrView( this, parent, name );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::paintContent( QPainter& painter, const QRect& rect,
|
||
|
bool /*transparent*/, double zoomX, double zoomY )
|
||
|
{
|
||
|
m_zoomHandler->setZoom( 100 );
|
||
|
if ( zoomHandler()->zoomedResolutionX() != zoomX || zoomHandler()->zoomedResolutionY() != zoomY )
|
||
|
{
|
||
|
int zoomLevel = qRound( 100 * zoomY / zoomHandler()->zoomedResolutionY() ); // ## ignores the case where the x and y scaling differs
|
||
|
zoomHandler()->setZoom( zoomLevel );
|
||
|
bool forPrint = painter.device() && painter.device()->devType() == QInternal::Printer;
|
||
|
newZoomAndResolution( false, forPrint );
|
||
|
}
|
||
|
//for the moment draw first page.
|
||
|
KPrPage *page=m_pageList.first();
|
||
|
if( m_initialActivePage )
|
||
|
page = m_initialActivePage;
|
||
|
|
||
|
int pageNum = m_pageList.findRef( page );
|
||
|
|
||
|
if ( page->displayBackground() )
|
||
|
page->background()->drawBackground( &painter, zoomHandler(), rect, false );
|
||
|
if ( page->displayObjectFromMasterPage() )
|
||
|
{
|
||
|
KPrPage *masterPage = page->masterPage();
|
||
|
if ( masterPage )
|
||
|
{
|
||
|
QPtrListIterator<KPrObject> it( masterPage->objectList() );
|
||
|
//draw objects on master slide
|
||
|
for ( ; it.current() ; ++it )
|
||
|
{
|
||
|
if( (it.current()==_header && !page->hasHeader())||(it.current()==_footer && !page->hasFooter()))
|
||
|
continue;
|
||
|
it.current()->draw( &painter, zoomHandler(), pageNum, SM_NONE );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
QPtrListIterator<KPrObject> it( page->objectList() );
|
||
|
for ( ; it.current() ; ++it )
|
||
|
it.current()->draw( &painter, zoomHandler(), pageNum, SM_NONE );
|
||
|
}
|
||
|
|
||
|
QPixmap KPrDocument::generatePreview( const QSize& size )
|
||
|
{
|
||
|
int oldZoom = zoomHandler()->zoom();
|
||
|
double oldResolutionX = zoomHandler()->resolutionX();
|
||
|
double oldResolutionY = zoomHandler()->resolutionY();
|
||
|
|
||
|
QPixmap pix = KoDocument::generatePreview(size);
|
||
|
|
||
|
zoomHandler()->setResolution( oldResolutionX, oldResolutionY );
|
||
|
zoomHandler()->setZoom(oldZoom);
|
||
|
newZoomAndResolution( false, false );
|
||
|
|
||
|
return pix;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::addShell( KoMainWindow *shell )
|
||
|
{
|
||
|
connect( shell, SIGNAL( documentSaved() ), m_commandHistory, SLOT( documentSaved() ) );
|
||
|
KoDocument::addShell( shell );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::movePage( int from, int to )
|
||
|
{
|
||
|
kdDebug(33001) << "KPrDocument::movePage from=" << from << " to=" << to << endl;
|
||
|
KPrMovePageCmd *cmd = new KPrMovePageCmd( i18n("Move Slide"), from, to, this );
|
||
|
cmd->execute();
|
||
|
addCommand(cmd);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::copyPage( int from )
|
||
|
{
|
||
|
_clean = false;
|
||
|
m_childCountBeforeInsert = children().count();
|
||
|
|
||
|
_duplicatePage=true; // ### now also set via savePage() parameter below
|
||
|
|
||
|
kdDebug(33001) << "KPrDocument::copyPage from=" << from << " to=" << from + 1 << endl;
|
||
|
kdDebug(33001) << "mimeType = " << mimeType() << ", outputMimeType = " << outputMimeType() << endl;
|
||
|
bool wasSelected = isSlideSelected( from );
|
||
|
KTempFile tempFile( QString::null, mimeType() == nativeOasisMimeType() ? ".oop": ".kpr" );
|
||
|
tempFile.setAutoDelete( true );
|
||
|
savePage( tempFile.name(), from, true );
|
||
|
|
||
|
//insert page.
|
||
|
KPrPage *newpage = new KPrPage( this, m_masterPage );
|
||
|
|
||
|
m_pageWhereLoadObject = newpage;
|
||
|
|
||
|
bool ok = loadNativeFormat( tempFile.name() );
|
||
|
if ( !ok )
|
||
|
showLoadingErrorDialog();
|
||
|
|
||
|
KPrInsertPageCmd *cmd = new KPrInsertPageCmd( i18n("Duplicate Slide"), from, IP_AFTER, newpage, this );
|
||
|
cmd->execute();
|
||
|
addCommand(cmd);
|
||
|
|
||
|
_duplicatePage=false;
|
||
|
|
||
|
_clean = true;
|
||
|
m_pageWhereLoadObject=0L;
|
||
|
m_childCountBeforeInsert = 0;
|
||
|
|
||
|
selectPage( from + 1, wasSelected );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::copyPageToClipboard( int pgnum )
|
||
|
{
|
||
|
// We save the page to a temp file and set the URL of the file in the clipboard
|
||
|
// Yes it's a hack but at least we don't hit the clipboard size limit :)
|
||
|
// (and we don't have to implement copy-tar-structure-to-clipboard)
|
||
|
// In fact it even allows copying a [1-page] kpr in konq and pasting it in kpresenter :))
|
||
|
kdDebug(33001) << "KPrDocument::copyPageToClipboard pgnum=" << pgnum << endl;
|
||
|
kdDebug(33001) << "mimeType = " << mimeType() << ", outputMimeType = " << outputMimeType() << endl;
|
||
|
KTempFile tempFile( QString::null, mimeType() == nativeOasisMimeType() ? ".oop": ".kpr" );
|
||
|
savePage( tempFile.name(), pgnum, true );
|
||
|
KURL url; url.setPath( tempFile.name() );
|
||
|
KURL::List lst;
|
||
|
lst.append( url );
|
||
|
QApplication::clipboard()->setData( new KURLDrag( lst ) );
|
||
|
m_tempFileInClipboard = tempFile.name(); // do this last, the above calls clipboardDataChanged
|
||
|
}
|
||
|
|
||
|
void KPrDocument::pastePage( const QMimeSource * data, int pgnum )
|
||
|
{
|
||
|
KURL::List lst;
|
||
|
if ( KURLDrag::decode( data, lst ) && !lst.isEmpty() )
|
||
|
{
|
||
|
insertNewPage(i18n("Paste Slide"), pgnum, IP_BEFORE, FALSE, lst.first().path() );
|
||
|
//selectPage( pgnum, true /* should be part of the file ? */ );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::clipboardDataChanged()
|
||
|
{
|
||
|
if ( !m_tempFileInClipboard.isEmpty() )
|
||
|
{
|
||
|
kdDebug(33001) << "KPrDocument::clipboardDataChanged, deleting temp file " << m_tempFileInClipboard << endl;
|
||
|
unlink( QFile::encodeName( m_tempFileInClipboard ) );
|
||
|
m_tempFileInClipboard = QString::null;
|
||
|
}
|
||
|
// TODO enable paste as well, when a txtobject is activated
|
||
|
// and there is plain text in the clipboard. Then enable this code.
|
||
|
//QMimeSource *data = QApplication::clipboard()->data();
|
||
|
//bool canPaste = data->provides( "text/uri-list" ) || data->provides( "application/x-kpresenter-selection" );
|
||
|
// emit enablePaste( canPaste );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::selectPage( int pgNum /* 0-based */, bool select )
|
||
|
{
|
||
|
Q_ASSERT( pgNum >= 0 );
|
||
|
KPrPage *page = m_pageList.at( pgNum );
|
||
|
page->slideSelected(select);
|
||
|
kdDebug(33001) << "KPrDocument::selectPage pgNum=" << pgNum << " select=" << select << endl;
|
||
|
setModified(true);
|
||
|
|
||
|
updateSideBarItem( page );
|
||
|
updatePresentationButton();
|
||
|
//update statusbar
|
||
|
emit pageNumChanged();
|
||
|
}
|
||
|
|
||
|
KPrPage * KPrDocument::findPage(KPrObject *object)
|
||
|
{
|
||
|
QPtrList<KPrObject> masterObjects( m_masterPage->objectList() );
|
||
|
if ( masterObjects.findRef( object ) != -1 )
|
||
|
{
|
||
|
//kdDebug(33001) << "Object is on the master page" << endl;
|
||
|
return m_masterPage;
|
||
|
}
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it ) {
|
||
|
QPtrList<KPrObject> list( it.current()->objectList() );
|
||
|
if ( list.findRef( object ) != -1 ) {
|
||
|
//kdDebug(33001) << "Object is on page " << m_pageList.findRef(it.current()) + 1 << endl;
|
||
|
return it.current();
|
||
|
}
|
||
|
}
|
||
|
kdDebug(33001) << "Object not found on a page" << endl;
|
||
|
return 0L;
|
||
|
}
|
||
|
|
||
|
KPrPage * KPrDocument::findPage(QPtrList<KPrObject> &objects)
|
||
|
{
|
||
|
KPrObject *object;
|
||
|
for ( object = objects.first(); object; object=objects.next() ) {
|
||
|
QPtrList<KPrObject> list( m_masterPage->objectList() );
|
||
|
if ( list.findRef( object ) != -1 )
|
||
|
{
|
||
|
//kdDebug(33001) << "Object is on the master page" << endl;
|
||
|
return m_masterPage;
|
||
|
}
|
||
|
}
|
||
|
object = objects.first();
|
||
|
for ( KPrPage *page=m_pageList.first(); page; page=m_pageList.next() ) {
|
||
|
QPtrList<KPrObject> list( page->objectList() );
|
||
|
if ( list.findRef( object ) != -1 ) {
|
||
|
//kdDebug(33001) << "The Objects are on page " << m_pageList.findRef(page) + 1 << endl;
|
||
|
return page;
|
||
|
}
|
||
|
}
|
||
|
kdDebug(33001) << "Objects not found on a page" << endl;
|
||
|
return 0L;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateSideBarItem( KPrPage * page )
|
||
|
{
|
||
|
// Update the views
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>( it.current() )->updateSideBarItem( page );
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::isSlideSelected( int pgNum /* 0-based */ )
|
||
|
{
|
||
|
Q_ASSERT( pgNum >= 0 );
|
||
|
return m_pageList.at(pgNum)->isSlideSelected();
|
||
|
}
|
||
|
|
||
|
QValueList<int> KPrDocument::listOfDisplaySelectedSlides( const QValueList<KPrPage*> & lst) /* returned list is 0-based */
|
||
|
{
|
||
|
QValueList<int> result;
|
||
|
QValueListConstIterator<KPrPage*> itPage;
|
||
|
QValueListConstIterator<KPrPage*> itPageEnd = lst.end();
|
||
|
for( itPage = lst.begin() ; itPage != itPageEnd; ++itPage )
|
||
|
{
|
||
|
int pageNum = m_pageList.find(*itPage );
|
||
|
if ( pageNum != -1 )
|
||
|
{
|
||
|
kdDebug()<<" KPrDocument::displaySelectedSlide : add slide number :"<<pageNum<<endl;
|
||
|
result << pageNum;
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
|
||
|
QValueList<int> KPrDocument::displaySelectedSlides() /* returned list is 0-based */
|
||
|
{
|
||
|
QValueList<int> result;
|
||
|
if ( m_customListTest )
|
||
|
return *m_customListTest;
|
||
|
if ( m_presentationName.isEmpty() )
|
||
|
return selectedSlides();
|
||
|
else
|
||
|
{
|
||
|
kdDebug()<<" KPrDocument::displaySelectedSlide m_presentationName : "<<m_presentationName<<endl;
|
||
|
result = listOfDisplaySelectedSlides( m_customListSlideShow[m_presentationName]);
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
QValueList<int> KPrDocument::selectedSlides() /* returned list is 0-based */
|
||
|
{
|
||
|
QValueList<int> result;
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ ) {
|
||
|
if(m_pageList.at(i)->isSlideSelected())
|
||
|
result <<i;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
QString KPrDocument::selectedForPrinting() {
|
||
|
QString ret;
|
||
|
int start=-1, end=-1;
|
||
|
bool continuous=false;
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ ) {
|
||
|
if(m_pageList.at(i)->isSlideSelected()) {
|
||
|
if(continuous)
|
||
|
++end;
|
||
|
else {
|
||
|
start=i;
|
||
|
end=i;
|
||
|
continuous=true;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
if(continuous) {
|
||
|
if(start==end)
|
||
|
ret+=QString::number(start+1)+",";
|
||
|
else
|
||
|
ret+=QString::number(start+1)+"-"+QString::number(end+1)+",";
|
||
|
continuous=false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(continuous) {
|
||
|
if(start==end)
|
||
|
ret+=QString::number(start+1);
|
||
|
else
|
||
|
ret+=QString::number(start+1)+"-"+QString::number(end+1);
|
||
|
}
|
||
|
if(','==ret[ret.length()-1])
|
||
|
ret.truncate(ret.length()-1);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::slotRepaintChanged( KPrTextObject *kptextobj )
|
||
|
{
|
||
|
//todo
|
||
|
//use this function for the moment
|
||
|
repaint( kptextobj );
|
||
|
}
|
||
|
|
||
|
|
||
|
void KPrDocument::recalcVariables( int type )
|
||
|
{
|
||
|
recalcPageNum();
|
||
|
QValueList<KoVariable* > modifiedVariables = m_varColl->recalcVariables(type);
|
||
|
if ( modifiedVariables.isEmpty() )
|
||
|
return;
|
||
|
|
||
|
// TODO use the return value from recalcVariables to only repaint what has changed.
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it )
|
||
|
it.current()->slotRepaintVariable();
|
||
|
m_masterPage->slotRepaintVariable();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::slotGuideLinesChanged( KoView *view )
|
||
|
{
|
||
|
( (KPrView*)view )->getCanvas()->guideLines().getGuideLines( m_hGuideLines, m_vGuideLines );
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
if ( it.current() != view )
|
||
|
{
|
||
|
( (KPrView*)it.current() )->getCanvas()->guideLines().setGuideLines( m_hGuideLines, m_vGuideLines );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::slotDocumentInfoModifed()
|
||
|
{
|
||
|
if (!getVariableCollection()->variableSetting()->displayFieldCode())
|
||
|
recalcVariables( VT_FIELD );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::reorganizeGUI()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->reorganize();
|
||
|
}
|
||
|
|
||
|
int KPrDocument::undoRedoLimit() const
|
||
|
{
|
||
|
return m_commandHistory->undoLimit();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setUndoRedoLimit(int val)
|
||
|
{
|
||
|
m_commandHistory->setUndoLimit(val);
|
||
|
m_commandHistory->setRedoLimit(val);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateRuler()
|
||
|
{
|
||
|
emit sig_updateRuler();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::recalcPageNum()
|
||
|
{
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it )
|
||
|
it.current()->recalcPageNum();
|
||
|
m_masterPage->recalcPageNum();
|
||
|
}
|
||
|
|
||
|
KPrPage * KPrDocument::activePage()const
|
||
|
{
|
||
|
return m_initialActivePage;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::insertObjectInPage(double offset, KPrObject *_obj, int pos)
|
||
|
{
|
||
|
/// Why does this use __pgLayout instead of m_pageLayout ?
|
||
|
int page = (int)(offset/__pgLayout.ptHeight)+m_insertFilePage;
|
||
|
if ( page < 0 )
|
||
|
{
|
||
|
kdDebug(33001) << "insertObjectInPage object cound not be inserted page = " << page << endl;
|
||
|
return;
|
||
|
}
|
||
|
double newPos = offset - ( page - m_insertFilePage ) * __pgLayout.ptHeight;
|
||
|
// due to a very small caluculating error which gives us the wrong page
|
||
|
// for objects placed on top of the page we have to move them to the right page.
|
||
|
if ( __pgLayout.ptHeight - newPos < 1e-6 )
|
||
|
{
|
||
|
page++;
|
||
|
newPos = 0.0;
|
||
|
}
|
||
|
if ( page > ( (int)m_pageList.count()-1 ) )
|
||
|
{
|
||
|
for (int i=(m_pageList.count()-1); i<page;i++)
|
||
|
m_pageList.append( new KPrPage( this, m_masterPage ) );
|
||
|
}
|
||
|
_obj->setOrig(_obj->getOrig().x(),newPos);
|
||
|
|
||
|
if ( pos == -1 )
|
||
|
{
|
||
|
m_pageList.at(page)->appendObject(_obj);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pageList.at( page )->insertObject( _obj, pos );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::insertPixmapKey( KoPictureKey key )
|
||
|
{
|
||
|
if ( !usedPictures.contains( key ) )
|
||
|
usedPictures.append( key );
|
||
|
}
|
||
|
|
||
|
KPrPage * KPrDocument::initialActivePage() const
|
||
|
{
|
||
|
return m_initialActivePage;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::displayActivePage(KPrPage * _page)
|
||
|
{
|
||
|
m_initialActivePage = _page;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateZoomRuler()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
((KPrView*)it.current())->getHRuler()->setZoom( m_zoomHandler->zoomedResolutionX() );
|
||
|
((KPrView*)it.current())->getVRuler()->setZoom( m_zoomHandler->zoomedResolutionY() );
|
||
|
((KPrView*)it.current())->slotUpdateRuler();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::newZoomAndResolution( bool updateViews, bool /*forPrint*/ )
|
||
|
{
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it ) {
|
||
|
QPtrListIterator<KPrObject> oit(it.current()->objectList());
|
||
|
for ( ; oit.current(); ++oit ) {
|
||
|
if ( oit.current()->getType() == OT_TEXT )
|
||
|
static_cast<KPrTextObject *>( oit.current() )->textDocument()->formatCollection()->zoomChanged();
|
||
|
}
|
||
|
}
|
||
|
if ( updateViews )
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
static_cast<KPrView *>( it.current() )->getCanvas()->update();
|
||
|
static_cast<KPrView *>( it.current() )->getCanvas()->layout();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::isHeader(const KPrObject *obj) const
|
||
|
{
|
||
|
return (obj==_header);
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::isFooter(const KPrObject *obj) const
|
||
|
{
|
||
|
return (obj==_footer);
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::isHeaderFooter(const KPrObject *obj) const
|
||
|
{
|
||
|
return (obj==_header)||(obj==_footer);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateRulerPageLayout()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
((KPrView*)it.current())->getHRuler()->setPageLayout(m_pageLayout );
|
||
|
((KPrView*)it.current())->getVRuler()->setPageLayout(m_pageLayout );
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::refreshAllNoteBarMasterPage(const QString &text, KPrView *exceptView)
|
||
|
{
|
||
|
m_masterPage->setNoteText(text );
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
KPrView* view=(KPrView*)it.current();
|
||
|
if ( view->getNoteBar() && view != exceptView && view->editMaster() )
|
||
|
view->getNoteBar()->setCurrentNoteText(text );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::refreshAllNoteBar(int page, const QString &text, KPrView *exceptView)
|
||
|
{
|
||
|
m_pageList.at(page)->setNoteText(text );
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
KPrView* view=(KPrView*)it.current();
|
||
|
if ( view->getNoteBar() && view != exceptView && ((int)(view->getCurrPgNum())-1 == page))
|
||
|
view->getNoteBar()->setCurrentNoteText(text );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadStyleTemplates( const QDomElement &stylesElem )
|
||
|
{
|
||
|
QValueList<QString> followingStyles;
|
||
|
|
||
|
QDomNodeList listStyles = stylesElem.elementsByTagName( "STYLE" );
|
||
|
if( listStyles.count() > 0) { // we are going to import at least one style.
|
||
|
KoParagStyle *s = m_styleColl->findStyle("Standard");
|
||
|
kdDebug(32001) << "KPrDocument::loadStyleTemplates looking for Standard, to delete it. Found " << s << endl;
|
||
|
if(s) // delete the standard style.
|
||
|
m_styleColl->removeStyle(s);
|
||
|
}
|
||
|
for (unsigned int item = 0; item < listStyles.count(); item++) {
|
||
|
QDomElement styleElem = listStyles.item( item ).toElement();
|
||
|
|
||
|
KoParagStyle *sty = new KoParagStyle( QString::null );
|
||
|
// Load the style from the <STYLE> element
|
||
|
sty->loadStyle( styleElem );
|
||
|
|
||
|
QDomElement formatElem = styleElem.namedItem( "FORMAT" ).toElement();
|
||
|
if ( !formatElem.isNull() )
|
||
|
sty->format() = KPrTextObject::loadFormat( formatElem, 0L, defaultFont(), globalLanguage(), globalHyphenation() );
|
||
|
else
|
||
|
kdWarning(33001) << "No FORMAT tag in <STYLE>" << endl; // This leads to problems in applyStyle().
|
||
|
|
||
|
// Style created, now let's try to add it
|
||
|
sty = m_styleColl->addStyle( sty );
|
||
|
kdDebug() << k_funcinfo << m_styleColl->styleList().count() << " styles, " << followingStyles.count() << " following styles" << endl;
|
||
|
if(m_styleColl->styleList().count() > followingStyles.count() )
|
||
|
{
|
||
|
QString following = styleElem.namedItem("FOLLOWING").toElement().attribute("name");
|
||
|
followingStyles.append( following );
|
||
|
}
|
||
|
else
|
||
|
kdWarning (33001) << "Found duplicate style declaration, overwriting former " << sty->name() << endl;
|
||
|
}
|
||
|
|
||
|
Q_ASSERT( followingStyles.count() == m_styleColl->styleList().count() );
|
||
|
unsigned int i=0;
|
||
|
for( QValueList<QString>::Iterator it = followingStyles.begin(); it != followingStyles.end(); ++it ) {
|
||
|
KoParagStyle * style = m_styleColl->findStyle(*it);
|
||
|
m_styleColl->styleAt( i++)->setFollowingStyle( style );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void KPrDocument::updateAllStyleLists()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->updateStyleList();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::applyStyleChange( KoStyleChangeDefMap changed )
|
||
|
{
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it )
|
||
|
it.current()->applyStyleChange( changed );
|
||
|
m_masterPage->applyStyleChange( changed );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveStyle( KoParagStyle *sty, QDomElement parentElem )
|
||
|
{
|
||
|
QDomDocument doc = parentElem.ownerDocument();
|
||
|
QDomElement styleElem = doc.createElement( "STYLE" );
|
||
|
parentElem.appendChild( styleElem );
|
||
|
|
||
|
sty->saveStyle( styleElem );
|
||
|
QDomElement formatElem = doc.createElement("FORMAT");
|
||
|
KPrTextObject::saveFormat( formatElem, &sty->format() );
|
||
|
styleElem.appendChild( formatElem );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::startBackgroundSpellCheck()
|
||
|
{
|
||
|
//don't start spell checking when document is embedded in konqueror
|
||
|
if(backgroundSpellCheckEnabled() && isReadWrite())
|
||
|
{
|
||
|
if(m_initialActivePage->allTextObjects().count()>0)
|
||
|
{
|
||
|
m_bgSpellCheck->start();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::enableBackgroundSpellCheck( bool b )
|
||
|
{
|
||
|
//m_bgSpellCheck->enableBackgroundSpellCheck(b);
|
||
|
m_bgSpellCheck->setEnabled(b);
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for( ; it.current(); ++it )
|
||
|
((KPrView*)it.current())->updateBgSpellCheckingState();
|
||
|
}
|
||
|
|
||
|
bool KPrDocument::backgroundSpellCheckEnabled() const
|
||
|
{
|
||
|
return m_bgSpellCheck->enabled();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::reactivateBgSpellChecking(bool refreshTextObj)
|
||
|
{
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
#if 0
|
||
|
if(m_kpresenterView && m_kpresenterView->getCanvas())
|
||
|
activePage=m_kpresenterView->getCanvas()->activePage();
|
||
|
#endif
|
||
|
KPrPage *activePage=m_initialActivePage;
|
||
|
for ( ; it.current(); ++it )
|
||
|
{
|
||
|
if( it.current()!=activePage)
|
||
|
it.current()->reactivateBgSpellChecking(false );
|
||
|
else
|
||
|
it.current()->reactivateBgSpellChecking( true);
|
||
|
}
|
||
|
m_masterPage->reactivateBgSpellChecking(refreshTextObj);
|
||
|
startBackgroundSpellCheck();
|
||
|
}
|
||
|
|
||
|
QPtrList<KoTextObject> KPrDocument::allTextObjects() const
|
||
|
{
|
||
|
QPtrList<KoTextObject> lst;
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it )
|
||
|
it.current()->addTextObjects( lst );
|
||
|
m_masterPage->addTextObjects( lst );
|
||
|
return lst;
|
||
|
}
|
||
|
|
||
|
QValueList<KoTextDocument *> KPrDocument::allTextDocuments() const
|
||
|
{
|
||
|
QValueList<KoTextDocument *> lst;
|
||
|
const QPtrList<KoTextObject> textObjects = allTextObjects();
|
||
|
QPtrListIterator<KoTextObject> it( textObjects );
|
||
|
for ( ; it.current() ; ++it ) {
|
||
|
lst.append( it.current()->textDocument() );
|
||
|
}
|
||
|
return lst;
|
||
|
}
|
||
|
|
||
|
QValueList<KoTextObject *> KPrDocument::visibleTextObjects( ) const
|
||
|
{
|
||
|
QValueList<KoTextObject *> lst;
|
||
|
QPtrList<KoTextObject> textFramesets = allTextObjects( );
|
||
|
|
||
|
KoTextObject *frm;
|
||
|
for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ) {
|
||
|
if ( frm && !frm->protectContent() )
|
||
|
{
|
||
|
lst.append( frm );
|
||
|
}
|
||
|
}
|
||
|
return lst;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setShowGuideLines( bool b )
|
||
|
{
|
||
|
m_bShowGuideLines = b;
|
||
|
setModified( true );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::horizontalGuideLines( const QValueList<double> &lines )
|
||
|
{
|
||
|
m_hGuideLines = lines;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::verticalGuideLines( const QValueList<double> &lines )
|
||
|
{
|
||
|
m_vGuideLines = lines;
|
||
|
}
|
||
|
|
||
|
|
||
|
void KPrDocument::addGuideLine( Qt::Orientation o, double pos )
|
||
|
{
|
||
|
if ( o == Qt::Horizontal )
|
||
|
{
|
||
|
m_hGuideLines.append( pos );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_vGuideLines.append( pos );
|
||
|
}
|
||
|
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
{
|
||
|
( (KPrView*)it.current() )->getCanvas()->guideLines().setGuideLines( m_hGuideLines, m_vGuideLines );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void KPrDocument::updateGuideLineButton()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->updateGuideLineButton();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::loadGuideLines( const QDomElement &element )
|
||
|
{
|
||
|
// In early versions of KPresenter 1.2 (up to Beta 2), there is child also naed <HELPLINES>
|
||
|
// Before KPresenter 1.5 the guide lines where named helplines that is why they are still
|
||
|
// named like this in the fileformat
|
||
|
QDomElement guidelines = element.namedItem( "HELPLINES" ).toElement();
|
||
|
if ( guidelines.isNull() )
|
||
|
guidelines = element;
|
||
|
|
||
|
guidelines = guidelines.firstChild().toElement();
|
||
|
while ( !guidelines.isNull() )
|
||
|
{
|
||
|
if ( guidelines.tagName() == "Vertical" )
|
||
|
m_vGuideLines.append( guidelines.attribute( "value" ).toDouble() );
|
||
|
else if ( guidelines.tagName() == "Horizontal" )
|
||
|
m_hGuideLines.append( guidelines.attribute( "value" ).toDouble() );
|
||
|
guidelines = guidelines.nextSibling().toElement();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::saveGuideLines( QDomDocument &doc, QDomElement& element )
|
||
|
{
|
||
|
for(QValueList<double>::Iterator it = m_vGuideLines.begin(); it != m_vGuideLines.end(); ++it)
|
||
|
{
|
||
|
QDomElement lines=doc.createElement("Vertical");
|
||
|
lines.setAttribute("value", (double)*it);
|
||
|
element.appendChild( lines );
|
||
|
}
|
||
|
|
||
|
for(QValueList<double>::Iterator it = m_hGuideLines.begin(); it != m_hGuideLines.end(); ++it)
|
||
|
{
|
||
|
QDomElement lines=doc.createElement("Horizontal");
|
||
|
lines.setAttribute("value", *it);
|
||
|
element.appendChild( lines );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateGridButton()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->updateGridButton();
|
||
|
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setSpellCheckIgnoreList( const QStringList& lst )
|
||
|
{
|
||
|
m_spellCheckIgnoreList = lst;
|
||
|
m_bgSpellCheck->settings()->setCurrentIgnoreList( m_spellCheckIgnoreList + m_spellCheckPersonalDict );
|
||
|
setModified( true );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::addSpellCheckIgnoreWord( const QString & word )
|
||
|
{
|
||
|
// ### missing: undo/redo support
|
||
|
if( m_spellCheckIgnoreList.findIndex( word ) == -1 )
|
||
|
m_spellCheckIgnoreList.append( word );
|
||
|
setSpellCheckIgnoreList( m_spellCheckIgnoreList );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateObjectStatusBarItem()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->updateObjectStatusBarItem();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateObjectSelected()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
((KPrView*)it.current())->objectSelectedChanged();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setTabStopValue ( double _tabStop )
|
||
|
{
|
||
|
m_tabStop = _tabStop;
|
||
|
QPtrListIterator<KPrPage> it( m_pageList );
|
||
|
for ( ; it.current(); ++it )
|
||
|
it.current()->changeTabStopValue( m_tabStop );
|
||
|
//styckypage
|
||
|
m_masterPage->changeTabStopValue( m_tabStop );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::changeBgSpellCheckingState( bool b )
|
||
|
{
|
||
|
enableBackgroundSpellCheck( b );
|
||
|
reactivateBgSpellChecking();
|
||
|
KConfig *config = KPrFactory::global()->config();
|
||
|
config->setGroup("KSpell kpresenter" );
|
||
|
config->writeEntry( "SpellCheck", (int)b );
|
||
|
}
|
||
|
|
||
|
|
||
|
bool KPrDocument::cursorInProtectedArea()const
|
||
|
{
|
||
|
return m_cursorInProtectectedArea;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setCursorInProtectedArea( bool b )
|
||
|
{
|
||
|
m_cursorInProtectectedArea=b;
|
||
|
testAndCloseAllTextObjectProtectedContent();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::testAndCloseAllTextObjectProtectedContent()
|
||
|
{
|
||
|
if ( !m_cursorInProtectectedArea )
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>(it.current())->testAndCloseAllTextObjectProtectedContent();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KPrDocument::insertFile(const QString & file )
|
||
|
{
|
||
|
m_insertFilePage = m_pageList.count();
|
||
|
|
||
|
m_childCountBeforeInsert = children().count();
|
||
|
objStartY = 0;
|
||
|
bool clean = _clean;
|
||
|
_clean = false;
|
||
|
bool ok = loadNativeFormat(file );
|
||
|
if ( !ok )
|
||
|
{
|
||
|
showLoadingErrorDialog();
|
||
|
return;
|
||
|
}
|
||
|
KMacroCommand *macro = 0L;
|
||
|
for ( int i = m_insertFilePage; i<(int)m_pageList.count();i++)
|
||
|
{
|
||
|
if ( !macro )
|
||
|
macro = new KMacroCommand( i18n("Insert File"));
|
||
|
KPrInsertPageCmd * cmd = new KPrInsertPageCmd( i18n("Insert File"), i - 1, IP_AFTER, m_pageList.at(i), this ) ;
|
||
|
macro->addCommand(cmd );
|
||
|
}
|
||
|
if ( macro )
|
||
|
addCommand( macro );
|
||
|
|
||
|
m_insertFilePage = 0;
|
||
|
m_childCountBeforeInsert = 0;
|
||
|
// Update the views
|
||
|
int newPos = m_pageList.count()-1;
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>(it.current())->updateSideBar();
|
||
|
_clean = clean;
|
||
|
updatePresentationButton();
|
||
|
|
||
|
//activate this page in all views (...)
|
||
|
QPtrListIterator<KoView>it2( views() );
|
||
|
for (; it2.current(); ++it2 )
|
||
|
static_cast<KPrView*>(it2.current())->skipToPage(newPos);
|
||
|
}
|
||
|
|
||
|
void KPrDocument::spellCheckParagraphDeleted( KoTextParag * /* _parag */, KPrTextObject * /* frm */ )
|
||
|
{
|
||
|
//m_bgSpellCheck->spellCheckParagraphDeleted( _parag, frm->textObject());
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateRulerInProtectContentMode()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>(it.current())->updateRulerInProtectContentMode();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updatePresentationButton()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>(it.current())->updatePresentationButton((selectedSlides().count()>0));
|
||
|
}
|
||
|
|
||
|
void KPrDocument::refreshGroupButton()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>(it.current())->refreshGroupButton();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::addView( KoView *_view )
|
||
|
{
|
||
|
KoDocument::addView( _view );
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>(it.current())->closeTextObject();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::removeView( KoView *_view )
|
||
|
{
|
||
|
KoDocument::removeView( _view );
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>(it.current())->deSelectAllObjects();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateStyleListOrder( const QStringList &list )
|
||
|
{
|
||
|
styleCollection()->updateStyleListOrder( list );
|
||
|
}
|
||
|
|
||
|
void KPrDocument::updateDirectCursorButton()
|
||
|
{
|
||
|
QPtrListIterator<KoView> it( views() );
|
||
|
for (; it.current(); ++it )
|
||
|
static_cast<KPrView*>(it.current())->updateDirectCursorButton();
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setInsertDirectCursor(bool _b)
|
||
|
{
|
||
|
m_bInsertDirectCursor=_b;
|
||
|
KConfig *config = KPrFactory::global()->config();
|
||
|
config->setGroup( "Interface" );
|
||
|
config->writeEntry( "InsertDirectCursor", _b );
|
||
|
updateDirectCursorButton();
|
||
|
}
|
||
|
|
||
|
KPrView *KPrDocument::firstView() const
|
||
|
{
|
||
|
if ( views().count()>0)
|
||
|
return static_cast<KPrView*>(views().getFirst());
|
||
|
else
|
||
|
return 0L;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::addWordToDictionary( const QString & word)
|
||
|
{
|
||
|
if ( m_bgSpellCheck )
|
||
|
{
|
||
|
if( m_spellCheckPersonalDict.findIndex( word ) == -1 )
|
||
|
m_spellCheckPersonalDict.append( word );
|
||
|
m_bgSpellCheck->settings()->setCurrentIgnoreList( m_spellCheckIgnoreList + m_spellCheckPersonalDict );
|
||
|
if ( backgroundSpellCheckEnabled() )
|
||
|
// Re-check everything to make this word normal again
|
||
|
reactivateBgSpellChecking();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
QValueList <KPrPage *> KPrDocument::customListPage( const QStringList & lst, bool loadOasis )
|
||
|
{
|
||
|
QStringList tmp( lst );
|
||
|
QValueList <KPrPage *> tmpValueList;
|
||
|
for ( QStringList::Iterator itList = tmp.begin(); itList != tmp.end(); ++itList )
|
||
|
{
|
||
|
for ( int i = 0; i < static_cast<int>( m_pageList.count() ); i++ )
|
||
|
{
|
||
|
//kdDebug()<<" insert page name :"<<*itList<<endl;
|
||
|
if ( loadOasis )
|
||
|
{
|
||
|
if ( m_pageList.at( i )->oasisNamePage(i+1)== ( *itList ) )
|
||
|
{
|
||
|
tmpValueList.append( m_pageList.at( i ) );
|
||
|
//kdDebug()<<" really insert\n";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( m_pageList.at( i )->pageTitle()== ( *itList ) )
|
||
|
{
|
||
|
tmpValueList.append( m_pageList.at( i ) );
|
||
|
//kdDebug()<<" really insert\n";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
return tmpValueList;
|
||
|
|
||
|
}
|
||
|
|
||
|
void KPrDocument::setCustomSlideShows( const CustomSlideShowMap & customSlideShows )
|
||
|
{
|
||
|
m_customListSlideShow = customSlideShows;
|
||
|
setModified( true );
|
||
|
}
|
||
|
|
||
|
QStringList KPrDocument::presentationList()
|
||
|
{
|
||
|
QStringList lst;
|
||
|
if ( !m_customListSlideShow.isEmpty() )
|
||
|
{
|
||
|
CustomSlideShowMap::Iterator it;
|
||
|
for ( it = m_customListSlideShow.begin(); it != m_customListSlideShow.end(); ++it )
|
||
|
lst << it.key();
|
||
|
}
|
||
|
return lst;
|
||
|
}
|
||
|
|
||
|
void KPrDocument::testCustomSlideShow( const QValueList<KPrPage *> &pages, KPrView *view )
|
||
|
{
|
||
|
delete m_customListTest;
|
||
|
m_customListTest = new QValueList<int>( listOfDisplaySelectedSlides( pages ) );
|
||
|
if ( view )
|
||
|
view->screenStartFromFirst();
|
||
|
|
||
|
}
|
||
|
|
||
|
void KPrDocument::clearTestCustomSlideShow()
|
||
|
{
|
||
|
delete m_customListTest;
|
||
|
m_customListTest = 0L;
|
||
|
}
|
||
|
|
||
|
|
||
|
#include "KPrDocument.moc"
|