28#include <tdetempfile.h>
31#include <kofficeversion.h>
33#include <KoStoreDevice.h>
34#include <KoXmlWriter.h>
35#include <KoGenStyles.h>
36#include <KoDocument.h>
38#include "kword13formatother.h"
39#include "kword13picture.h"
40#include "kword13document.h"
42#include "kword13oasisgenerator.h"
44KWord13OasisGenerator::KWord13OasisGenerator(
void ) : m_kwordDocument( 0 ), m_store( 0 ), m_manifestWriter( 0 )
48KWord13OasisGenerator::~KWord13OasisGenerator(
void )
52void KWord13OasisGenerator::prepareTextFrameset( KWordTextFrameset* frameset )
56 kdWarning(30520) <<
"Tried to prepare a NULL text frameset!" << endl;
60 for ( TQValueList<KWord13Paragraph>::Iterator it = frameset->m_paragraphGroup.begin();
61 it != frameset->m_paragraphGroup.end(); ++it)
63 declareLayout( (*it).m_layout );
64 for (
KWord13Format* format = (*it).m_formats.first(); format; format = (*it).m_formats.next() )
71 KoGenStyle gs( KoGenStyle::STYLE_AUTO,
"text", (*it).m_layout.m_autoStyleName );
72 fillGenStyleWithFormatOne( *data , gs,
false );
74 kdDebug(30520) <<
"Format: Parent " << (*it).m_layout.m_autoStyleName <<
" => " << data->
m_autoStyleName << endl;
80void KWord13OasisGenerator::preparePageLayout(
void )
83 KoGenStyle style(KoGenStyle::STYLE_PAGELAYOUT);
84 style.addPropertyPt(
"fo:page-width", positiveNumberOrNull ( m_kwordDocument->getProperty(
"PAPER:width",
"PAPER:ptWidth" ) ) );
85 style.addPropertyPt(
"fo:page-height", positiveNumberOrNull ( m_kwordDocument->getProperty(
"PAPER:height",
"PAPER:ptHeight" ) ) );
86 style.addPropertyPt(
"fo:margin-left", positiveNumberOrNull ( m_kwordDocument->getProperty(
"PAPERBORDERS:left",
"PAPERBORDERS:ptLeft" ) ) );
87 style.addPropertyPt(
"fo:margin-right", positiveNumberOrNull ( m_kwordDocument->getProperty(
"PAPERBORDERS:right",
"PAPERBORDERS:ptRight" ) ) );
88 style.addPropertyPt(
"fo:margin-top", positiveNumberOrNull ( m_kwordDocument->getProperty(
"PAPERBORDERS:top",
"PAPERBORDERS:ptTop" ) ) );
89 style.addPropertyPt(
"fo:margin-bottom", positiveNumberOrNull ( m_kwordDocument->getProperty(
"PAPERBORDERS:bottom",
"PAPERBORDERS:ptBottom" ) ) );
90 if ( m_kwordDocument->getProperty(
"PAPER:orientation" ) ==
"1" )
92 style.addProperty(
"style:print-orientation",
"landscape" );
96 style.addProperty(
"style:print-orientation",
"portrait" );
101 const int firstPageNumber = m_kwordDocument->getProperty(
"VARIABLESETTINGS:startingPageNumber" ).toInt( &ok );
102 style.addProperty(
"style:first-page-number", ( ( ok && firstPageNumber > 1 ) ? firstPageNumber : 1 ) );
104 const int columns = m_kwordDocument->getProperty(
"PAPER:columns" ).toInt( &ok );
105 if ( ok && columns > 1 )
109 buffer.open( IO_WriteOnly );
110 KoXmlWriter element ( &buffer );
111 element.startElement(
"style:columns");
112 element.addAttribute(
"fo:column-count", columns );
113 element.addAttributePt(
"fo:column-gap", positiveNumberOrNull( m_kwordDocument->getProperty(
"PAPER:columnspacing",
"PAPER:ptColumnspc" ) ) );
115 for (
int i=0; i < columns; ++i )
117 element.startElement(
"style:column" );
118 element.addAttribute(
"style:rel-width",
"1*" );
119 element.addAttributePt(
"fo:margin-left", 0.0 );
120 element.addAttributePt(
"fo:margin-right", 0.0 );
121 element.endElement();
124 element.endElement();
126 const TQString strElement( TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() ) );
127 style.addChildElement(
"style:columns", strElement );
129 const TQString automaticPageStyle ( m_oasisGenStyles.lookup( style,
"pm" ) );
130 kdDebug(30520) <<
"Automatic page style: " << automaticPageStyle << endl;
134bool KWord13OasisGenerator::prepare( KWord13Document& kwordDocument )
136 if ( m_kwordDocument && ( (
void*) m_kwordDocument ) != ( (
void*) &kwordDocument ) )
138 kdWarning(30520) <<
"KWord Document is different!" <<endl;
141 m_kwordDocument = &kwordDocument;
146 for ( TQValueList<KWord13Layout>::Iterator it = m_kwordDocument->m_styles.begin();
147 it != m_kwordDocument->m_styles.end(); ++it)
153 prepareTextFrameset( m_kwordDocument->m_normalTextFramesetList.first() );
160double KWord13OasisGenerator::numberOrNull(
const TQString& str )
const
163 const double d = str.toDouble( &ok );
170double KWord13OasisGenerator::positiveNumberOrNull(
const TQString& str )
const
173 const double d = str.toDouble( &ok );
174 if ( ok && d >= 0.0 )
181void KWord13OasisGenerator::declareLayout(
KWord13Layout& layout )
183 KoGenStyle gs( KoGenStyle::STYLE_AUTO,
"paragraph", layout.
m_name );
188 if ( m_paragLayout.counter && m_paragLayout.counter->depth() ) {
190 gs.addAttribute(
"style:default-outline-level", (
int)m_paragLayout.counter->depth() + 1 );
192 gs.addAttribute(
"style:default-level", (
int)m_paragLayout.counter->depth() + 1 );
195 fillGenStyleWithLayout( layout, gs,
false );
196 fillGenStyleWithFormatOne( layout.
m_format , gs,
false );
205void KWord13OasisGenerator::declareStyle(
KWord13Layout& layout )
207 KoGenStyle gs( KoGenStyle::STYLE_USER,
"paragraph", TQString() );
209 gs.addAttribute(
"style:display-name", layout.
m_name );
212 if ( m_paragLayout.counter && m_paragLayout.counter->depth() ) {
214 gs.addAttribute(
"style:default-outline-level", (
int)m_paragLayout.counter->depth() + 1 );
216 gs.addAttribute(
"style:default-level", (
int)m_paragLayout.counter->depth() + 1 );
219 fillGenStyleWithLayout( layout, gs,
true );
220 fillGenStyleWithFormatOne( layout.
m_format , gs,
true );
229void KWord13OasisGenerator::fillGenStyleWithFormatOne(
const KWord13FormatOneData& one, KoGenStyle& gs,
const bool style )
const
233 KoGenStyle::PropertyType tt = KoGenStyle::TextType;
234 bool redok =
false, greenok =
false, blueok =
false, ok =
false;
236 one.getProperty(
"COLOR:red" ).toInt( &redok ),
237 one.getProperty(
"COLOR:green" ).toInt( &greenok ),
238 one.getProperty(
"COLOR:blue" ).toInt( &blueok ) );
239 if ( color.isValid() && redok && greenok && blueok )
241 gs.addProperty(
"fo:color", color.name(), tt );
245 gs.addProperty(
"fo:color",
"#000000", tt );
248 str = one.getProperty(
"FONT:name" );
249 if ( !str.isEmpty() )
251 gs.addProperty(
"style:font-name", str, tt );
255 double d = numberOrNull( one.getProperty(
"SIZE:value" ) );
258 gs.addPropertyPt(
"fo:font-size", d, tt );
263 const int weight = one.getProperty(
"WEIGHT:value" ).toInt( &ok );
264 if ( ok && weight >=0 )
268 gs.addProperty(
"fo:font-weight",
"normal", tt );
270 else if (weight == 75 )
272 gs.addProperty(
"fo:font-weight",
"bold", tt );
276 gs.addProperty(
"fo:font-weight", TQString::number( weight * 10 ), tt );
281 gs.addProperty(
"fo:font-weight",
"normal", tt );
285 const int italic = one.getProperty(
"ITALIC:value" ).toInt( &ok );
286 if ( ok && ( italic == 1 ) )
288 gs.addProperty(
"fo:font-style",
"italic", tt );
290 else if ( ( ok && ! italic ) || style )
292 gs.addProperty(
"fo:font-style",
"normal", tt );
298 gs.addProperty(
"style:text-underline-mode", d->m_bWordByWord ?
"skip-white-space" :
"continuous", tt );
299 gs.addProperty(
"style:text-underline-type", m_underlineType == U_NONE ?
"none" :
300 m_underlineType == U_DOUBLE ?
"double" :
"single", tt );
302 if ( m_underlineType == U_WAVE )
305 styleline = exportOasisUnderline( m_underlineStyle );
306 gs.addProperty(
"style:text-underline-style", styleline, tt );
307 gs.addProperty(
"style:text-underline-color", m_textUnderlineColor.isValid() ? m_textUnderlineColor.name() :
"font-color", tt );
310 gs.addProperty(
"style:text-line-through-type", m_strikeOutType == S_NONE ?
"none" :
311 m_strikeOutType == S_DOUBLE ?
"double" :
"single", tt );
313 styleline = exportOasisUnderline( (UnderlineStyle) m_strikeOutStyle );
314 gs.addProperty(
"style:text-line-through-style", styleline, tt );
318 if ( d->m_offsetFromBaseLine != 0 )
319 textPos = TQString::number( 100 * d->m_offsetFromBaseLine / fn.pointSizeFloat() ) +
'%';
320 else if ( va == AlignSuperScript ) textPos =
"super";
321 else if ( va == AlignSubScript ) textPos =
"sub";
324 textPos += TQString::number( d->m_relativeTextSize * 100 );
326 gs.addProperty(
"style:text-position", textPos, tt );
328 if ( m_attributeFont == ATT_SMALL_CAPS )
329 gs.addProperty(
"fo:font-variant",
"small-caps", tt );
330 else if ( m_attributeFont == ATT_UPPER )
331 gs.addProperty(
"fo:text-transform",
"uppercase", tt );
332 else if ( m_attributeFont == ATT_LOWER )
333 gs.addProperty(
"fo:text-transform",
"lowercase", tt );
335 gs.addProperty(
"fo:language", m_language ==
"en_US" ? TQString(
"en") : m_language, tt );
336 gs.addProperty(
"fo:background-color",
337 m_textBackColor.isValid() ? m_textBackColor.name() :
"transparent", tt );
338 gs.addProperty(
"fo:text-shadow", shadowAsCss(), tt );
339 gs.addProperty(
"fo:hyphenate", d->m_bHyphenation, tt );
344void KWord13OasisGenerator::fillGenStyleWithLayout(
const KWord13Layout& layout, KoGenStyle& gs,
const bool style )
const
350 str = layout.getProperty(
"FLOW:align" );
351 if ( str.isEmpty() && ! style)
355 else if ( ( str ==
"left" ) || ( str ==
"right") || ( str ==
"center" ) || ( str ==
"justify" ) )
357 gs.addProperty(
"fo:text-align", str );
361 gs.addProperty(
"fo:text-align",
"start" );
364 str = layout.getProperty(
"FLOW:dir" );
367 gs.addProperty(
"style:writing-mode",
"rl-tb" );
371 gs.addProperty(
"style:writing-mode",
"lr-tb" );
375 gs.addPropertyPt(
"fo:margin-left", numberOrNull( layout.getProperty(
"INDENTS:left" ) ) );
376 gs.addPropertyPt(
"fo:margin-right", numberOrNull( layout.getProperty(
"INDENTS:right" ) ) );
377 gs.addPropertyPt(
"fo:text-indent", numberOrNull( layout.getProperty(
"INDENTS:first" ) ) );
378 gs.addPropertyPt(
"fo:margin-top", numberOrNull( layout.getProperty(
"OFFSETS:before" ) ) );
379 gs.addPropertyPt(
"fo:margin-bottom", numberOrNull( layout.getProperty(
"OFFSETS:after" ) ) );
382 switch ( lineSpacingType ) {
383 case KoParagLayout::LS_SINGLE:
384 gs.addProperty(
"fo:line-height",
"100%" );
386 case KoParagLayout::LS_ONEANDHALF:
387 gs.addProperty(
"fo:line-height",
"150%" );
389 case KoParagLayout::LS_DOUBLE:
390 gs.addProperty(
"fo:line-height",
"200%" );
392 case KoParagLayout::LS_MULTIPLE:
393 gs.addProperty(
"fo:line-height", TQString::number( lineSpacing * 100.0 ) +
'%' );
395 case KoParagLayout::LS_FIXED:
396 gs.addPropertyPt(
"fo:line-height", lineSpacing );
398 case KoParagLayout::LS_CUSTOM:
399 gs.addPropertyPt(
"style:line-spacing", lineSpacing );
401 case KoParagLayout::LS_AT_LEAST:
402 gs.addPropertyPt(
"style:line-height-at-least", lineSpacing );
409 buffer.open( IO_WriteOnly );
410 KoXmlWriter tabsWriter( &buffer, 4 );
411 tabsWriter.startElement(
"style:tab-stops" );
412 KoTabulatorList::ConstIterator it = m_tabList.begin();
413 for ( ; it != m_tabList.end() ; it++ )
415 tabsWriter.startElement(
"style:tab-stop" );
416 tabsWriter.addAttributePt(
"style:position", (*it).ptPos );
418 switch ( (*it).type ) {
420 tabsWriter.addAttribute(
"style:type",
"left" );
423 tabsWriter.addAttribute(
"style:type",
"center" );
426 tabsWriter.addAttribute(
"style:type",
"right" );
429 tabsWriter.addAttribute(
"style:type",
"char" );
430 tabsWriter.addAttribute(
"style:char", TQString( (*it).alignChar ) );
435 switch( (*it).filling ) {
437 tabsWriter.addAttribute(
"style:leader-type",
"none" );
440 tabsWriter.addAttribute(
"style:leader-type",
"single" );
441 tabsWriter.addAttribute(
"style:leader-style",
"solid" );
443 tabsWriter.addAttribute(
"style:leader-text",
"_" );
446 tabsWriter.addAttribute(
"style:leader-type",
"single" );
447 tabsWriter.addAttribute(
"style:leader-style",
"dotted" );
449 tabsWriter.addAttribute(
"style:leader-text",
"." );
452 tabsWriter.addAttribute(
"style:leader-type",
"single" );
453 tabsWriter.addAttribute(
"style:leader-style",
"dash" );
455 tabsWriter.addAttribute(
"style:leader-text",
"_" );
458 tabsWriter.addAttribute(
"style:leader-type",
"single" );
459 tabsWriter.addAttribute(
"style:leader-style",
"dot-dash" );
461 tabsWriter.addAttribute(
"style:leader-text",
"." );
463 case TF_DASH_DOT_DOT:
464 tabsWriter.addAttribute(
"style:leader-type",
"single" );
465 tabsWriter.addAttribute(
"style:leader-style",
"dot-dot-dash" );
467 tabsWriter.addAttribute(
"style:leader-text",
"." );
470 if ( (*it).filling != TF_BLANK )
471 tabsWriter.addAttributePt(
"style:leader-width", (*it).ptWidth );
473 tabsWriter.endElement();
475 tabsWriter.endElement();
477 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
478 gs.addChildElement(
"style:tab-stops", elementContents );
482 bool fourBordersEqual = leftBorder.penWidth() > 0 &&
483 leftBorder == rightBorder && rightBorder == topBorder && topBorder == bottomBorder;
484 if ( fourBordersEqual ) {
485 gs.addProperty(
"fo:border", leftBorder.saveFoBorder() );
487 if ( leftBorder.penWidth() > 0 )
488 gs.addProperty(
"fo:border-left", leftBorder.saveFoBorder() );
489 if ( rightBorder.penWidth() > 0 )
490 gs.addProperty(
"fo:border-right", rightBorder.saveFoBorder() );
491 if ( topBorder.penWidth() > 0 )
492 gs.addProperty(
"fo:border-top", topBorder.saveFoBorder() );
493 if ( bottomBorder.penWidth() > 0 )
494 gs.addProperty(
"fo:border-bottom", bottomBorder.saveFoBorder() );
499 if ( pageBreaking & KoParagLayout::HardFrameBreakBefore )
500 gs.addProperty(
"fo:break-before",
"column" );
501 else if ( pageBreaking & KoParagLayout::HardFrameBreakAfter )
502 gs.addProperty(
"fo:break-after",
"column" );
503 if ( pageBreaking & KoParagLayout::KeepLinesTogether )
504 gs.addProperty(
"fo:keep-together",
"always" );
505 if ( pageBreaking & KoParagLayout::KeepWithNext )
506 gs.addProperty(
"fo:keep-with-next",
"always" );
511void KWord13OasisGenerator::generateTextFrameset( KoXmlWriter& writer, KWordTextFrameset* frameset,
bool )
515 kdWarning(30520) <<
"Tried to generate a NULL text frameset!" << endl;
519 for ( TQValueList<KWord13Paragraph>::Iterator it = frameset->m_paragraphGroup.begin();
520 it != frameset->m_paragraphGroup.end(); ++it)
523 writer.startElement(
"text:p",
false );
524 writer.addAttribute(
"text:style-name", (*it).m_layout.m_autoStyleName );
526 const TQString paragraphText( (*it).text() );
529 for (
KWord13Format* format = (*it).m_formats.first(); format; format = (*it).m_formats.next() )
532 const int pos = format->m_pos;
533 const int length = format->length();
534 if ( currentPos < pos )
536 writer.addTextSpan( paragraphText.mid( currentPos, pos - currentPos ) );
541 if ( data && format->m_id == 1 )
543 writer.startElement(
"text:span" );
545 writer.addTextSpan( paragraphText.mid( pos, length ) );
548 else if ( format->m_id == 3 )
551 writer.addTextSpan(
"\t");
553 else if ( format->m_id == 4 )
557 if ( text.isEmpty() )
558 writer.addTextNode(
"#" );
560 writer.addTextSpan( text );
565 writer.addTextNode(
"#");
567 currentPos += length;
570 const TQString tailText( paragraphText.mid( currentPos ) );
571 if ( ! tailText.isEmpty() )
572 writer.addTextSpan( tailText );
574 writer.addTextSpan( (*it).text() );
581void KWord13OasisGenerator::writeStylesXml(
void )
583 if ( !m_store || !m_kwordDocument )
585 kdError(30520) <<
"Not possible to generate style.xml" << endl;
589 m_store->open(
"styles.xml");
590 KoStoreDevice io ( m_store );
591 io.open( IO_WriteOnly );
593 KoXmlWriter *stylesWriter = KoDocument::createOasisXmlWriter( &io,
"office:document-styles" );
595 stylesWriter->startElement(
"office:styles" );
596 TQValueList<KoGenStyles::NamedStyle> styles = m_oasisGenStyles.styles( KoGenStyle::STYLE_USER );
597 TQValueList<KoGenStyles::NamedStyle>::const_iterator it = styles.begin();
598 for ( ; it != styles.end() ; ++it ) {
599 (*it).style->writeStyle( stylesWriter, m_oasisGenStyles,
"style:style", (*it).name,
"style:paragraph-properties" );
601 stylesWriter->endElement();
603 stylesWriter->startElement(
"office:automatic-styles" );
605 styles = m_oasisGenStyles.styles( KWDocument::STYLE_FRAME );
607 for ( ; it != styles.end() ; ++it ) {
608 (*it).style->writeStyle( stylesWriter, m_oasisGenStyles,
"style:style", (*it).name ,
"style:graphic-properties" );
612 TQString pageLayoutName;
613 styles = m_oasisGenStyles.styles( KoGenStyle::STYLE_PAGELAYOUT );
614 Q_ASSERT( styles.count() == 1 );
616 for ( ; it != styles.end() ; ++it ) {
617 (*it).style->writeStyle( stylesWriter, m_oasisGenStyles,
"style:page-layout", (*it).name,
"style:page-layout-properties",
false );
620 stylesWriter->endElement();
621 Q_ASSERT( pageLayoutName.isEmpty() );
622 pageLayoutName = (*it).name;
627 stylesWriter->endElement();
629 stylesWriter->startElement(
"office:master-styles" );
630 stylesWriter->startElement(
"style:master-page" );
631 stylesWriter->addAttribute(
"style:name",
"Standard" );
632 stylesWriter->addAttribute(
"style:page-layout-name", pageLayoutName );
633 stylesWriter->endElement();
634 stylesWriter->endElement();
636 stylesWriter->endElement();
637 stylesWriter->endDocument();
642 if ( m_manifestWriter )
644 m_manifestWriter->addManifestEntry(
"styles.xml",
"text/xml" );
650void KWord13OasisGenerator::writeContentXml(
void)
652 if ( !m_store || !m_kwordDocument )
654 kdError(30520) <<
"Not possible to generate content.xml" << endl;
658 m_store->open(
"content.xml");
659 KoStoreDevice io ( m_store );
660 io.open( IO_WriteOnly );
662 KoXmlWriter *writer = KoDocument::createOasisXmlWriter( &io,
"office:document-content" );
666 writer->startElement(
"office:automatic-styles" );
667 TQValueList<KoGenStyles::NamedStyle> styles = m_oasisGenStyles.styles( KoGenStyle::STYLE_AUTO );
668 TQValueList<KoGenStyles::NamedStyle>::const_iterator it;
669 for ( it = styles.begin(); it != styles.end() ; ++it ) {
670 (*it).style->writeStyle( writer, m_oasisGenStyles,
"style:style", (*it).name,
"style:paragraph-properties" );
672 styles = m_oasisGenStyles.styles( KoGenStyle::STYLE_LIST );
673 for ( it = styles.begin(); it != styles.end() ; ++it ) {
674 (*it).style->writeStyle( writer, m_oasisGenStyles,
"text:list-style", (*it).name, 0 );
676 writer->endElement();
678 writer->startElement(
"office:body" );
679 writer->startElement(
"office:text" );
682 generateTextFrameset( *writer, m_kwordDocument->m_normalTextFramesetList.first(),
true );
684 writer->endElement();
685 writer->endElement();
690 writer->endElement();
691 writer->endDocument();
696 if ( m_manifestWriter )
698 m_manifestWriter->addManifestEntry(
"content.xml",
"text/xml" );
702void KWord13OasisGenerator::writeMetaXml(
void)
704 if ( !m_store || !m_kwordDocument )
706 kdError(30520) <<
"Not possible to generate meta.xml" << endl;
710 m_store->open(
"meta.xml");
711 KoStoreDevice io ( m_store );
712 io.open( IO_WriteOnly );
714 KoXmlWriter *writer = KoDocument::createOasisXmlWriter( &io,
"office:document-meta" );
716 writer->startElement(
"office:meta" );
720 writer->startElement(
"meta:generator" );
722 strVersion +=
"KWord-OneDotThree-Import-Filter/";
723 strVersion += TQString(
"$Revision: 515673 $" ).mid( 10 ).remove(
'$' ).stripWhiteSpace();
724 strVersion +=
" KOffice/";
725 strVersion += KOFFICE_VERSION_STRING;
726 writer->addTextSpan( strVersion );
727 writer->endElement();
731 str = m_kwordDocument->getDocumentInfo(
"about:title" );
732 if ( !str.isEmpty() )
734 writer->startElement(
"dc:title" );
735 writer->addTextSpan( str );
736 writer->endElement();
739 str = m_kwordDocument->getDocumentInfo(
"about:abstract" );
742 writer->startElement(
"dc:description");
743 writer->addTextSpan( str );
744 writer->endElement();
747 str = m_kwordDocument->getDocumentInfo(
"author:full-name" );
748 if ( !str.isEmpty() )
750 writer->startElement(
"dc:creator" );
751 writer->addTextSpan( str );
752 writer->endElement();
759 dt = m_kwordDocument->creationDate();
762 writer->startElement(
"meta:creation-date");
763 writer->addTextNode( dt.toString( TQt::ISODate) );
764 writer->endElement();
767 dt = m_kwordDocument->modificationDate();
770 writer->startElement(
"dc:date");
771 writer->addTextNode( dt.toString( TQt::ISODate) );
772 writer->endElement();
775 dt = m_kwordDocument->lastPrintingDate();
778 writer->startElement(
"meta:print-date");
779 writer->addTextNode( dt.toString( TQt::ISODate) );
780 writer->endElement();
783 writer->startElement(
"meta:document-statistic" );
786 const int numPages = m_kwordDocument->getProperty(
"PAPER:pages" ).toInt();
789 writer->addAttribute(
"meta:page-count", numPages );
793 zipWriteData(
" meta:image-count=\"" );
797 zipWriteData( TQString::number ( m_pictureNumber ) );
799 zipWriteData(
"\"" );
801 zipWriteData(
" meta:table-count=\"" );
805 zipWriteData( TQString::number ( m_tableNumber ) );
807 zipWriteData(
"\"" );
809 writer->endElement();
810 writer->endElement();
812 writer->endElement();
813 writer->endDocument();
819 if ( m_manifestWriter )
821 m_manifestWriter->addManifestEntry(
"meta.xml",
"text/xml" );
825void KWord13OasisGenerator::writePreviewFile(
void)
827 if ( !m_store || !m_kwordDocument )
829 kdError(30520) <<
"Not possible to generate preview file" << endl;
834 TQImage image( m_kwordDocument->m_previewFile->name() );
835 if ( image.isNull() )
837 kdWarning(30520) <<
"Could not re-read preview from temp file!" << endl;
842 TQImage preview( image.convertDepth( 32, TQt::ColorOnly ).smoothScale( 128, 128 ) );
843 if ( preview.isNull() )
845 kdWarning(30520) <<
"Could not create preview!" << endl;
848 if ( !preview.hasAlphaBuffer() )
850 preview.setAlphaBuffer(
true );
852 m_store->open(
"Thumbnails/thumbnail.png");
853 KoStoreDevice io ( m_store );
854 io.open( IO_WriteOnly );
855 preview.save( &io,
"PNG", 0 );
862void KWord13OasisGenerator::writePictures(
void )
864 if ( !m_store || !m_kwordDocument )
866 kdError(30520) <<
"Not possible to generate preview file" << endl;
870 for ( TQDictIterator<KWord13Picture> it( m_kwordDocument->m_pictureDict ) ; it.current(); ++it )
872 if ( !it.current()->m_valid || !it.current()->m_tempFile )
874 kdDebug(30520) <<
"No data for picture: " << it.currentKey() << endl;
877 const TQString fileName( it.current()->m_tempFile->name() );
878 const TQString oasisName( it.current()->getOasisPictureName() );
879 kdDebug(30520) <<
"Copying... " << it.currentKey() << endl <<
" => " << oasisName << endl;
880 TQFile file( fileName );
881 if ( !file.open( IO_ReadOnly ) )
883 kdWarning(30520) <<
"Cannot open: " << fileName << endl;
886 TQByteArray array( file.readAll() );
887 if ( array.isNull() )
889 kdWarning(30520) <<
"Null picture for " << fileName << endl;
895 m_store->open( oasisName );
896 m_store->write( array );
899 if ( m_manifestWriter )
901 const TQString mimeType ( KMimeType::findByContent( array, 0 )->name() );
902 if ( mimeType ==
"application/octet-stream" )
904 kdWarning(30520) <<
"Generic mime type for " << it.currentKey() << endl;
907 m_manifestWriter->addManifestEntry( oasisName, mimeType );
914bool KWord13OasisGenerator::generate (
const TQString& fileName, KWord13Document& kwordDocument )
916 if ( m_kwordDocument && ( (
void*) m_kwordDocument ) != ( (
void*) &kwordDocument ) )
918 kdWarning(30520) <<
"KWord Document is different!" <<endl;
921 m_kwordDocument = &kwordDocument;
923 m_store = KoStore::createStore( fileName, KoStore::Write,
"application/vnd.sun.xml.writer", KoStore::Zip );
926 kdError(30520) <<
"Cannot create output KoStore" << endl;
929 m_store->disallowNameExpansion();
932 TQByteArray manifestData;
933 TQBuffer manifestBuffer( manifestData );
934 manifestBuffer.open( IO_WriteOnly );
935 m_manifestWriter =
new KoXmlWriter( &manifestBuffer );
936 m_manifestWriter->startDocument(
"manifest:manifest" );
937 m_manifestWriter->startElement(
"manifest:manifest" );
938 m_manifestWriter->addAttribute(
"xmlns:manifest",
"urn:oasis:names:tc:openoffice:xmlns:manifest:1.0" );
948 m_manifestWriter->endElement();
949 m_manifestWriter->endDocument();
950 delete m_manifestWriter;
951 m_manifestWriter = 0;
952 if ( m_store->open(
"META-INF/manifest.xml" ) )
954 m_store->write( manifestData );
958 if ( kwordDocument.m_previewFile )
964 kdDebug(30520) <<
"No preview file available to make an OASIS thumbnail!" << endl;
970 if ( m_store->open(
"Debug/debug.xml") )
972 KoStoreDevice io ( m_store );
973 io.open( IO_WriteOnly );
974 kwordDocument.xmldump( &io );
TQString m_autoStyleName
Name of the OASIS automatic style.
TQString m_name
Name of the style (either the used one or the one currently being defined)
KWord13FormatOneData m_format
Character format properties.