diff options
Diffstat (limited to 'filters/kpresenter/powerpoint/import/powerpointimport.cpp')
-rw-r--r-- | filters/kpresenter/powerpoint/import/powerpointimport.cpp | 1592 |
1 files changed, 1592 insertions, 0 deletions
diff --git a/filters/kpresenter/powerpoint/import/powerpointimport.cpp b/filters/kpresenter/powerpoint/import/powerpointimport.cpp new file mode 100644 index 000000000..4291c0a4e --- /dev/null +++ b/filters/kpresenter/powerpoint/import/powerpointimport.cpp @@ -0,0 +1,1592 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Yolla Indria <yolla.indria@gmail.com> + + 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 <config.h> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#include <powerpointimport.h> +#include <powerpointimport.moc> + +#include <tqbuffer.h> +#include <tqcstring.h> +#include <tqfile.h> +#include <tqstring.h> +#include <tqtextstream.h> + +#include <kdebug.h> +#include <KoFilterChain.h> +#include <KoGlobal.h> +#include <KoUnit.h> +#include <kgenericfactory.h> + +#include <KoXmlWriter.h> + +#include "libppt.h" +#include <iostream> +#include <math.h> + +using namespace Libppt; + +typedef KGenericFactory<PowerPointImport, KoFilter> PowerPointImportFactory; +K_EXPORT_COMPONENT_FACTORY( libpowerpointimport, + PowerPointImportFactory( "kofficefilters" ) ) + +namespace Libppt { + +inline TQConstString string( const Libppt::UString& str ) +{ + return TQConstString( reinterpret_cast<const TQChar*>( str.data() ), str.length() ); +} + +} + +class PowerPointImport::Private +{ +public: + TQString inputFile; + TQString outputFile; + + Presentation *presentation; +}; + + +PowerPointImport::PowerPointImport ( TQObject*, const char*, const TQStringList& ) + : KoFilter() +{ + d = new Private; +} + +PowerPointImport::~PowerPointImport() +{ + delete d; +} + +KoFilter::ConversionStatus PowerPointImport::convert( const TQCString& from, const TQCString& to ) +{ + if ( from != "application/mspowerpoint" ) + return KoFilter::NotImplemented; + + if ( to != "application/vnd.oasis.opendocument.presentation" ) + return KoFilter::NotImplemented; + + d->inputFile = m_chain->inputFile(); + d->outputFile = m_chain->outputFile(); + + // open inputFile + d->presentation = new Presentation; + if( !d->presentation->load( d->inputFile.local8Bit() ) ) + { + delete d->presentation; + d->presentation = 0; + return KoFilter::StupidError; + } + + // create output store + KoStore* storeout; + storeout = KoStore::createStore( d->outputFile, KoStore::Write, + "application/vnd.oasis.opendocument.presentation", KoStore::Zip ); + + if ( !storeout ) + { + kdWarning() << "Couldn't open the requested file." << endl; + return KoFilter::FileNotFound; + } + + // store document content + if ( !storeout->open( "content.xml" ) ) + { + kdWarning() << "Couldn't open the file 'content.xml'." << endl; + return KoFilter::CreationError; + } + storeout->write( createContent() ); + storeout->close(); + + // store document styles + if ( !storeout->open( "styles.xml" ) ) + { + kdWarning() << "Couldn't open the file 'styles.xml'." << endl; + return KoFilter::CreationError; + } + storeout->write( createStyles() ); + storeout->close(); + + // store document manifest + storeout->enterDirectory( "META-INF" ); + if ( !storeout->open( "manifest.xml" ) ) + { + kdWarning() << "Couldn't open the file 'META-INF/manifest.xml'." << endl; + return KoFilter::CreationError; + } + storeout->write( createManifest() ); + storeout->close(); + + + // we are done! + delete d->presentation; + delete storeout; + d->inputFile = TQString(); + d->outputFile = TQString(); + d->presentation = 0; + + return KoFilter::OK; +} + +TQByteArray PowerPointImport::createStyles() +{ + KoXmlWriter* stylesWriter; + TQByteArray stylesData; + TQBuffer stylesBuffer( stylesData ); + + TQString pageWidth = TQString("%1pt").arg( d->presentation->masterSlide()->pageWidth() ); + TQString pageHeight = TQString("%1pt").arg( d->presentation->masterSlide()->pageHeight() ); + + stylesBuffer.open( IO_WriteOnly ); + stylesWriter = new KoXmlWriter( &stylesBuffer ); + + stylesWriter->startDocument( "office:document-styles" ); + stylesWriter->startElement( "office:document-styles" ); + stylesWriter->addAttribute( "xmlns:office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0" ); + stylesWriter->addAttribute( "xmlns:draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" ); + stylesWriter->addAttribute( "xmlns:presentation", "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" ); + stylesWriter->addAttribute( "xmlns:text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0" ); + stylesWriter->addAttribute( "xmlns:style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0" ); + stylesWriter->addAttribute( "xmlns:fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" ); + stylesWriter->addAttribute( "office:version","1.0" ); + + // office:styles + stylesWriter->startElement( "office:styles" ); + stylesWriter->endElement(); + + // office:automatic-styles + stylesWriter->startElement( "office:automatic-styles" ); + stylesWriter->startElement( "style:page-layout" ); + stylesWriter->addAttribute( "style:name","pm1" ); + stylesWriter->addAttribute( "style:page-usage","all" ); + stylesWriter->startElement( "style:page-layout-properties" ); + stylesWriter->addAttribute( "fo:margin-bottom","0pt" ); + stylesWriter->addAttribute( "fo:margin-left","0pt" ); + stylesWriter->addAttribute( "fo:margin-right","0pt" ); + stylesWriter->addAttribute( "fo:margin-top","0pt" ); + stylesWriter->addAttribute( "fo:page-height", pageHeight ); + stylesWriter->addAttribute( "fo:page-width", pageWidth ); + stylesWriter->addAttribute( "style:print-orientation","landscape" ); + stylesWriter->endElement(); // style:page-layout-properties + stylesWriter->endElement(); // style:page-layout + + stylesWriter->startElement( "style:style" ); + stylesWriter->addAttribute( "style:name","dp1" ); + stylesWriter->addAttribute( "style:family","drawing-page" ); + stylesWriter->startElement( "style:drawing-page-properties" ); + stylesWriter->addAttribute( "draw:background-size","border" ); + stylesWriter->addAttribute( "draw:fill","solid" ); + stylesWriter->addAttribute( "draw:fill-color","#ffffff" ); + stylesWriter->endElement(); // style:drawing-page-properties + stylesWriter->endElement(); // style:style + + stylesWriter->startElement( "style:style" ); + stylesWriter->addAttribute( "style:name","P1" ); + stylesWriter->addAttribute( "style:family","paragraph" ); + stylesWriter->startElement( "style:paragraph-properties" ); + stylesWriter->addAttribute( "fo:margin-left","0cm" ); + stylesWriter->addAttribute( "fo:margin-right","0cm" ); + stylesWriter->addAttribute( "fo:text-indent","0cm" ); + stylesWriter->endElement(); // style:paragraph-properties + stylesWriter->startElement( "style:text-properties" ); + stylesWriter->addAttribute( "fo:font-size","14pt" ); + stylesWriter->addAttribute( "style:font-size-asian","14pt" ); + stylesWriter->addAttribute( "style:font-size-complex","14pt" ); + stylesWriter->endElement(); // style:text-properties + stylesWriter->endElement(); // style:style + + stylesWriter->startElement( "text:list-style" ); + stylesWriter->addAttribute( "style:name","L2" ); + stylesWriter->startElement( "text:list-level-style-bullet" ); + stylesWriter->addAttribute( "text:level","1" ); + stylesWriter->addAttribute( "text:bullet-char","●" ); + stylesWriter->startElement( "style:text-properties" ); + stylesWriter->addAttribute( "fo:font-family","StarSymbol" ); + stylesWriter->addAttribute( "font-pitch","variable" ); + stylesWriter->addAttribute( "fo:color","#000000" ); + stylesWriter->addAttribute( "fo:font-size","45%" ); + stylesWriter->endElement(); // style:text-properties + stylesWriter->endElement(); // text:list-level-style-bullet + stylesWriter->endElement(); // text:list-style + + stylesWriter->endElement(); // office:automatic-styles + + // office:master-stylesborder + stylesWriter->startElement( "office:master-styles" ); + stylesWriter->startElement( "style:master-page" ); + stylesWriter->addAttribute( "style:name", "Standard" ); + stylesWriter->addAttribute( "style:page-layout-name", "pm1" ); + stylesWriter->addAttribute( "draw:style-name", "dp1" ); + stylesWriter->endElement(); + stylesWriter->endElement(); + + stylesWriter->endElement(); // office:document-styles + stylesWriter->endDocument(); + delete stylesWriter; + + // for troubleshooting only !! + TQString dbg; + for( unsigned i=0; i<stylesData.size(); i++ ) + dbg.append( stylesData[i] ); + tqDebug("\nstyles.xml:\n%s\n", dbg.latin1() ); + + return stylesData; +} + + +TQByteArray PowerPointImport::createContent() +{ + KoXmlWriter* contentWriter; + TQByteArray contentData; + TQBuffer contentBuffer( contentData ); + + contentBuffer.open( IO_WriteOnly ); + contentWriter = new KoXmlWriter( &contentBuffer ); + + contentWriter->startDocument( "office:document-content" ); + contentWriter->startElement( "office:document-content" ); + contentWriter->addAttribute( "xmlns:office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0" ); + contentWriter->addAttribute( "xmlns:style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0" ); + contentWriter->addAttribute( "xmlns:text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0" ); + contentWriter->addAttribute( "xmlns:draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" ); + contentWriter->addAttribute( "xmlns:presentation", "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" ); + contentWriter->addAttribute( "xmlns:svg","urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" ); + contentWriter->addAttribute( "office:version","1.0" ); + + // office:automatic-styles + + drawingObjectCounter = 0; + contentWriter->startElement( "office:automatic-styles" ); + for( unsigned c=0; c < d->presentation->slideCount(); c++ ) + { + Slide* slide = d->presentation->slide( c ); + processSlideForStyle( c, slide, contentWriter ); + } + contentWriter->endElement(); + + + + // office:body + + contentWriter->startElement( "office:body" ); + contentWriter->startElement( "office:presentation" ); + + drawingObjectCounter = 0; + for( unsigned c=0; c < d->presentation->slideCount(); c++ ) + { + Slide* slide = d->presentation->slide( c ); + processSlideForBody( c, slide, contentWriter ); + } + + contentWriter->endElement(); // office:presentation + contentWriter->endElement(); // office:body + + contentWriter->endElement(); // office:document-content + contentWriter->endDocument(); + delete contentWriter; + + // for troubleshooting only !! + TQString dbg; + for( unsigned i=0; i<contentData.size(); i++ ) + dbg.append( contentData[i] ); + tqDebug("\ncontent.xml:\n%s\n", dbg.latin1() ); + + return contentData; +} + +TQByteArray PowerPointImport::createManifest() +{ + KoXmlWriter* manifestWriter; + TQByteArray manifestData; + TQBuffer manifestBuffer( manifestData ); + + manifestBuffer.open( IO_WriteOnly ); + manifestWriter = new KoXmlWriter( &manifestBuffer ); + + manifestWriter->startDocument( "manifest:manifest" ); + manifestWriter->startElement( "manifest:manifest" ); + manifestWriter->addAttribute( "xmlns:manifest", + "urn:oasis:names:tc:openoffice:xmlns:manifest:1.0" ); + + manifestWriter->addManifestEntry( "/", "application/vnd.oasis.opendocument.presentation" ); + manifestWriter->addManifestEntry( "styles.xml", "text/xml" ); + manifestWriter->addManifestEntry( "content.xml", "text/xml" ); + + manifestWriter->endElement(); + manifestWriter->endDocument(); + delete manifestWriter; + + // for troubleshooting only !! + TQString dbg; + for( unsigned i=0; i<manifestData.size(); i++ ) + dbg.append( manifestData[i] ); + tqDebug("\nmanifest.xml:\n%s\n", dbg.latin1() ); + + return manifestData; +} + +void PowerPointImport::processEllipse (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:ellipse" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->endElement(); // draw:ellipse +} + +void PowerPointImport::processRectangle (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject ) return; + if( !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:rect" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + if ( drawObject->hasProperty ( "libppt:rotation" ) ) + { + + double rotAngle = drawObject->getDoubleProperty("libppt:rotation" ); + double xMid = ( drawObject->left() + 0.5*drawObject->width() ); + double yMid = ( drawObject->top() + 0.5*drawObject->height() ); + double xVec = drawObject->left()- xMid; + double yVec = yMid - drawObject->top(); + + double xNew = xVec*cos(rotAngle) - yVec*sin(rotAngle); + double yNew = xVec*sin(rotAngle) + yVec*cos(rotAngle); + TQString rot = TQString("rotate (%1) translate (%2mm %3mm)").arg(rotAngle).arg(xNew+xMid).arg(yMid-yNew); + xmlWriter->addAttribute( "draw:transform", rot ); + } + else + { + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + } + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->endElement(); // draw:rect +} + +void PowerPointImport::processRoundRectangle (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + + + if ( drawObject->hasProperty ( "libppt:rotation" ) ) + { + double rotAngle = drawObject->getDoubleProperty("libppt:rotation" ); + + + + if ( rotAngle > 0.785399 ) // > 45 deg + { xmlWriter->addAttribute( "svg:width", heightStr ); + xmlWriter->addAttribute( "svg:height", widthStr ); + double xMid = ( drawObject->left() - 0.5*drawObject->height() ); + double yMid = ( drawObject->top() + 0.5*drawObject->width() ); + double xVec = drawObject->left()- xMid; + double yVec = drawObject->top()- yMid; + + double xNew = xVec*cos(rotAngle) - yVec*sin(rotAngle); + double yNew = xVec*sin(rotAngle) + yVec*cos(rotAngle); + TQString rot = TQString("rotate (%1) translate (%2mm %3mm)").arg(rotAngle).arg(xNew+xMid).arg(yMid+yNew); + xmlWriter->addAttribute( "draw:transform", rot ); + } + else + { xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + double xMid = ( drawObject->left() + 0.5*drawObject->width() ); + double yMid = ( drawObject->top() + 0.5*drawObject->height() ); + double xVec = drawObject->left()- xMid; + double yVec = yMid - drawObject->top(); + + double xNew = xVec*cos(rotAngle) - yVec*sin(rotAngle); + double yNew = xVec*sin(rotAngle) + yVec*cos(rotAngle); + TQString rot = TQString("rotate (%1) translate (%2mm %3mm)").arg(rotAngle).arg(xNew+xMid).arg(yMid-yNew); + xmlWriter->addAttribute( "draw:transform", rot ); + } + + + } + else + { xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + } + // xmlWriter->addAttribute( "svg:x", xStr ); + // xmlWriter->addAttribute( "svg:y", yStr ); + + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->startElement( "draw:enhanced-geometry" ); + xmlWriter->addAttribute( "draw:type", "round-rectangle"); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 /3" ); + xmlWriter->addAttribute( "draw:name", "f0" ); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "right-?f0 " ); + xmlWriter->addAttribute( "draw:name", "f1" ); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "bottom-?f0 " ); + xmlWriter->addAttribute( "draw:name", "f2" ); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "left+?f0 " ); + xmlWriter->addAttribute( "draw:name", "f3" ); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "top+?f0 " ); + xmlWriter->addAttribute( "draw:name", "f4" ); + xmlWriter->endElement(); // draw:equation + xmlWriter->endElement(); // draw:enhanced-geometry + xmlWriter->endElement(); // draw:custom-shape +} + +void PowerPointImport::processDiamond (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 0 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 0 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 10 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:enhanced-geometry" ); + xmlWriter->addAttribute( "draw:type", "diamond"); + xmlWriter->endElement(); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->endElement(); +} + +void PowerPointImport::processTriangle (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + /* draw IsocelesTriangle or RightTriangle */ + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 0 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 2.5 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 0 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 10 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 7.5 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + + xmlWriter->startElement( "draw:enhanced-geometry" ); + + if (drawObject->hasProperty("draw:mirror-vertical")) + { + xmlWriter->addAttribute("draw:mirror-vertical","true"); + } + if ( drawObject->hasProperty("draw:mirror-horizontal")) + { + xmlWriter->addAttribute("draw:mirror-horizontal","true"); + } + if ( drawObject->hasProperty ( "libppt:rotation" ) ) + { // draw:transform="rotate (1.5707963267946) translate (6.985cm 14.181cm)" + + double rotAngle = drawObject->getDoubleProperty("libppt:rotation" ); + double xMid = ( drawObject->left() + 0.5*drawObject->width() ); + double yMid = ( drawObject->top() + 0.5*drawObject->height() ); + TQString rot = TQString("rotate (%1) translate (%2cm %3cm)").arg(rotAngle).arg(xMid).arg(yMid); + xmlWriter->addAttribute( "draw:transform", rot ); + } + if (drawObject->shape() == DrawObject::RightTriangle) + { + xmlWriter->addAttribute( "draw:type", "right-triangle"); + } + else if (drawObject->shape() == DrawObject::IsoscelesTriangle) + { + xmlWriter->addAttribute( "draw:type", "isosceles-triangle"); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 " ); + xmlWriter->addAttribute( "draw:name", "f0" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 /2" ); + xmlWriter->addAttribute( "draw:name", "f1" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "?f1 +10800" ); + xmlWriter->addAttribute( "draw:name", "f2" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 *2/3" ); + xmlWriter->addAttribute( "draw:name", "f3" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "?f3 +7200" ); + xmlWriter->addAttribute( "draw:name", "f4" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-?f0 " ); + xmlWriter->addAttribute( "draw:name", "f5" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "?f5 /2" ); + xmlWriter->addAttribute( "draw:name", "f6" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-?f6 " ); + xmlWriter->addAttribute( "draw:name", "f7" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:handle" ); + xmlWriter->addAttribute( "draw:handle-range-x-maximum", 21600); + xmlWriter->addAttribute( "draw:handle-range-x-minimum", 0); + xmlWriter->addAttribute( "draw:handle-position","$0 top"); + xmlWriter->endElement(); + } + + xmlWriter->endElement(); // enhanced-geometry + xmlWriter->endElement(); // custom-shape +} + +void PowerPointImport::processTrapezoid (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 0 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 2.5 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 0 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:enhanced-geometry" ); + if ( drawObject->hasProperty("draw:mirror-vertical") ) + { + xmlWriter->addAttribute("draw:mirror-vertical","true"); + } + if ( drawObject->hasProperty("draw:mirror-horizontal")) + { + xmlWriter->addAttribute("draw:mirror-horizontal","true"); + } + xmlWriter->addAttribute( "draw:type", "trapezoid" ); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-$0 " ); + xmlWriter->addAttribute( "draw:name", "f0" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0" ); + xmlWriter->addAttribute( "draw:name", "f1" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 *10/18" ); + xmlWriter->addAttribute( "draw:name", "f2" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "?f2 +1750"); + xmlWriter->addAttribute( "draw:name", "f3" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-?f3" ); + xmlWriter->addAttribute( "draw:name", "f4" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 /2" ); + xmlWriter->addAttribute( "draw:name", "f5" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-?f5" ); + xmlWriter->addAttribute( "draw:name", "f6" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:handle" ); + xmlWriter->addAttribute( "draw:handle-range-x-maximum", 10800); + xmlWriter->addAttribute( "draw:handle-range-x-minimum", 0); + xmlWriter->addAttribute("draw:handle-position","$0 bottom"); + xmlWriter->endElement(); + xmlWriter->endElement(); // enhanced-geometry + xmlWriter->endElement(); // custom-shape +} + +void PowerPointImport::processParallelogram (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 6.25 ); + xmlWriter->addAttribute( "svg:y", 0 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 4.5 ); + xmlWriter->addAttribute( "svg:y", 0 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 8.75 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 3.75 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 1.25 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:enhanced-geometry" ); + if (drawObject->hasProperty("draw:mirror-vertical")) + { + xmlWriter->addAttribute("draw:mirror-vertical","true"); + } + if ( drawObject->hasProperty("draw:mirror-horizontal")) + { + xmlWriter->addAttribute("draw:mirror-horizontal","true"); + } + xmlWriter->addAttribute( "draw:type", "parallelogram" ); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 " ); + xmlWriter->addAttribute( "draw:name", "f0" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-$0" ); + xmlWriter->addAttribute( "draw:name", "f1" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 *10/24" ); + xmlWriter->addAttribute( "draw:name", "f2" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "?f2 +1750"); + xmlWriter->addAttribute( "draw:name", "f3" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-?f3" ); + xmlWriter->addAttribute( "draw:name", "f4" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "?f0 /2" ); + xmlWriter->addAttribute( "draw:name", "f5" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "10800+?f5" ); + xmlWriter->addAttribute( "draw:name", "f6" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "?f0-10800 " ); + xmlWriter->addAttribute( "draw:name", "f7" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "if(?f7,?f12,0" ); + xmlWriter->addAttribute( "draw:name", "f8" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "10800-?f5" ); + xmlWriter->addAttribute( "draw:name", "f9" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "if(?f7, ?f12, 21600"); + xmlWriter->addAttribute( "draw:name", "f10" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-?f5" ); + xmlWriter->addAttribute( "draw:name", "f11" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600*10800/?f0" ); + xmlWriter->addAttribute( "draw:name", "f12" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-?f12" ); + xmlWriter->addAttribute( "draw:name", "f13" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:handle" ); + xmlWriter->addAttribute( "draw:handle-range-x-maximum", 21600); + xmlWriter->addAttribute( "draw:handle-range-x-minimum", 0); + xmlWriter->addAttribute("draw:handle-position","$0 top"); + xmlWriter->endElement(); + xmlWriter->endElement(); // enhanced-geometry + xmlWriter->endElement(); // custom-shape +} + +void PowerPointImport::processHexagon (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 0 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 0 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 10 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:enhanced-geometry" ); + xmlWriter->addAttribute( "draw:type", "hexagon" ); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 " ); + xmlWriter->addAttribute( "draw:name", "f0" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-$0" ); + xmlWriter->addAttribute( "draw:name", "f1" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 *100/234" ); + xmlWriter->addAttribute( "draw:name", "f2" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "?f2 +1700"); + xmlWriter->addAttribute( "draw:name", "f3" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "21600-?f3" ); + xmlWriter->addAttribute( "draw:name", "f4" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:handle" ); + xmlWriter->addAttribute( "draw:handle-range-x-maximum", 10800); + xmlWriter->addAttribute( "draw:handle-range-x-minimum", 0); + xmlWriter->addAttribute("draw:handle-position","$0 top"); + xmlWriter->endElement(); + xmlWriter->endElement(); // enhanced-geometry + xmlWriter->endElement(); // custom-shape +} + +void PowerPointImport::processOctagon (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 0 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 0 ); + xmlWriter->addAttribute( "svg:y", 4.782 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 10 ); + xmlWriter->addAttribute( "svg:y", 4.782 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:enhanced-geometry" ); + xmlWriter->addAttribute( "draw:type", "octagon" ); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "left+$0 " ); + xmlWriter->addAttribute( "draw:name", "f0" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "top+$0 " ); + xmlWriter->addAttribute( "draw:name", "f1" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "right-$0 " ); + xmlWriter->addAttribute( "draw:name", "f2" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "bottom-$0 "); + xmlWriter->addAttribute( "draw:name", "f3" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0 /2" ); + xmlWriter->addAttribute( "draw:name", "f4" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "left+?f4 " ); + xmlWriter->addAttribute( "draw:name", "f5" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "top+?f4 " ); + xmlWriter->addAttribute( "draw:name", "f6" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "right-?f4 " ); + xmlWriter->addAttribute( "draw:name", "f7" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "bottom-?f4 "); + xmlWriter->addAttribute( "draw:name", "f8" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:handle" ); + xmlWriter->addAttribute( "draw:handle-range-x-maximum", 10800); + xmlWriter->addAttribute( "draw:handle-range-x-minimum", 0); + xmlWriter->addAttribute("draw:handle-position","$0 top"); + xmlWriter->endElement(); + xmlWriter->endElement(); // enhanced-geometry + xmlWriter->endElement(); // custom-shape +} + +void PowerPointImport::processArrow (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->startElement( "draw:enhanced-geometry" ); + + if (drawObject->shape() == DrawObject::RightArrow) + xmlWriter->addAttribute( "draw:type", "right-arrow" ); + else if (drawObject->shape() == DrawObject::LeftArrow) + xmlWriter->addAttribute( "draw:type", "left-arrow" ); + else if (drawObject->shape() == DrawObject::UpArrow) + xmlWriter->addAttribute( "draw:type", "up-arrow" ); + else if (drawObject->shape() == DrawObject::DownArrow) + xmlWriter->addAttribute( "draw:type", "down-arrow" ); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula","$1"); + xmlWriter->addAttribute( "draw:name","f0"); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula","$0"); + xmlWriter->addAttribute( "draw:name","f1"); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula","21600-$1"); + xmlWriter->addAttribute( "draw:name","f2"); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula","21600-?f1"); + xmlWriter->addAttribute( "draw:name","f3"); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula","?f3 *?f0 /10800"); + xmlWriter->addAttribute( "draw:name","f4"); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula","?f1 +?f4 " ); + xmlWriter->addAttribute( "draw:name","f5"); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula","?f1 *?f0 /10800"); + xmlWriter->addAttribute( "draw:name","f6"); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula","?f1 -?f6 "); + xmlWriter->addAttribute( "draw:name","f7"); + xmlWriter->endElement(); // draw:equation + xmlWriter->startElement( "draw:handle" ); + if ( drawObject->shape() == DrawObject::RightArrow | drawObject->shape() == DrawObject::LeftArrow ) + { + xmlWriter->addAttribute( "draw:handle-range-x-maximum", 21600); + xmlWriter->addAttribute( "draw:handle-range-x-minimum", 0); + xmlWriter->addAttribute("draw:handle-position","$0 $1"); + xmlWriter->addAttribute("draw:handle-range-y-maximum",10800); + xmlWriter->addAttribute("draw:handle-range-y-minimum",0); + } + else if ( drawObject->shape() == DrawObject::UpArrow | drawObject->shape() == DrawObject::DownArrow ) + { + xmlWriter->addAttribute( "draw:handle-range-x-maximum", 10800); + xmlWriter->addAttribute( "draw:handle-range-x-minimum", 0); + xmlWriter->addAttribute("draw:handle-position","$1 $0"); + xmlWriter->addAttribute("draw:handle-range-y-maximum",21600); + xmlWriter->addAttribute("draw:handle-range-y-minimum",0); + } + xmlWriter->endElement(); // draw:handle + xmlWriter->endElement(); // draw:enhanced-geometry + xmlWriter->endElement(); // draw:custom-shape +} + +void PowerPointImport::processLine (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter) return; + + TQString x1Str = TQString("%1mm").arg( drawObject->left() ); + TQString y1Str = TQString("%1mm").arg( drawObject->top() ); + TQString x2Str = TQString("%1mm").arg( drawObject->left() + drawObject->width() ); + TQString y2Str = TQString("%1mm").arg( drawObject->top() + drawObject->height() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + if ( drawObject->hasProperty("draw:mirror-vertical") ) + { TQString temp = y1Str; + y1Str = y2Str; + y2Str = temp; + } + if ( drawObject->hasProperty("draw:mirror-horizontal") ) + { TQString temp = x1Str; + x1Str = x2Str; + x2Str = temp; + } + + xmlWriter->startElement( "draw:line" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:y1", y1Str ); + xmlWriter->addAttribute( "svg:y2", y2Str ); + xmlWriter->addAttribute( "svg:x1", x1Str ); + xmlWriter->addAttribute( "svg:x2", x2Str ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + + xmlWriter->endElement(); +} + +void PowerPointImport::processSmiley (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject ||!xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 0 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 1.461 ); + xmlWriter->addAttribute( "svg:y", 1.461 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 0 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 1.461 ); + xmlWriter->addAttribute( "svg:y", 8.536 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 10 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 8.536 ); + xmlWriter->addAttribute( "svg:y", 1.461 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:enhanced-geometry" ); + xmlWriter->addAttribute( "draw:type", "smiley" ); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "$0-15510 " ); + xmlWriter->addAttribute( "draw:name", "f0" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "17520-?f0" ); + xmlWriter->addAttribute( "draw:name", "f1" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:equation" ); + xmlWriter->addAttribute( "draw:formula", "15510+?f0" ); + xmlWriter->addAttribute( "draw:name", "f2" ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:handle" ); + xmlWriter->addAttribute( "draw:position", 10800); + xmlWriter->addAttribute( "draw:handle-range-y-maximum", 17520); + xmlWriter->addAttribute( "draw:handle-range-y-minimum", 15510); + xmlWriter->addAttribute("draw:handle-position","$0 top"); + xmlWriter->endElement(); + xmlWriter->endElement(); // enhanced-geometry + xmlWriter->endElement(); // custom-shape +} + +void PowerPointImport::processHeart (DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:custom-shape" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 1 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 1.43 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 5 ); + xmlWriter->addAttribute( "svg:y", 10 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:glue-point" ); + xmlWriter->addAttribute( "svg:x", 8.553 ); + xmlWriter->addAttribute( "svg:y", 5 ); + xmlWriter->endElement(); + xmlWriter->startElement( "draw:enhanced-geometry" ); + xmlWriter->addAttribute( "draw:type", "heart" ); + + xmlWriter->endElement(); // enhanced-geometry + xmlWriter->endElement(); // custom-shape +} + +void PowerPointImport::processFreeLine (DrawObject* drawObject, KoXmlWriter* xmlWriter) +{ + if( !drawObject ||!xmlWriter ) return; + + TQString widthStr = TQString("%1mm").arg( drawObject->width() ); + TQString heightStr = TQString("%1mm").arg( drawObject->height() ); + TQString xStr = TQString("%1mm").arg( drawObject->left() ); + TQString yStr = TQString("%1mm").arg( drawObject->top() ); + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "draw:path" ); + xmlWriter->addAttribute( "draw:style-name", styleName ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->endElement(); // path +} + +void PowerPointImport::processDrawingObjectForBody( DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + + if( !drawObject || !xmlWriter ) return; + + drawingObjectCounter++; + + + if (drawObject->shape() == DrawObject::Ellipse) + { + processEllipse (drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::Rectangle) + { + processRectangle (drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::RoundRectangle) + { + processRoundRectangle (drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::Diamond) + { + processDiamond (drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::IsoscelesTriangle | + drawObject->shape() == DrawObject::RightTriangle) + { + processTriangle (drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::Trapezoid) + { + processTrapezoid (drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::Parallelogram) + { + processParallelogram( drawObject, xmlWriter); + } + else if (drawObject->shape() == DrawObject::Hexagon) + { + processHexagon ( drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::Octagon) + { + processOctagon ( drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::RightArrow | + drawObject->shape() == DrawObject::LeftArrow | + drawObject->shape() == DrawObject::UpArrow | + drawObject->shape() == DrawObject::DownArrow ) + { + processArrow ( drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::Line) + { + processLine ( drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::Smiley) + { + processSmiley (drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::Heart) + { + processHeart (drawObject, xmlWriter ); + } + else if (drawObject->shape() == DrawObject::FreeLine) + { + processFreeLine (drawObject, xmlWriter ); + } +} + +void PowerPointImport::processGroupObjectForBody( GroupObject* groupObject, KoXmlWriter* xmlWriter ) +{ + if( !groupObject || !xmlWriter ) return; + if( !groupObject->objectCount() ) return; + + xmlWriter->startElement( "draw:g" ); + + for( unsigned i = 0; i < groupObject->objectCount(); i++ ) + { + Object* object = groupObject->object( i ); + if( object ) + processObjectForBody( object, xmlWriter ); + } + + xmlWriter->endElement(); // draw:g +} + +void PowerPointImport::processTextObjectForBody( TextObject* textObject, KoXmlWriter* xmlWriter ) +{ + if( !textObject || !xmlWriter ) return; + + TQString classStr = "subtitle"; + if( textObject->type() == TextObject::Title ) + classStr = "title"; +// TQString pStr = string( textObject->text() ).string(); + TQString pStr; + + TQString widthStr = TQString("%1mm").arg( textObject->width() ); + TQString heightStr = TQString("%1mm").arg( textObject->height() ); + TQString xStr = TQString("%1mm").arg( textObject->left() ); + TQString yStr = TQString("%1mm").arg( textObject->top() ); + + xmlWriter->startElement( "draw:frame" ); + xmlWriter->addAttribute( "presentation:style-name", "pr1" ); + xmlWriter->addAttribute( "draw:layer", "layout" ); + xmlWriter->addAttribute( "svg:width", widthStr ); + xmlWriter->addAttribute( "svg:height", heightStr ); + xmlWriter->addAttribute( "svg:x", xStr ); + xmlWriter->addAttribute( "svg:y", yStr ); + xmlWriter->addAttribute( "presentation:class", classStr ); + xmlWriter->startElement( "draw:text-box" ); + + // count error if i begins with 0 + for (unsigned i=0; i<textObject->listSize(); i++) + { + pStr = Libppt::string(textObject->text(i)).string(); + if (textObject->bulletFlag(i) == 1 ) + { + xmlWriter->startElement( "text:list" ); + xmlWriter->addAttribute( "text:style-name","L2"); + xmlWriter->startElement( "text:list-item" ); + xmlWriter->startElement( "text:p" ); + xmlWriter->addAttribute( "text:style-name", "P1" ); + xmlWriter->addTextSpan( pStr ); + xmlWriter->endElement(); // text:p + xmlWriter->endElement(); // text:list-item + xmlWriter->endElement(); // text:list + } + else + { + xmlWriter->startElement( "text:p" ); + xmlWriter->addAttribute( "text:style-name", "P1" ); + xmlWriter->addTextSpan( pStr ); + xmlWriter->endElement(); // text:p + } + } + + xmlWriter->endElement(); // draw:text-box + xmlWriter->endElement(); // draw:frame + + +} + +void PowerPointImport::processObjectForBody( Object* object, KoXmlWriter* xmlWriter ) +{ + if( !object || !xmlWriter) return; + + if( object->isText() ) + processTextObjectForBody( static_cast<TextObject*>(object), xmlWriter ); + else if( object->isGroup() ) + processGroupObjectForBody( static_cast<GroupObject*>(object), xmlWriter ); + else if( object->isDrawing() ) + processDrawingObjectForBody( static_cast<DrawObject*>(object), xmlWriter ); +} + +void PowerPointImport::processSlideForBody( unsigned slideNo, Slide* slide, KoXmlWriter* xmlWriter ) +{ + if( !slide || !xmlWriter ) return; + + TQString nameStr = Libppt::string( slide->title() ).string(); + if( nameStr.isEmpty() ) + nameStr = TQString("page%1").arg(slideNo+1); + + TQString styleNameStr = TQString("dp%1").arg(slideNo+1); + + xmlWriter->startElement( "draw:page" ); + xmlWriter->addAttribute( "draw:master-page-name", "Default" ); + xmlWriter->addAttribute( "draw:name", nameStr ); + xmlWriter->addAttribute( "draw:style-name", styleNameStr ); + xmlWriter->addAttribute( "presentation:presentation-page-layout-name", "AL1T0"); + + GroupObject* root = slide->rootObject(); + if( root ) + for( unsigned i = 0; i < root->objectCount(); i++ ) + { + Object* object = root->object( i ); + if( object ) + processObjectForBody( object, xmlWriter ); + } + + xmlWriter->endElement(); // draw:page +} + +void PowerPointImport::processSlideForStyle( unsigned , Slide* slide, KoXmlWriter* xmlWriter ) +{ + if( !slide || !xmlWriter ) return; + + GroupObject* root = slide->rootObject(); + if( root ) + for( unsigned i = 0; i < root->objectCount(); i++ ) + { + Object* object = root->object( i ); + if( object ) + processObjectForStyle( object, xmlWriter ); + } +} + +void PowerPointImport::processObjectForStyle( Object* object, KoXmlWriter* xmlWriter ) +{ + if( !object || !xmlWriter ) return; + + if( object->isText() ) + processTextObjectForStyle( static_cast<TextObject*>(object), xmlWriter ); + else if( object->isGroup() ) + processGroupObjectForStyle( static_cast<GroupObject*>(object), xmlWriter ); + else if( object->isDrawing() ) + processDrawingObjectForStyle( static_cast<DrawObject*>(object), xmlWriter ); +} + +void PowerPointImport::processTextObjectForStyle( TextObject* textObject, KoXmlWriter* xmlWriter ) +{ + if( !textObject || !xmlWriter ) return; +} + +void PowerPointImport::processGroupObjectForStyle( GroupObject* groupObject, KoXmlWriter* xmlWriter ) +{ + if( !groupObject ||!xmlWriter ) return; +} + +TQString hexname( const Color &c ) +{ + TQColor qc( c.red, c.green, c.blue ); + return qc.name(); +} + +void PowerPointImport::processDrawingObjectForStyle( DrawObject* drawObject, KoXmlWriter* xmlWriter ) +{ + if( !drawObject || !xmlWriter) return; + + drawingObjectCounter++; + TQString styleName = TQString("gr%1").arg( drawingObjectCounter ); + + xmlWriter->startElement( "style:style" ); + xmlWriter->addAttribute( "style:name", styleName ); + xmlWriter->addAttribute( "style:family", "graphic" ); + xmlWriter->addAttribute( "style:parent-style-name", "standard" ); + + xmlWriter->startElement( "style:graphic-properties" ); +/* + if (drawObject->hasProperty("draw:stroke") ) + { + xmlWriter->addAttribute( "draw:stroke", "dash" ); + std::string s = drawObject->getStrProperty("draw:stroke-dash"); + TQString ss( s.c_str() ); + xmlWriter->addAttribute( "draw:stroke-dash", ss ); + } else xmlWriter->addAttribute( "draw:stroke", "dash" ); +*/ + if (drawObject->hasProperty( "libppt:invisibleLine" )) + { + if (drawObject->getBoolProperty("libppt:invisibleLine") == true) + xmlWriter->addAttribute( "draw:stroke", "none" ); + } + else if( drawObject->hasProperty( "draw:stroke" ) ) + { if (drawObject->getStrProperty( "draw:stroke" ) == "dash") + { + xmlWriter->addAttribute( "draw:stroke", "dash" ); + std::string s = drawObject->getStrProperty("draw:stroke-dash"); + TQString ss( s.c_str() ); + xmlWriter->addAttribute( "draw:stroke-dash", ss ); + tqDebug("=============stroke dash==================="); +// tqDebug("test %g\n",angka); + } + else if (drawObject->getStrProperty( "draw:stroke" ) == "solid") + xmlWriter->addAttribute( "draw:stroke", "solid" ); + } + + + if( drawObject->hasProperty( "svg:stroke-width" ) ) + { + double strokeWidth = drawObject->getDoubleProperty("svg:stroke-width" ); + xmlWriter->addAttribute( "svg:stroke-width",TQString("%1mm").arg( strokeWidth ) ); + } + + if( drawObject->hasProperty( "svg:stroke-color" ) ) + { + Color strokeColor = drawObject->getColorProperty("svg:stroke-color" ); + xmlWriter->addAttribute( "svg:stroke-color", hexname( strokeColor ) ); + } + + if( drawObject->hasProperty( "draw:marker-start" ) ) + { + std::string s = drawObject->getStrProperty("draw:marker-start"); + TQString ss( s.c_str() ); + xmlWriter->addAttribute( "draw:marker-start", ss ); + } + if( drawObject->hasProperty( "draw:marker-end" ) ) + { + std::string s = drawObject->getStrProperty("draw:marker-end"); + TQString ss( s.c_str() ); + xmlWriter->addAttribute( "draw:marker-end", ss); + } +/* if( drawObject->hasProperty( "draw:marker-start-length" ) ) + { + std::string s = drawObject->getStrProperty("draw:marker-start-length"); + TQString ss( s.c_str() ); + xmlWriter->addAttribute("draw:marker-start-length", ss ); + } + if( drawObject->hasProperty( "draw:marker-end-length" ) ) + { + std::string s = drawObject->getStrProperty("draw:marker-end-length"); + TQString ss( s.c_str() ); + xmlWriter->addAttribute( "draw:marker-end-length", ss); + } */ + + if( drawObject->hasProperty( "draw:marker-start-width" ) ) + { + double strokeWidth = drawObject->getDoubleProperty("svg:stroke-width" ); + double arrowWidth = (drawObject->getDoubleProperty("draw:marker-start-width") * strokeWidth); + xmlWriter->addAttribute( "draw:marker-start-width",TQString("%1cm").arg( arrowWidth ) ); + } + + if( drawObject->hasProperty( "draw:marker-end-width" ) ) + { + double strokeWidth = drawObject->getDoubleProperty("svg:stroke-width" ); + double arrowWidth = (drawObject->getDoubleProperty("draw:marker-end-width") * strokeWidth); + xmlWriter->addAttribute( "draw:marker-end-width",TQString("%1cm").arg( arrowWidth ) ); + } + + + + if( drawObject->hasProperty( "draw:fill" ) ) + { + std::string s = drawObject->getStrProperty("draw:fill"); + TQString ss( s.c_str() ); + xmlWriter->addAttribute( "draw:fill", ss); + } + + + + if( drawObject->hasProperty( "draw:fill-color" ) ) + { + Color fillColor = drawObject->getColorProperty("draw:fill-color" ); + xmlWriter->addAttribute( "draw:fill-color", hexname( fillColor ) ); + + } else xmlWriter->addAttribute( "draw:fill-color", "#99ccff" ); + +#if 0 + if( drawObject->hasProperty( "draw:shadow-color" ) ) + { + xmlWriter->addAttribute( "draw:shadow", "visible" ); + Color shadowColor = drawObject->getColorProperty("draw:shadow-color" ); + xmlWriter->addAttribute( "draw:shadow-color", hexname( shadowColor ) ); + } + else xmlWriter->addAttribute( "draw:shadow", "hidden" ); +#endif + + if( drawObject->hasProperty( "draw:shadow-opacity" ) ) + { + double opacity = drawObject->getDoubleProperty("draw:shadow-opacity") ; + xmlWriter->addAttribute( "draw:shadow-opacity",TQString("%1%").arg( opacity ) ); + } + + if( drawObject->hasProperty( "draw:shadow-offset-x" ) ) + { + double offset = drawObject->getDoubleProperty("draw:shadow-offset-x") ; + xmlWriter->addAttribute( "draw:shadow-offset-x",TQString("%1cm").arg( offset ) ); + } + + if( drawObject->hasProperty( "draw:shadow-offset-y" ) ) + { + double offset = drawObject->getDoubleProperty("draw:shadow-offset-y"); + xmlWriter->addAttribute( "draw:shadow-offset-y",TQString("%1cm").arg( offset ) ); + } + + + xmlWriter->endElement(); + + xmlWriter->endElement(); +} + |