summaryrefslogtreecommitdiffstats
path: root/filters/kpresenter/ooimpress/ooimpressexport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/kpresenter/ooimpress/ooimpressexport.cpp')
-rw-r--r--filters/kpresenter/ooimpress/ooimpressexport.cpp1160
1 files changed, 1160 insertions, 0 deletions
diff --git a/filters/kpresenter/ooimpress/ooimpressexport.cpp b/filters/kpresenter/ooimpress/ooimpressexport.cpp
new file mode 100644
index 000000000..507ba84e3
--- /dev/null
+++ b/filters/kpresenter/ooimpress/ooimpressexport.cpp
@@ -0,0 +1,1160 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Percy Leonhardt
+
+ 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 "ooimpressexport.h"
+
+#include <tqdom.h>
+#include <tqfile.h>
+#include <tqdatetime.h>
+
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <KoFilterChain.h>
+#include <KoGlobal.h>
+#include <KoUnit.h>
+
+typedef KGenericFactory<OoImpressExport, KoFilter> OoImpressExportFactory;
+K_EXPORT_COMPONENT_FACTORY( libooimpressexport, OoImpressExportFactory( "kofficefilters" ) )
+
+
+OoImpressExport::OoImpressExport( KoFilter *, const char *, const TQStringList & )
+ : KoFilter()
+ , m_currentPage( 0 )
+ , m_objectIndex( 0 )
+ , m_pageHeight( 0 )
+ , m_activePage( 0 )
+ , m_gridX( -1.0 )
+ , m_gridY( -1.0 )
+ , m_snapToGrid( false )
+ , m_pictureIndex( 0 )
+ , m_storeinp( 0L )
+ , m_storeout( 0L )
+{
+}
+
+OoImpressExport::~OoImpressExport()
+{
+ delete m_storeout;
+ delete m_storeinp;
+}
+
+KoFilter::ConversionStatus OoImpressExport::convert( const TQCString & from,
+ const TQCString & to )
+{
+ kdDebug(30518) << "Entering Ooimpress Export filter: " << from << " - " << to << endl;
+
+ if ( ( to != "application/vnd.sun.xml.impress") || (from != "application/x-kpresenter" ) )
+ {
+ kdWarning(30518) << "Invalid mimetypes " << to << " " << from << endl;
+ return KoFilter::NotImplemented;
+ }
+
+ // read in the KPresenter file
+ KoFilter::ConversionStatus preStatus = openFile();
+
+ if ( preStatus != KoFilter::OK )
+ return preStatus;
+
+ TQDomImplementation impl;
+ TQDomDocument meta( impl.createDocumentType( "office:document-meta",
+ "-//OpenOffice.org//DTD OfficeDocument 1.0//EN",
+ "office.dtd" ) );
+
+ createDocumentMeta( meta );
+
+ // store document meta
+ m_storeout = KoStore::createStore( m_chain->outputFile(), KoStore::Write, "", KoStore::Zip );
+
+ if ( !m_storeout )
+ {
+ kdWarning(30518) << "Couldn't open the requested file." << endl;
+ return KoFilter::FileNotFound;
+ }
+
+ if ( !m_storeout->open( "meta.xml" ) )
+ {
+ kdWarning(30518) << "Couldn't open the file 'meta.xml'." << endl;
+ return KoFilter::CreationError;
+ }
+
+ TQCString metaString = meta.toCString();
+ //kdDebug(30518) << "meta :" << metaString << endl;
+ m_storeout->write( metaString , metaString.length() );
+ m_storeout->close();
+
+ TQDomDocument content( impl.createDocumentType( "office:document-content",
+ "-//OpenOffice.org//DTD OfficeDocument 1.0//EN",
+ "office.dtd" ) );
+
+ createDocumentContent( content );
+
+ // add the automatic styles
+ m_styleFactory.addAutomaticStyles( content, m_styles );
+
+ // store document content
+ if ( !m_storeout->open( "content.xml" ) )
+ {
+ kdWarning(30518) << "Couldn't open the file 'content.xml'." << endl;
+ return KoFilter::CreationError;
+ }
+
+ TQCString contentString = content.toCString();
+ //kdDebug(30518) << "content :" << contentString << endl;
+ m_storeout->write( contentString , contentString.length() );
+ m_storeout->close();
+
+ TQDomDocument settings( impl.createDocumentType( "office:document-content",
+ "-//OpenOffice.org//DTD OfficeDocument 1.0//EN",
+ "office.dtd" ) );
+
+ createDocumentSettings( settings );
+
+ // store document content
+ if ( !m_storeout->open( "settings.xml" ) )
+ {
+ kdWarning(30518) << "Couldn't open the file 'settings.xml'." << endl;
+ return KoFilter::CreationError;
+ }
+
+ TQCString settingsString = settings.toCString();
+ //kdDebug(30518) << "content :" << settingsString << endl;
+ m_storeout->write( settingsString , settingsString.length() );
+ m_storeout->close();
+
+
+ TQDomDocument styles( impl.createDocumentType( "office:document-styles",
+ "-//OpenOffice.org//DTD OfficeDocument 1.0//EN",
+ "office.dtd" ) );
+
+ createDocumentStyles( styles );
+
+ // store document styles
+ if ( !m_storeout->open( "styles.xml" ) )
+ {
+ kdWarning(30518) << "Couldn't open the file 'styles.xml'." << endl;
+ return KoFilter::CreationError;
+ }
+
+ TQCString stylesString = styles.toCString();
+ //kdDebug(30518) << "styles :" << stylesString << endl;
+ m_storeout->write( stylesString , stylesString.length() );
+ m_storeout->close();
+
+ TQDomDocument manifest( impl.createDocumentType( "manifest:manifest",
+ "-//OpenOffice.org//DTD Manifest 1.0//EN",
+ "Manifest.dtd" ) );
+
+ createDocumentManifest( manifest );
+
+ // store document manifest
+ m_storeout->enterDirectory( "META-INF" );
+ if ( !m_storeout->open( "manifest.xml" ) )
+ {
+ kdWarning(30518) << "Couldn't open the file 'META-INF/manifest.xml'." << endl;
+ return KoFilter::CreationError;
+ }
+
+ TQCString manifestString = manifest.toCString();
+ //kdDebug(30518) << "manifest :" << manifestString << endl;
+ m_storeout->write( manifestString , manifestString.length() );
+ m_storeout->close();
+
+ return KoFilter::OK;
+}
+
+KoFilter::ConversionStatus OoImpressExport::openFile()
+{
+ m_storeinp = KoStore::createStore( m_chain->inputFile(), KoStore::Read );
+
+ if ( !m_storeinp )
+ {
+ kdWarning(30518) << "Couldn't open the requested file." << endl;
+ return KoFilter::FileNotFound;
+ }
+
+ if ( !m_storeinp->open( "maindoc.xml" ) )
+ {
+ kdWarning(30518) << "This file doesn't seem to be a valid KPresenter file" << endl;
+ return KoFilter::WrongFormat;
+ }
+
+ m_maindoc.setContent( m_storeinp->device() );
+ m_storeinp->close();
+
+ if ( m_storeinp->open( "documentinfo.xml" ) )
+ {
+ m_documentinfo.setContent( m_storeinp->device() );
+ m_storeinp->close();
+ }
+ else
+ kdWarning(30518) << "Documentinfo do not exist!" << endl;
+
+ emit sigProgress( 10 );
+
+ return KoFilter::OK;
+}
+
+void OoImpressExport::createDocumentMeta( TQDomDocument & docmeta )
+{
+ docmeta.appendChild( docmeta.createProcessingInstruction( "xml","version=\"1.0\" encoding=\"UTF-8\"" ) );
+
+ TQDomElement content = docmeta.createElement( "office:document-meta" );
+ content.setAttribute( "xmlns:office", "http://openoffice.org/2000/office" );
+ content.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" );
+ content.setAttribute( "xmlns:dc", "http://purl.org/dc/elements/1.1/" );
+ content.setAttribute( "xmlns:meta", "http://openoffice.org/2000/meta" );
+ content.setAttribute( "office:version", "1.0" );
+
+ TQDomNode meta = docmeta.createElement( "office:meta" );
+
+ TQDomElement generator = docmeta.createElement( "meta:generator" );
+ generator.appendChild( docmeta.createTextNode( "KPresenter 1.5" ) );
+ meta.appendChild( generator );
+
+ TQDomNode i = m_documentinfo.namedItem( "document-info" );
+ if ( !i.isNull() )
+ {
+ TQDomNode n = i.namedItem( "author" ).namedItem( "full-name" );
+ if ( !n.isNull() )
+ {
+ TQDomElement fullName = n.toElement();
+ TQDomElement creator = docmeta.createElement( "meta:initial-creator" );
+ creator.appendChild( docmeta.createTextNode( fullName.text() ) );
+ meta.appendChild( creator );
+
+ creator = docmeta.createElement( "meta:creator" );
+ creator.appendChild( docmeta.createTextNode( fullName.text() ) );
+ meta.appendChild( creator );
+ }
+ n = i.namedItem( "about" ).namedItem( "abstract" );
+ if ( !n.isNull() )
+ {
+ TQDomElement user = docmeta.createElement( "dc:description" );
+ user.appendChild( n.firstChild() );
+ meta.appendChild( user );
+ }
+ n = i.namedItem( "about" ).namedItem( "keyword" );
+ if ( !n.isNull() )
+ {
+ TQDomElement text = n.toElement();
+ TQDomElement key = docmeta.createElement( "meta:keywords" );
+ TQDomElement keyword = docmeta.createElement( "meta:keyword" );
+ key.appendChild( keyword );
+ keyword.appendChild( docmeta.createTextNode( text.text() ) );
+ meta.appendChild( key );
+ }
+ n = i.namedItem( "about" ).namedItem( "subject" );
+ if ( !n.isNull() )
+ {
+ TQDomElement text = n.toElement();
+ TQDomElement subjet = docmeta.createElement( "dc:subject" );
+ subjet.appendChild( docmeta.createTextNode( text.text() ) );
+ meta.appendChild( subjet );
+ }
+ n = i.namedItem( "about" ).namedItem( "title" );
+ if ( !n.isNull() )
+ {
+ TQDomElement text = n.toElement();
+ TQDomElement title = docmeta.createElement( "dc:title" );
+ title.appendChild( docmeta.createTextNode( text.text() ) );
+ meta.appendChild( title );
+ }
+ }
+
+// TQDomElement statistic = docmeta.createElement( "meta:document-statistic" );
+// statistic.setAttribute( "meta:object-count", 0 );
+// meta.appendChild( data );
+
+ content.appendChild( meta );
+ docmeta.appendChild( content );
+}
+
+void OoImpressExport::createDocumentStyles( TQDomDocument & docstyles )
+{
+ docstyles.appendChild( docstyles.createProcessingInstruction( "xml","version=\"1.0\" encoding=\"UTF-8\"" ) );
+
+ TQDomElement content = docstyles.createElement( "office:document-content" );
+ content.setAttribute( "xmlns:office", "http://openoffice.org/2000/office" );
+ content.setAttribute( "xmlns:style", "http://openoffice.org/2000/style" );
+ content.setAttribute( "xmlns:text", "http://openoffice.org/2000/text" );
+ content.setAttribute( "xmlns:table", "http://openoffice.org/2000/table" );
+ content.setAttribute( "xmlns:draw", "http://openoffice.org/2000/drawing" );
+ content.setAttribute( "xmlns:fo", "http://www.w3.org/1999/XSL/Format" );
+ content.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" );
+ content.setAttribute( "xmlns:number", "http://openoffice.org/2000/datastyle" );
+ content.setAttribute( "xmlns:svg", "http://www.w3.org/2000/svg" );
+ content.setAttribute( "xmlns:chart", "http://openoffice.org/2000/chart" );
+ content.setAttribute( "xmlns:dr3d", "http://openoffice.org/2000/dr3d" );
+ content.setAttribute( "xmlns:math", "http://www.w3.org/1998/Math/MathML" );
+ content.setAttribute( "xmlns:form", "http://openoffice.org/2000/form" );
+ content.setAttribute( "xmlns:script", "http://openoffice.org/2000/script" );
+ content.setAttribute( "office:version", "1.0" );
+
+ // order important here!
+ TQDomElement styles = docstyles.createElement( "office:styles" );
+ m_styleFactory.addOfficeStyles( docstyles, styles );
+ content.appendChild( styles );
+
+ TQDomElement automatic = docstyles.createElement( "office:automatic-styles" );
+ m_styleFactory.addOfficeAutomatic( docstyles, automatic );
+ content.appendChild( automatic );
+
+ TQDomElement master = docstyles.createElement( "office:master-styles" );
+ m_styleFactory.addOfficeMaster( docstyles, master );
+ content.appendChild( master );
+
+ docstyles.appendChild( content );
+}
+
+void OoImpressExport::createDocumentSettings( TQDomDocument & docsetting )
+{
+ docsetting.appendChild( docsetting.createProcessingInstruction( "xml","version=\"1.0\" encoding=\"UTF-8\"" ) );
+
+ TQDomElement setting = docsetting.createElement( "office:document-settings" );
+ setting.setAttribute( "xmlns:office", "http://openoffice.org/2000/office");
+ setting.setAttribute( "xmlns:config", "http://openoffice.org/2001/config" );
+ setting.setAttribute( "office:class", "presentation" );
+ setting.setAttribute( "office:version", "1.0" );
+
+ TQDomElement begin = docsetting.createElement( "office:settings" );
+
+ TQDomElement configItem = docsetting.createElement("config:config-item-set" );
+ configItem.setAttribute( "config:name", "view-settings" );
+
+ TQDomElement mapIndexed = docsetting.createElement( "config:config-item-map-indexed" );
+ mapIndexed.setAttribute("config:name", "Views" );
+ configItem.appendChild( mapIndexed );
+
+ //<config:config-item-map-indexed config:name="Views">
+
+ TQDomElement mapItem = docsetting.createElement("config:config-item-map-entry" );
+
+ TQDomElement attribute = docsetting.createElement("config:config-item" );
+ attribute.setAttribute( "config:name", "SnapLinesDrawing" );
+ attribute.setAttribute( "config:type", "string" );
+ attribute.appendChild( docsetting.createTextNode( m_helpLine ) );
+ mapItem.appendChild( attribute );
+ //<config:config-item config:name="SnapLinesDrawing" config:type="string">H5983V700V10777H4518V27601P50000,9000P8021,2890</config:config-item>
+
+ attribute = docsetting.createElement("config:config-item" );
+ attribute.setAttribute( "config:name", "IsSnapToGrid" );
+ attribute.setAttribute( "config:type", "boolean" );
+ attribute.appendChild( docsetting.createTextNode( m_snapToGrid ? "true" : "false" ) );
+ mapItem.appendChild( attribute );
+
+ if ( m_gridX >=0 )
+ {
+ attribute = docsetting.createElement("config:config-item" );
+ attribute.setAttribute( "config:name", "GridFineWidth" );
+ attribute.setAttribute( "config:type", "int" );
+ attribute.appendChild( docsetting.createTextNode( TQString::number( ( int ) ( KoUnit::toMM( ( m_gridX ) )*100 ) ) ) );
+ mapItem.appendChild( attribute );
+ }
+
+ if ( m_gridY >=0 )
+ {
+ attribute = docsetting.createElement("config:config-item" );
+ attribute.setAttribute( "config:name", "GridFineHeight" );
+ attribute.setAttribute( "config:type", "int" );
+ attribute.appendChild( docsetting.createTextNode( TQString::number( ( int ) ( KoUnit::toMM( ( m_gridY ) )*100 ) ) ) );
+ mapItem.appendChild( attribute );
+ }
+
+ attribute = docsetting.createElement("config:config-item" );
+ attribute.setAttribute( "config:name", "SelectedPage" );
+ attribute.setAttribute( "config:type", "short" );
+ attribute.appendChild( docsetting.createTextNode( TQString::number( m_activePage ) ) );
+ mapItem.appendChild( attribute );
+
+
+ mapIndexed.appendChild( mapItem );
+
+ begin.appendChild( configItem );
+
+ setting.appendChild( begin );
+
+
+ docsetting.appendChild( setting );
+
+}
+
+void OoImpressExport::createDocumentContent( TQDomDocument & doccontent )
+{
+ doccontent.appendChild( doccontent.createProcessingInstruction( "xml","version=\"1.0\" encoding=\"UTF-8\"" ) );
+
+ TQDomElement content = doccontent.createElement( "office:document-content" );
+ content.setAttribute( "xmlns:office", "http://openoffice.org/2000/office");
+ content.setAttribute( "xmlns:style", "http://openoffice.org/2000/style" );
+ content.setAttribute( "xmlns:text", "http://openoffice.org/2000/text" );
+ content.setAttribute( "xmlns:table", "http://openoffice.org/2000/table" );
+ content.setAttribute( "xmlns:draw", "http://openoffice.org/2000/drawing" );
+ content.setAttribute( "xmlns:fo", "http://www.w3.org/1999/XSL/Format" );
+ content.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" );
+ content.setAttribute( "xmlns:number", "http://openoffice.org/2000/datastyle" );
+ content.setAttribute( "xmlns:svg", "http://www.w3.org/2000/svg" );
+ content.setAttribute( "xmlns:chart", "http://openoffice.org/2000/chart" );
+ content.setAttribute( "xmlns:dr3d", "http://openoffice.org/2000/dr3d" );
+ content.setAttribute( "xmlns:math", "http://www.w3.org/1998/Math/MathML" );
+ content.setAttribute( "xmlns:form", "http://openoffice.org/2000/form" );
+ content.setAttribute( "xmlns:script", "http://openoffice.org/2000/script" );
+ content.setAttribute( "xmlns:presentation", "http://openoffice.org/2000/presentation" );
+ content.setAttribute( "office:class", "presentation" );
+ content.setAttribute( "office:version", "1.0" );
+
+ TQDomElement script = doccontent.createElement( "office:script" );
+ content.appendChild( script );
+
+ m_styles = doccontent.createElement( "office:automatic-styles" );
+ content.appendChild( m_styles );
+
+ TQDomElement body = doccontent.createElement( "office:body" );
+ exportBody( doccontent, body );
+ content.appendChild( body );
+
+ doccontent.appendChild( content );
+}
+
+void OoImpressExport::createDocumentManifest( TQDomDocument & docmanifest )
+{
+ docmanifest.appendChild( docmanifest.createProcessingInstruction( "xml","version=\"1.0\" encoding=\"UTF-8\"" ) );
+
+ TQDomElement manifest = docmanifest.createElement( "manifest:manifest" );
+ manifest.setAttribute( "xmlns:manifest", "http://openoffice.org/2001/manifest" );
+
+ TQDomElement entry = docmanifest.createElement( "manifest:file-entry" );
+ entry.setAttribute( "manifest:media-type", "application/vnd.sun.xml.impress" );
+ entry.setAttribute( "manifest:full-path", "/" );
+ manifest.appendChild( entry );
+
+ TQMap<TQString, TQString>::Iterator it;
+ for ( it = m_pictureLst.begin(); it != m_pictureLst.end(); ++it )
+ {
+ entry = docmanifest.createElement( "manifest:file-entry" );
+ entry.setAttribute( "manifest:media-type", it.data() );
+ entry.setAttribute( "manifest:full-path", it.key() );
+ manifest.appendChild( entry );
+ }
+
+ entry = docmanifest.createElement( "manifest:file-entry" );
+ entry.setAttribute( "manifest:media-type", "text/xml" );
+ entry.setAttribute( "manifest:full-path", "content.xml" );
+ manifest.appendChild( entry );
+
+ entry = docmanifest.createElement( "manifest:file-entry" );
+ entry.setAttribute( "manifest:media-type", "text/xml" );
+ entry.setAttribute( "manifest:full-path", "styles.xml" );
+ manifest.appendChild( entry );
+
+ entry = docmanifest.createElement( "manifest:file-entry" );
+ entry.setAttribute( "manifest:media-type", "text/xml" );
+ entry.setAttribute( "manifest:full-path", "meta.xml" );
+ manifest.appendChild( entry );
+
+ entry = docmanifest.createElement( "manifest:file-entry" );
+ entry.setAttribute( "manifest:media-type", "text/xml" );
+ entry.setAttribute( "manifest:full-path", "settings.xml" );
+ manifest.appendChild( entry );
+
+ docmanifest.appendChild( manifest );
+}
+
+TQString OoImpressExport::pictureKey( TQDomElement &elem )
+{
+ // Default date/time is the *nix epoch: 1970-01-01 00:00:00,000
+ int year=1970, month=1, day=1;
+ int hour=0, minute=0, second=0, msec=0; // We must initialize to zero, as not all compilers are C99-compliant
+ if ( elem.tagName() == "KEY" )
+ {
+ if( elem.hasAttribute( "year" ) )
+ year=elem.attribute( "year" ).toInt();
+ if( elem.hasAttribute( "month" ) )
+ month=elem.attribute( "month" ).toInt();
+ if( elem.hasAttribute( "day" ) )
+ day=elem.attribute( "day" ).toInt();
+ if( elem.hasAttribute( "hour" ) )
+ hour=elem.attribute( "hour" ).toInt();
+ if( elem.hasAttribute( "minute" ) )
+ minute=elem.attribute( "minute" ).toInt();
+ if( elem.hasAttribute( "second" ) )
+ second=elem.attribute( "second" ).toInt();
+ if( elem.hasAttribute( "msec" ) )
+ msec=elem.attribute( "msec" ).toInt();
+ }
+ TQDateTime key;
+ key.setDate( TQDate( year, month, day ) );
+ key.setTime( TQTime( hour, minute, second, msec ) );
+ return key.toString();
+}
+
+void OoImpressExport::createPictureList( TQDomNode &pictures )
+{
+ pictures = pictures.firstChild();
+ for( ; !pictures.isNull(); pictures = pictures.nextSibling() )
+ {
+ if ( pictures.isElement() )
+ {
+ TQDomElement element = pictures.toElement();
+ if ( element.tagName() == "KEY" )
+ {
+ //kdDebug(30518)<<"element.attribute( name ) :"<<element.attribute( "name" )<<endl;
+ m_kpresenterPictureLst.insert( pictureKey( element ), element.attribute( "name" ) );
+ }
+ else
+ kdDebug(30518)<<" Tag not recognize :"<<element.tagName()<<endl;
+ }
+ }
+}
+
+void OoImpressExport::createAttribute( TQDomNode &attributeValue )
+{
+ TQDomElement elem = attributeValue.toElement();
+ if(elem.hasAttribute("activePage"))
+ m_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_snapToGrid = (bool)elem.attribute("snaptogrid").toInt();
+}
+
+void OoImpressExport::createHelpLine( TQDomNode &helpline )
+{
+ helpline = helpline.firstChild();
+ TQDomElement helplines;
+ for( ; !helpline.isNull(); helpline = helpline.nextSibling() )
+ {
+ if ( helpline.isElement() )
+ {
+ helplines = helpline.toElement();
+ if ( helplines.tagName()=="Vertical" )
+ {
+ int tmpX = ( int ) ( KoUnit::toMM( helplines.attribute("value").toDouble() )*100 );
+ m_helpLine+="V"+TQString::number( tmpX );
+ }
+ else if ( helplines.tagName()=="Horizontal" )
+ {
+ int tmpY = ( int ) ( KoUnit::toMM( helplines.attribute("value").toDouble() )*100 );
+ m_helpLine+="H"+TQString::number( tmpY );
+ }
+ else if ( helplines.tagName()=="HelpPoint" )
+ {
+ TQString str( "P%1,%2" );
+ int tmpX = ( int ) ( KoUnit::toMM( helplines.attribute("posX").toDouble() )*100 );
+ int tmpY = ( int ) ( KoUnit::toMM( helplines.attribute("posY").toDouble() )*100 );
+ m_helpLine+=str.arg( TQString::number( tmpX ) ).arg( TQString::number( tmpY ) );
+ }
+ }
+ }
+ //kdDebug(30518)<<"m_helpLine :"<<m_helpLine<<endl;
+}
+
+
+void OoImpressExport::exportBody( TQDomDocument & doccontent, TQDomElement & body )
+{
+ TQDomNode doc = m_maindoc.namedItem( "DOC" );
+ TQDomNode paper = doc.namedItem( "PAPER" );
+ TQDomNode background = doc.namedItem( "BACKGROUND" );
+ TQDomNode header = doc.namedItem( "HEADER" );
+ TQDomNode footer = doc.namedItem( "FOOTER" );
+ TQDomNode titles = doc.namedItem( "PAGETITLES" );
+ TQDomNode notes = doc.namedItem( "PAGENOTES" );
+ TQDomNode objects = doc.namedItem( "OBJECTS" );
+ TQDomNode pictures = doc.namedItem( "PICTURES" );
+ TQDomNode sounds = doc.namedItem( "SOUNDS" );
+ TQDomNode helpline = doc.namedItem( "HELPLINES" );
+ TQDomNode attributeValue = doc.namedItem( "ATTRIBUTES" );
+ TQDomNode infiniLoop = doc.namedItem( "INFINITLOOP" );
+ TQDomNode manualSwitch = doc.namedItem( "MANUALSWITCH" );
+ TQDomNode customSlideShow = doc.namedItem( "CUSTOMSLIDESHOWCONFIG" );
+ TQDomNode customSlideShowDefault = doc.namedItem( "DEFAULTCUSTOMSLIDESHOWNAME" );
+
+ TQDomNode bgpage = background.firstChild();
+
+ createPictureList( pictures );
+
+ createHelpLine( helpline );
+
+ createAttribute( attributeValue );
+
+ // store the paper settings
+ TQDomElement p = paper.toElement();
+ m_masterPageStyle = m_styleFactory.createPageMasterStyle( p );
+ m_pageHeight = p.attribute( "ptHeight" ).toFloat();
+
+ m_currentPage = 1;
+
+ // parse all pages
+ TQDomNode note = notes.firstChild();
+ for ( TQDomNode title = titles.firstChild(); !title.isNull() && !note.isNull();
+ title = title.nextSibling(), note = note.nextSibling() )
+ {
+ // create the page style and ignore the fact that there may
+ // be less backgrounds than pages
+ TQDomElement bg = bgpage.toElement();
+ TQString ps = m_styleFactory.createPageStyle( bg );
+ bgpage = bgpage.nextSibling();
+
+ TQDomElement t = title.toElement();
+ TQDomElement drawPage = doccontent.createElement( "draw:page" );
+ drawPage.setAttribute( "draw:name", t.attribute( "title" ) );
+ drawPage.setAttribute( "draw:style-name", ps );
+ drawPage.setAttribute( "draw:id", m_currentPage );
+ drawPage.setAttribute( "draw:master-page-name", m_masterPageStyle );
+
+ appendObjects( doccontent, objects, drawPage );
+
+ TQDomElement noteElement = note.toElement();
+ appendNote( doccontent, noteElement, drawPage );
+ body.appendChild( drawPage );
+ m_currentPage++;
+ }
+ int infiniLoopValue = -1;
+ int manualSwitchValue = -1;
+ if ( !infiniLoop.isNull() && infiniLoop.toElement().hasAttribute( "value" ))
+ {
+ bool ok;
+ int val = infiniLoop.toElement().attribute( "value" ).toInt( &ok );
+ if ( ok )
+ infiniLoopValue = val;
+ }
+ if ( !manualSwitch.isNull() && manualSwitch.toElement().hasAttribute( "value" ))
+ {
+ bool ok;
+ int val = manualSwitch.toElement().attribute( "value" ).toInt( &ok );
+ if ( ok )
+ manualSwitchValue = val;
+ }
+ if ( infiniLoopValue != -1 || manualSwitchValue != -1 || !customSlideShowDefault.isNull())
+ {
+ TQDomElement settings = doccontent.createElement( "presentation:settings" );
+ if ( infiniLoopValue !=-1 )
+ settings.setAttribute( "presentation:force-manual", ( manualSwitchValue==1 ) ? "true" : "false" );
+ if ( manualSwitchValue != -1 )
+ settings.setAttribute( "presentation:endless", ( infiniLoopValue==1 ) ? "true": "false" );
+ if ( !customSlideShowDefault.isNull() )
+ settings.setAttribute( "presentation:show", customSlideShowDefault.toElement().attribute( "name" ) );
+
+ if ( !customSlideShow.isNull() )
+ {
+ for ( TQDomNode customPage = customSlideShow.firstChild(); !customPage.isNull();
+ customPage = customPage.nextSibling() )
+ {
+ TQDomElement show = customPage.toElement();
+ if ( !show.isNull() && show.tagName()=="CUSTOMSLIDESHOW" )
+ {
+ TQDomElement showElement = doccontent.createElement( "presentation:show" );
+ showElement.setAttribute( "presentation:name",show.attribute( "name" ) );
+ showElement.setAttribute( "presentation:pages",show.attribute( "pages" ) );
+ settings.appendChild( showElement );
+ }
+ }
+ }
+ body.appendChild( settings );
+ }
+}
+
+
+void OoImpressExport::appendObjects(TQDomDocument & doccontent, TQDomNode &objects, TQDomElement &drawPage)
+{
+ // I am not sure if objects are always stored sorted so I parse all
+ // of them to find the ones belonging to a certain page.
+ for ( TQDomNode object = objects.firstChild(); !object.isNull();
+ object = object.nextSibling() )
+ {
+ TQDomElement o = object.toElement();
+
+ TQDomElement orig = o.namedItem( "ORIG" ).toElement();
+ float y = orig.attribute( "y" ).toFloat();
+
+ if ( y < m_pageHeight * ( m_currentPage - 1 ) ||
+ y >= m_pageHeight * m_currentPage )
+ continue; // object not on current page
+
+ switch( o.attribute( "type" ).toInt() )
+ {
+ case 0: // image
+ appendPicture( doccontent, o, drawPage );
+ break;
+ case 1: // line
+ appendLine( doccontent, o, drawPage );
+ break;
+ case 2: // rectangle
+ appendRectangle( doccontent, o, drawPage );
+ break;
+ case 3: // circle, ellipse
+ appendEllipse( doccontent, o, drawPage );
+ break;
+ case 4: // textbox
+ appendTextbox( doccontent, o, drawPage );
+ break;
+ case 5:
+ kdDebug(30518)<<" autoform not implemented\n";
+ break;
+ case 6:
+ kdDebug(30518)<<" clipart not implemented\n";
+ break;
+ case 8: // pie, chord, arc
+ appendEllipse( doccontent, o, drawPage, true );
+ break;
+ case 9: //part
+ kdDebug(30518)<<" part object not implemented \n";
+ break;
+ case 10:
+ appendGroupObject( doccontent, o, drawPage );
+ break;
+ case 11:
+ kdDebug(30518)<<" free hand not implemented\n";
+ break;
+ case 12: // polyline
+ appendPolyline( doccontent, o, drawPage );
+ break;
+ case 13: //OT_QUADRICBEZIERCURVE = 13
+ case 14: //OT_CUBICBEZIERCURVE = 14
+ //todo
+ // "draw:path"
+ break;
+ case 15: // polygon
+ case 16: // close polygone
+ appendPolyline( doccontent, o, drawPage, true /*polygon*/ );
+ break;
+ }
+ ++m_objectIndex;
+ }
+
+}
+
+void OoImpressExport::appendGroupObject( TQDomDocument & doc, TQDomElement & source, TQDomElement & target )
+{
+ TQDomElement groupElement = doc.createElement( "draw:g" );
+ TQDomNode objects = source.namedItem( "OBJECTS" );
+ appendObjects( doc, objects, groupElement);
+ target.appendChild( groupElement );
+}
+
+void OoImpressExport::appendNote( TQDomDocument & doc, TQDomElement & source, TQDomElement & target )
+{
+ TQString noteText = source.attribute("note");
+ //kdDebug(30518)<<"noteText :"<<noteText<<endl;
+ if ( noteText.isEmpty() )
+ return;
+ TQDomElement noteElement = doc.createElement( "presentation:notes" );
+ TQDomElement noteTextBox = doc.createElement( "draw:text-box" );
+
+ //TODO : add draw:text-box size :
+ //<draw:text-box draw:style-name="gr2" draw:text-style-name="P2" draw:layer="layout" svg:width="13.336cm" svg:height="56.288cm" svg:x="-0.54cm" svg:y="-14.846cm">
+
+ TQStringList text = TQStringList::split( "\n", noteText );
+ for ( TQStringList::Iterator it = text.begin(); it != text.end(); ++it ) {
+ TQDomElement tmp = doc.createElement( "text:p" );
+ tmp.appendChild( doc.createTextNode( *it ) );
+ noteTextBox.appendChild( tmp );
+ }
+ noteElement.appendChild( noteTextBox );
+ target.appendChild( noteElement );
+}
+
+void OoImpressExport::appendTextbox( TQDomDocument & doc, TQDomElement & source, TQDomElement & target )
+{
+ TQDomElement textbox = doc.createElement( "draw:text-box" );
+
+ TQDomNode textobject = source.namedItem( "TEXTOBJ" );
+
+ // create the graphic style
+ TQString gs = m_styleFactory.createGraphicStyle( source );
+ textbox.setAttribute( "draw:style-name", gs );
+
+ // set the geometry
+ set2DGeometry( source, textbox );
+
+ // parse every paragraph
+ for ( TQDomNode paragraph = textobject.firstChild(); !paragraph.isNull();
+ paragraph = paragraph.nextSibling() )
+ {
+ TQDomElement p = paragraph.toElement();
+ appendParagraph( doc, p, textbox );
+ }
+
+ target.appendChild( textbox );
+}
+
+void OoImpressExport::appendParagraph( TQDomDocument & doc, TQDomElement & source, TQDomElement & target )
+{
+ TQDomElement paragraph = doc.createElement( "text:p" );
+
+ // create the paragraph style
+ TQString ps = m_styleFactory.createParagraphStyle( source );
+ paragraph.setAttribute( "text:style-name", ps );
+
+ // parse every text element
+ for ( TQDomNode text = source.firstChild(); !text.isNull();
+ text = text.nextSibling() )
+ {
+ if ( text.nodeName() == "TEXT" )
+ {
+ TQDomElement t = text.toElement();
+ appendText( doc, t, paragraph );
+ }
+ }
+
+ // take care of lists
+ TQDomNode counter = source.namedItem( "COUNTER" );
+ if ( !counter.isNull() )
+ {
+ TQDomElement c = counter.toElement();
+ int type = c.attribute( "type" ).toInt();
+
+ int level = 1;
+ if ( c.hasAttribute( "depth" ) )
+ level = c.attribute( "depth" ).toInt() + 1;
+
+ TQDomElement endOfList = target;
+ for ( int l = 0; l < level; l++ )
+ {
+ TQDomElement list;
+ if ( type == 1 )
+ {
+ list = doc.createElement( "text:ordered-list" );
+ list.setAttribute( "text:continue-numbering", "true" );
+ }
+ else
+ list = doc.createElement( "text:unordered-list" );
+
+ if ( l == 0 )
+ {
+ // create the list style
+ TQString ls = m_styleFactory.createListStyle( c );
+ list.setAttribute( "text:style-name", ls );
+ }
+
+ TQDomElement item = doc.createElement( "text:list-item" );
+ list.appendChild( item );
+ endOfList.appendChild( list );
+ endOfList = item;
+ }
+
+ endOfList.appendChild( paragraph );
+ }
+ else
+ target.appendChild( paragraph );
+}
+
+void OoImpressExport::appendText( TQDomDocument & doc, TQDomElement & source, TQDomElement & target )
+{
+ TQDomElement textspan = doc.createElement( "text:span" );
+
+ // create the text style
+ TQString ts = m_styleFactory.createTextStyle( source );
+ textspan.setAttribute( "text:style-name", ts );
+
+ textspan.appendChild( doc.createTextNode( source.text() ) );
+ target.appendChild( textspan );
+}
+
+void OoImpressExport::appendPicture( TQDomDocument & doc, TQDomElement & source, TQDomElement & target )
+{
+ TQDomElement image = doc.createElement( "draw:image" );
+
+ // create the graphic style
+ TQString gs = m_styleFactory.createGraphicStyle( source );
+ image.setAttribute( "draw:style-name", gs );
+ TQDomElement key = source.namedItem( "KEY" ).toElement();
+
+ TQString pictureName = TQString( "Picture/Picture%1" ).arg( m_pictureIndex );
+
+ image.setAttribute( "xlink:type", "simple" );
+ image.setAttribute( "xlink:show", "embed" );
+ image.setAttribute( "xlink:actuate", "onLoad");
+
+ if ( !key.isNull() )
+ {
+ TQString str = pictureKey( key );
+ TQString returnstr = m_kpresenterPictureLst[str];
+ const int pos=returnstr.findRev('.');
+ if (pos!=-1)
+ {
+ const TQString extension( returnstr.mid(pos+1) );
+ pictureName +="."+extension;
+ }
+
+ if ( m_storeinp->open( returnstr ) )
+ {
+ if ( m_storeout->open( pictureName ) )
+ {
+ TQByteArray data(8*1024);
+ uint total = 0;
+ for ( int block = 0; ( block = m_storeinp->read(data.data(), data.size()) ) > 0;
+ total += block )
+ m_storeout->write(data.data(), data.size());
+ m_storeout->close();
+ m_storeinp->close();
+ }
+ }
+ }
+ image.setAttribute( "xlink:href", "#" + pictureName );
+
+// set the geometry
+ set2DGeometry( source, image );
+ target.appendChild( image );
+
+ m_pictureLst.insert( pictureName , "image/png" );
+
+ ++m_pictureIndex;
+}
+
+
+void OoImpressExport::appendLine( TQDomDocument & doc, TQDomElement & source, TQDomElement & target )
+{
+ TQDomElement line = doc.createElement( "draw:line" );
+
+ // create the graphic style
+ TQString gs = m_styleFactory.createGraphicStyle( source );
+ line.setAttribute( "draw:style-name", gs );
+
+ // set the geometry
+ setLineGeometry( source, line );
+
+ target.appendChild( line );
+}
+
+void OoImpressExport::appendRectangle( TQDomDocument & doc, TQDomElement & source, TQDomElement & target )
+{
+ TQDomElement rectangle = doc.createElement( "draw:rect" );
+
+ // create the graphic style
+ TQString gs = m_styleFactory.createGraphicStyle( source );
+ rectangle.setAttribute( "draw:style-name", gs );
+
+ // set the geometry
+ set2DGeometry( source, rectangle );
+
+ target.appendChild( rectangle );
+}
+
+void OoImpressExport::appendPolyline( TQDomDocument & doc, TQDomElement & source, TQDomElement & target, bool _poly)
+{
+ TQDomElement polyline = doc.createElement( _poly ? "draw:polygon" : "draw:polyline" );
+
+ // create the graphic style
+ TQString gs = m_styleFactory.createGraphicStyle( source );
+ polyline.setAttribute( "draw:style-name", gs );
+
+ // set the geometry
+ set2DGeometry( source, polyline, false, true /*multipoint*/ );
+
+ target.appendChild( polyline );
+}
+
+void OoImpressExport::appendEllipse( TQDomDocument & doc, TQDomElement & source, TQDomElement & target, bool pieObject )
+{
+ TQDomElement size = source.namedItem( "SIZE" ).toElement();
+
+ double width = size.attribute( "width" ).toDouble();
+ double height = size.attribute( "height" ).toDouble();
+
+ TQDomElement ellipse = doc.createElement( (width == height) ? "draw:circle" : "draw:ellipse" );
+
+ // create the graphic style
+ TQString gs = m_styleFactory.createGraphicStyle( source );
+ ellipse.setAttribute( "draw:style-name", gs );
+
+ // set the geometry
+ set2DGeometry( source, ellipse, pieObject );
+
+ target.appendChild( ellipse );
+}
+
+void OoImpressExport::set2DGeometry( TQDomElement & source, TQDomElement & target, bool pieObject, bool multiPoint )
+{
+ TQDomElement orig = source.namedItem( "ORIG" ).toElement();
+ TQDomElement size = source.namedItem( "SIZE" ).toElement();
+ TQDomElement name = source.namedItem( "OBJECTNAME").toElement();
+ float y = orig.attribute( "y" ).toFloat();
+ y -= m_pageHeight * ( m_currentPage - 1 );
+
+ TQDomElement angle = source.namedItem( "ANGLE").toElement();
+ if ( !angle.isNull() )
+ {
+ TQString returnAngle = rotateValue( angle.attribute( "value" ).toDouble() );
+ if ( !returnAngle.isEmpty() )
+ target.setAttribute("draw:transform",returnAngle );
+ }
+
+ target.setAttribute( "draw:id", TQString::number( m_objectIndex ) );
+ target.setAttribute( "svg:x", StyleFactory::toCM( orig.attribute( "x" ) ) );
+ target.setAttribute( "svg:y", TQString( "%1cm" ).arg( KoUnit::toCM( y ) ) );
+ target.setAttribute( "svg:width", StyleFactory::toCM( size.attribute( "width" ) ) );
+ target.setAttribute( "svg:height", StyleFactory::toCM( size.attribute( "height" ) ) );
+ TQString nameStr = name.attribute("objectName");
+ if( !nameStr.isEmpty() )
+ target.setAttribute( "draw:name", nameStr );
+ if ( pieObject )
+ {
+ TQDomElement pie = source.namedItem( "PIETYPE").toElement();
+ if( !pie.isNull() )
+ {
+ int typePie = pie.attribute("value").toInt();
+ switch( typePie )
+ {
+ case 0:
+ target.setAttribute( "draw:kind", "section");
+ break;
+ case 1:
+ target.setAttribute( "draw:kind", "arc");
+ break;
+ case 2:
+ target.setAttribute( "draw:kind", "cut");
+ break;
+ default:
+ kdDebug(30518)<<" type unknown : "<<typePie<<endl;
+ break;
+ }
+ }
+ else
+ target.setAttribute( "draw:kind", "section");//by default
+ TQDomElement pieAngle = source.namedItem( "PIEANGLE").toElement();
+ int startangle = 45;
+ if( !pieAngle.isNull() )
+ {
+ startangle = (pieAngle.attribute("value").toInt())/16;
+ target.setAttribute( "draw:start-angle", startangle);
+ }
+ else
+ {
+ //default value take it into kppieobject
+ target.setAttribute( "draw:start-angle", 45 );
+ }
+ TQDomElement pieLength = source.namedItem( "PIELENGTH").toElement();
+ if( !pieLength.isNull() )
+ {
+ int value = pieLength.attribute("value").toInt();
+ value = value /16;
+ value = value + startangle;
+ target.setAttribute( "draw:end-angle", value );
+ }
+ else
+ {
+ //default value take it into kppieobject
+ //default is 90° into kpresenter
+ target.setAttribute( "draw:end-angle", (90+startangle) );
+ }
+ }
+ if ( multiPoint )
+ {
+ //loadPoint
+ TQDomElement point = source.namedItem( "POINTS" ).toElement();
+ if ( !point.isNull() ) {
+ TQDomElement elemPoint = point.firstChild().toElement();
+ TQString listOfPoint;
+ int maxX=0;
+ int maxY=0;
+ while ( !elemPoint.isNull() ) {
+ if ( elemPoint.tagName() == "Point" ) {
+ int tmpX = 0;
+ int tmpY = 0;
+ if( elemPoint.hasAttribute( "point_x" ) )
+ tmpX = ( int ) ( KoUnit::toMM( elemPoint.attribute( "point_x" ).toDouble() )*100 );
+ if( elemPoint.hasAttribute( "point_y" ) )
+ tmpY = ( int ) ( KoUnit::toMM(elemPoint.attribute( "point_y" ).toDouble() )*100 );
+ if ( !listOfPoint.isEmpty() )
+ listOfPoint += TQString( " %1,%2" ).arg( tmpX ).arg( tmpY );
+ else
+ listOfPoint = TQString( "%1,%2" ).arg( tmpX ).arg( tmpY );
+ maxX = TQMAX( maxX, tmpX );
+ maxY = TQMAX( maxY, tmpY );
+ }
+ elemPoint = elemPoint.nextSibling().toElement();
+ }
+ target.setAttribute( "draw:points", listOfPoint );
+ target.setAttribute( "svg:viewBox", TQString( "0 0 %1 %2" ).arg( maxX ).arg( maxY ) );
+ }
+ }
+}
+
+TQString OoImpressExport::rotateValue( double val )
+{
+ TQString str;
+ if ( val!=0.0 )
+ {
+ double value = -1 * ( ( double )val* M_PI )/180.0;
+ str=TQString( "rotate (%1)" ).arg( value );
+ }
+ return str;
+}
+
+
+void OoImpressExport::setLineGeometry( TQDomElement & source, TQDomElement & target )
+{
+ TQDomElement orig = source.namedItem( "ORIG" ).toElement();
+ TQDomElement size = source.namedItem( "SIZE" ).toElement();
+ TQDomElement linetype = source.namedItem( "LINETYPE" ).toElement();
+ TQDomElement name = source.namedItem( "OBJECTNAME").toElement();
+ TQDomElement angle = source.namedItem( "ANGLE").toElement();
+ if ( !angle.isNull() )
+ {
+ TQString returnAngle = rotateValue( angle.attribute( "value" ).toDouble() );
+ if ( !returnAngle.isEmpty() )
+ target.setAttribute("draw:transform",returnAngle );
+ }
+ float x1 = orig.attribute( "x" ).toFloat();
+ float y1 = orig.attribute( "y" ).toFloat();
+ float x2 = size.attribute( "width" ).toFloat();
+ float y2 = size.attribute( "height" ).toFloat();
+ int type = 0;
+ if ( !linetype.isNull() )
+ type = linetype.attribute( "value" ).toInt();
+ y1 -= m_pageHeight * ( m_currentPage - 1 );
+ x2 += x1;
+ y2 += y1;
+
+ target.setAttribute( "draw:id", TQString::number( m_objectIndex ) );
+ TQString xpos1 = StyleFactory::toCM( orig.attribute( "x" ) );
+ TQString xpos2 = TQString( "%1cm" ).arg( KoUnit::toCM( x2 ) );
+
+ if ( type == 0 )
+ {
+ target.setAttribute( "svg:y1", TQString( "%1cm" ).arg( KoUnit::toCM( y2/2.0 ) ) );
+ target.setAttribute( "svg:y2", TQString( "%1cm" ).arg( KoUnit::toCM( y2/2.0 ) ) );
+ }
+ else if ( type == 1 )
+ {
+ target.setAttribute( "svg:y1", TQString( "%1cm" ).arg( KoUnit::toCM( y1 ) ) );
+ target.setAttribute( "svg:y2", TQString( "%1cm" ).arg( KoUnit::toCM( y2 ) ) );
+ xpos1 = TQString( "%1cm" ).arg( KoUnit::toCM( x1/2.0 ) );
+ xpos2 = xpos1;
+ }
+ else if ( type == 3 ) // from left bottom to right top
+ {
+ target.setAttribute( "svg:y1", TQString( "%1cm" ).arg( KoUnit::toCM( y2 ) ) );
+ target.setAttribute( "svg:y2", TQString( "%1cm" ).arg( KoUnit::toCM( y1 ) ) );
+ }
+ else // from left top to right bottom
+ {
+ target.setAttribute( "svg:y1", TQString( "%1cm" ).arg( KoUnit::toCM( y1 ) ) );
+ target.setAttribute( "svg:y2", TQString( "%1cm" ).arg( KoUnit::toCM( y2 ) ) );
+ }
+ target.setAttribute( "svg:x1", xpos1 );
+ target.setAttribute( "svg:x2", xpos2 );
+
+ TQString nameStr = name.attribute("objectName");
+ if( !nameStr.isEmpty() )
+ target.setAttribute( "draw:name", nameStr );
+}
+
+#include "ooimpressexport.moc"