void DateVariable::saveOdf(KoShapeSavingContext & context) { // TODO support data-style-name KoXmlWriter *writer = &context.xmlWriter(); if (m_displayType == Time) { writer->startElement("text:time", false); } else { writer->startElement("text:date", false); } if (!m_definition.isEmpty()) { QString styleName = KoOdfNumberStyles::saveOdfDateStyle(context.mainStyles(), m_definition, false); writer->addAttribute("style:data-style-name", styleName); } if (m_type == Fixed) { writer->addAttribute("text:fixed", "true"); // only write as much information as we read: just date/time or datetime if (m_displayType == Time) { const QString timeValue = (m_valueType == DateTime) ? m_datetime.toString(Qt::ISODate) : m_datetime.time().toString(Qt::ISODate); writer->addAttribute("text:time-value", timeValue); } else { const QString dateValue = (m_valueType == DateTime) ? m_datetime.toString(Qt::ISODate) : m_datetime.date().toString(Qt::ISODate); writer->addAttribute("text:date-value", dateValue); } } else { writer->addAttribute("text:fixed", "false"); } writer->addTextNode(value()); writer->endElement(); }
static void writePartGroup(KoXmlWriter& w, int id, PartGroup* group) { w.startElement("music:part-group"); w.addAttribute("type", "start"); w.addAttribute("number", id); if (!group->name().isNull()) { w.startElement("music:group-name"); w.addTextNode(group->name()); w.endElement(); // music:group-name } if (!group->shortName(false).isNull()) { w.startElement("music:group-abbreviation"); w.addTextNode(group->shortName()); w.endElement(); // music:group-abbreviation } if (group->symbol() != PartGroup::None) { w.startElement("music:group-symbol"); switch (group->symbol()) { case PartGroup::None: w.addTextNode("none"); break; case PartGroup::Brace: w.addTextNode("brace"); break; case PartGroup::Line: w.addTextNode("line"); break; case PartGroup::Bracket: w.addTextNode("bracket"); break; } w.endElement(); // music:group-symbol } w.startElement("music:group-barline"); w.addTextNode(group->commonBarLines() ? "yes" : "no"); w.endElement(); // music:group-barline w.endElement(); // music:part-group }
void CompositeEffect::save(KoXmlWriter &writer) { writer.startElement(CompositeEffectId); saveCommonAttributes(writer); switch (m_operation) { case CompositeOver: writer.addAttribute("operator", "over"); break; case CompositeIn: writer.addAttribute("operator", "in"); break; case CompositeOut: writer.addAttribute("operator", "out"); break; case CompositeAtop: writer.addAttribute("operator", "atop"); break; case CompositeXor: writer.addAttribute("operator", "xor"); break; case Arithmetic: writer.addAttribute("operator", "arithmetic"); writer.addAttribute("k1", QString("%1").arg(m_k[0])); writer.addAttribute("k2", QString("%1").arg(m_k[1])); writer.addAttribute("k3", QString("%1").arg(m_k[2])); writer.addAttribute("k4", QString("%1").arg(m_k[3])); break; } writer.addAttribute("in2", inputs().at(1)); writer.endElement(); }
void KoRow::saveOdf(KoXmlWriter& writer, KoGenStyles& styles) { writer.startElement("table:table-row"); if(m_style) { writer.addAttribute("table:style-name", m_style->saveOdf(styles)); } if(m_defaultCellStyle) { writer.addAttribute("table:default-cell-style-name", m_defaultCellStyle->saveOdf(styles)); } writer.addAttribute("table:visibility", visibilityMap.value(m_visibility)); }
void FloodEffect::save(KoXmlWriter &writer) { writer.startElement(FloodEffectId); saveCommonAttributes(writer); writer.addAttribute("flood-color", m_color.name()); if (m_color.alpha() < 255) writer.addAttribute("flood-opacity", QString("%1").arg(m_color.alphaF())); writer.endElement(); }
void KoInlineNote::saveOdf(KoShapeSavingContext & context) { KoXmlWriter *writer = &context.xmlWriter(); QTextDocument *document = new QTextDocument(); KoTextDocument textDocument(document); Q_ASSERT(!d->styleManager.isNull()); textDocument.setStyleManager(d->styleManager.data()); QTextCursor cursor(document); cursor.insertFragment(d->text); if (d->type == Footnote || d->type == Endnote) { writer->startElement("text:note", false); if (d->type == Footnote) writer->addAttribute("text:note-class", "footnote"); else writer->addAttribute("text:note-class", "endnote"); writer->addAttribute("text:id", d->id); writer->startElement("text:note-citation", false); if (!autoNumbering()) writer->addAttribute("text:label", d->label); writer->addTextNode(d->label); writer->endElement(); writer->startElement("text:note-body", false); KoTextWriter textWriter(context); textWriter.write(document, 0); writer->endElement(); writer->endElement(); } else if (d->type == Annotation) { writer->startElement("office:annotation"); if (!d->author.isEmpty()) { writer->startElement("dc:creator"); writer->addTextNode(d->author); writer->endElement(); } if (d->date.isValid()) { writer->startElement("dc:date"); writer->addTextSpan(d->date.toString(Qt::ISODate)); writer->endElement(); } KoTextWriter textWriter(context); textWriter.write(document, 0); writer->endElement(); } delete document; }
void BlurEffect::save(KoXmlWriter &writer) { writer.startElement(BlurEffectId); saveCommonAttributes(writer); if (m_deviation.x() != m_deviation.y()) { writer.addAttribute("stdDeviation", QString("%1, %2").arg(m_deviation.x()).arg(m_deviation.y())); } else { writer.addAttribute("stdDeviation", m_deviation.x()); } writer.endElement(); }
void Ko3dScene::Lightsource::saveOdf(KoXmlWriter &writer) const { writer.startElement("dr3d:light"); writer.addAttribute("dr3d:diffuse-color", m_diffuseColor.name()); writer.addAttribute("dr3d:direction", (QString("(%1 %2 %3)") .arg(m_direction.x(), 0, 'f', 11) .arg(m_direction.y(), 0, 'f', 11) .arg(m_direction.z(), 0, 'f', 11))); writer.addAttribute("dr3d:enabled", m_enabled); writer.addAttribute("dr3d:specular", m_specular); writer.endElement(); // dr3d:light }
void ColorMatrixEffect::save(KoXmlWriter &writer) { writer.startElement(ColorMatrixEffectId); saveCommonAttributes(writer); switch (m_type) { case Matrix: { writer.addAttribute("type", "matrix"); QString matrix; for (int r = 0; r < MatrixRows; ++r) { for (int c = 0; c < MatrixCols; ++c) { matrix += QString("%1 ").arg(m_matrix[r*MatrixCols+c]); } } writer.addAttribute("values", matrix); } break; case Saturate: writer.addAttribute("type", "saturate"); writer.addAttribute("values", QString("%1").arg(m_value)); break; case HueRotate: writer.addAttribute("type", "hueRotate"); writer.addAttribute("values", QString("%1").arg(m_value)); break; case LuminanceAlpha: writer.addAttribute("type", "luminanceToAlpha"); break; } writer.endElement(); }
void MorphologyEffect::save(KoXmlWriter &writer) { writer.startElement(MorphologyEffectId); saveCommonAttributes(writer); if (m_operator != Erode ) writer.addAttribute("operator", "dilate"); if (!m_radius.isNull()) { if (m_radius.x() == m_radius.y()) { writer.addAttribute("radius", QString("%1").arg(m_radius.x())); } else { writer.addAttribute("radius", QString("%1 %2").arg(m_radius.x()).arg(m_radius.y())); } } writer.endElement(); }
QByteArray HancomWordImport::Private::createContent() { KoXmlWriter* contentWriter; QByteArray contentData; QBuffer contentBuffer( &contentData ); contentBuffer.open( QIODevice::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:table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0" ); contentWriter->addAttribute( "xmlns:draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" ); contentWriter->addAttribute( "xmlns:fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" ); contentWriter->addAttribute( "xmlns:svg","urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" ); contentWriter->addAttribute( "office:version","1.0" ); contentWriter->startElement( "office:automatic-styles" ); contentWriter->endElement(); // office:automatic-style // office:body contentWriter->startElement( "office:body" ); contentWriter->startElement( "office:text" ); contentWriter->startElement( "text:sequence-decls" ); contentWriter->endElement(); // text:sequence-decls for( int i = 0; i < paragraphs.count(); i++ ) { QString text = paragraphs[i]; text.replace( '\r', ' ' ); contentWriter->startElement( "text:p" ); contentWriter->addTextNode( text ); contentWriter->endElement(); // text:p } contentWriter->endElement(); //office:text contentWriter->endElement(); // office:body contentWriter->endElement(); // office:document-content contentWriter->endDocument(); delete contentWriter; return contentData; }
bool KoDocumentInfoUserMetadata::saveOasis( KoXmlWriter &xmlWriter ) { QMap<QString, QString>::iterator it; for ( it = m_metaList.begin(); it != m_metaList.end(); ++it ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", it.key() ); xmlWriter.addTextNode( it.data() ); xmlWriter.endElement(); } return true; }
void KoInlineNote::saveOdf(KoShapeSavingContext & context) { KoXmlWriter *writer = &context.xmlWriter(); writer->startElement("text:note", false); if (d->type == Footnote) writer->addAttribute("text:note-class", "footnote"); else writer->addAttribute("text:note-class", "endnote"); writer->addAttribute("text:id", d->id); writer->startElement("text:note-citation", false); if (!autoNumbering()) writer->addAttribute("text:label", d->label); writer->addTextNode(d->label); writer->endElement(); writer->startElement("text:note-body", false); writer->startElement("text:p"); writer->addTextNode(d->text); writer->endElement(); writer->endElement(); writer->endElement(); }
void WordsTableHandler::tableRowStart(wvWare::SharedPtr<const wvWare::Word97::TAP> tap) { kDebug(30513) ; if (m_row == -2) { kWarning(30513) << "tableRowStart: tableStart not called previously!"; return; } Q_ASSERT(m_currentTable); Q_ASSERT(!m_currentTable->name.isEmpty()); m_row++; m_column = -1; m_tap = tap; KoXmlWriter* writer = currentWriter(); //kDebug(30513) << "tableRowStart row=" << m_row // << ", number of cells: " << tap->itcMac; KoGenStyle rowStyle(KoGenStyle::TableRowAutoStyle, "table-row"); //in case a header or footer is processed, save the style into styles.xml if (document()->writingHeader()) { rowStyle.setAutoStyleInStylesDotXml(true); } // The 6 BRC objects are for top, left, bottom, right, // insidehorizontal, insidevertical (default values). for (int i = 0; i < 6; i++) { const wvWare::Word97::BRC& brc = tap->rgbrcTable[i]; //kDebug(30513) << "default border" << brc.brcType << (brc.dptLineWidth / 8.0); m_borderStyle[i] = Conversion::setBorderAttributes(brc); m_margin[i] = QString::number(brc.dptSpace) + "pt"; } // We ignore brc.dptSpace (spacing), brc.fShadow (shadow), and brc.fFrame (?) QString rowHeightString = QString::number(twipsToPt(qAbs(tap->dyaRowHeight)), 'f').append("pt"); if (tap->dyaRowHeight > 0) { rowStyle.addProperty("style:min-row-height", rowHeightString); } else if (tap->dyaRowHeight < 0) { rowStyle.addProperty("style:row-height", rowHeightString); } if (tap->fCantSplit) { rowStyle.addProperty("fo:keep-together", "always"); } QString rowStyleName = m_mainStyles->insert(rowStyle, QLatin1String("row")); //start table row in content writer->startElement("table:table-row"); writer->addAttribute("table:style-name", rowStyleName.toUtf8()); }
void MusicXmlWriter::writeSheet(KoXmlWriter& w, Sheet* sheet, bool writeNamespaceDef) { // w.startDocument("score-partwise", "-//Recordare//DTD MusicXML 1.1 Partwise//EN", // "http://www.musicxml.org/dtds/partwise.dtd"); w.startElement("music:score-partwise"); if (writeNamespaceDef) { w.addAttribute("xmlns:music", "http://www.calligra.org/music"); } w.addAttribute("version", "1.1"); w.startElement("music:part-list"); for (int i = 0; i < sheet->partCount(); i++) { for (int pg = 0; pg < sheet->partGroupCount(); pg++) { if (sheet->partGroup(pg)->firstPart() == i) { writePartGroup(w, pg+1, sheet->partGroup(pg)); } } writePartDesc(w, i, sheet->part(i)); for (int pg = 0; pg < sheet->partGroupCount(); pg++) { if (sheet->partGroup(pg)->lastPart() == i) { w.startElement("music:part-group"); w.addAttribute("type", "stop"); w.addAttribute("number", pg+1); w.endElement(); // music:part-group } } } w.endElement(); // music:part-list for (int i = 0; i < sheet->partCount(); i++) { writePart(w, i, sheet->part(i)); } w.endElement(); // music:score-partwise // w.endDocument(); }
static void writeKeySignature(KoXmlWriter& w, KeySignature* ks, Part* part) { w.startElement("music:key"); if (part->staffCount() > 1) { // only write staff info when more than one staff exists Staff* s = ks->staff(); w.addAttribute("number", QString::number(part->indexOfStaff(s) + 1)); } w.startElement("music:fifths"); w.addTextNode(QString::number(ks->accidentals())); w.endElement(); // music:fifths w.endElement(); // music:key }
bool KoDocumentInfo::saveOasisAuthorInfo(KoXmlWriter &xmlWriter) { foreach(const QString & tag, m_authorTags) { if (!authorInfo(tag).isEmpty() && tag == "creator") { xmlWriter.startElement("dc:creator"); xmlWriter.addTextNode(authorInfo("creator")); xmlWriter.endElement(); } else if (!authorInfo(tag).isEmpty()) { xmlWriter.startElement("meta:user-defined"); xmlWriter.addAttribute("meta:name", tag); xmlWriter.addTextNode(authorInfo(tag)); xmlWriter.endElement(); } } return true; }
void ImageEffect::save(KoXmlWriter &writer) { writer.startElement(ImageEffectId); saveCommonAttributes(writer); QByteArray ba; QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); if (m_image.save(&buffer, "PNG")) { QMimeDatabase db; const QString mimeType(db.mimeTypeForData(ba).name()); writer.addAttribute("xlink:href", "data:" + mimeType + ";base64," + ba.toBase64()); } writer.endElement(); }
void KoBookmark::saveOdf(KoShapeSavingContext &context) { KoXmlWriter *writer = &context.xmlWriter(); QString nodeName; if (d->type == SinglePosition) nodeName = "text:bookmark"; else if (d->type == StartBookmark) nodeName = "text:bookmark-start"; else if (d->type == EndBookmark) nodeName = "text:bookmark-end"; writer->startElement(nodeName.toLatin1(), false); writer->addAttribute("text:name", d->name.toLatin1()); if (d->type == StartBookmark && inlineRdf()) { inlineRdf()->saveOdf(context, writer); } writer->endElement(); }
static void writePartDesc(KoXmlWriter& w, int id, Part* part) { w.startElement("music:score-part"); w.addAttribute("id", QString("P%1").arg(id)); w.startElement("music:part-name"); w.addTextNode(part->name()); w.endElement(); // music:part-name QString abbr = part->shortName(false); if (!abbr.isNull()) { w.startElement("music:part-abbreviation"); w.addTextNode(abbr); w.endElement(); // music:part-abbreviation } w.endElement(); // music:score-part }
void GenValidationStyles::writeStyle(KoXmlWriter& writer) { if (m_styles.count() > 0) { writer.startElement("table:content-validations"); StyleMap::Iterator it; for (it = m_styles.begin(); it != m_styles.end(); ++it) { writer.startElement("table:content-validation"); writer.addAttribute("table:name", it.value()); writer.addAttribute("table:allow-empty-cell", it.key().allowEmptyCell); writer.addAttribute("table:condition", it.key().condition); writer.startElement("table:help-message"); writer.addAttribute("table:title", it.key().title); writer.addAttribute("table:display", it.key().displayValidationInformation); QStringList text = it.key().messageInfo.split('\n', QString::SkipEmptyParts); for (QStringList::Iterator it2 = text.begin(); it2 != text.end(); ++it2) { writer.startElement("text:p"); writer.addTextNode(*it2); writer.endElement(); } writer.endElement(); writer.startElement("table:error-message"); writer.addAttribute("table:message-type", it.key().messageType); writer.addAttribute("table:title", it.key().titleInfo); writer.addAttribute("table:display", it.key().displayMessage); text = it.key().message.split('\n', QString::SkipEmptyParts); for (QStringList::Iterator it3 = text.begin(); it3 != text.end(); ++it3) { writer.startElement("text:p"); writer.addTextNode(*it3); writer.endElement(); } writer.endElement(); writer.endElement(); } writer.endElement();//close sheet:content-validation } }
void PageVariable::saveOdf(KoShapeSavingContext & context) { KoXmlWriter *writer = &context.xmlWriter(); switch (m_type) { case PageCount: // <text:page-count>3</text:page-count> writer->startElement("text:page-count", false); writer->addTextNode(value()); writer->endElement(); break; case PageNumber: // <text:page-number text:select-page="current" text:page-adjust="2" text:fixed="true">3</text:page-number> writer->startElement("text:page-number", false); if (m_pageselect == KoTextPage::CurrentPage) writer->addAttribute("text:select-page", "current"); else if (m_pageselect == KoTextPage::PreviousPage) writer->addAttribute("text:select-page", "previous"); else if (m_pageselect == KoTextPage::NextPage) writer->addAttribute("text:select-page", "next"); if (m_pageadjust != 0) writer->addAttribute("text:page-adjust", QString::number(m_pageadjust)); m_numberFormat.saveOdf(writer); if (m_fixed) writer->addAttribute("text:fixed", "true"); writer->addTextNode(value()); writer->endElement(); break; case PageContinuation: // <text:page-continuation-string text:select-page="previous">The Text</text:page-continuation-string> writer->startElement("page-continuation-string", false); if (m_pageselect == KoTextPage::PreviousPage) writer->addAttribute("text:select-page", "previous"); else if (m_pageselect == KoTextPage::NextPage) writer->addAttribute("text:select-page", "next"); writer->addTextNode(m_continuation); writer->endElement(); break; } }
static void writeTimeSignature(KoXmlWriter& w, TimeSignature* ts, Part* part) { w.startElement("music:time"); if (part->staffCount() > 1) { // only write staff info when more than one staff exists Staff* s = ts->staff(); w.addAttribute("number", QString::number(part->indexOfStaff(s) + 1)); } w.startElement("music:beats"); w.addTextNode(QString::number(ts->beats())); w.endElement(); // music:beats w.startElement("music:beat-type"); w.addTextNode(QString::number(ts->beat())); w.endElement(); // music:beat-type w.endElement(); // music:time }
static void writeClef(KoXmlWriter& w, Clef* clef, Part* part) { w.startElement("music:clef"); if (part->staffCount() > 1) { // only write staff info when more than one staff exists Staff* s = clef->staff(); w.addAttribute("number", QString::number(part->indexOfStaff(s) + 1)); } w.startElement("music:sign"); switch (clef->shape()) { case Clef::GClef: w.addTextNode("G"); break; case Clef::FClef: w.addTextNode("F"); break; case Clef::CClef: w.addTextNode("C"); break; } w.endElement(); // music:sign w.endElement(); // music:clef }
QByteArray HancomWordImport::Private::createManifest() { KoXmlWriter* manifestWriter; QByteArray manifestData; QBuffer manifestBuffer( &manifestData ); manifestBuffer.open( QIODevice::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.text" ); manifestWriter->addManifestEntry( "styles.xml", "text/xml" ); manifestWriter->addManifestEntry( "content.xml", "text/xml" ); manifestWriter->endElement(); manifestWriter->endDocument(); delete manifestWriter; return manifestData; }
void saveOdfLabel(KoShape *label, KoXmlWriter &bodyWriter, KoGenStyles &mainStyles, LabelType labelType) { // Don't save hidden labels, as that's the way of removing them // from a chart. if (!label->isVisible()) return; TextLabelData *labelData = qobject_cast<TextLabelData*>(label->userData()); if (!labelData) return; if (labelType == FooterLabelType) bodyWriter.startElement("chart:footer"); else if (labelType == SubTitleLabelType) bodyWriter.startElement("chart:subtitle"); else // if (labelType == TitleLabelType) bodyWriter.startElement("chart:title"); bodyWriter.addAttributePt("svg:x", label->position().x()); bodyWriter.addAttributePt("svg:y", label->position().y()); bodyWriter.addAttributePt("svg:width", label->size().width()); bodyWriter.addAttributePt("svg:height", label->size().height()); // TODO: Save text label color QTextCursor cursor(labelData->document()); QFont labelFont = cursor.charFormat().font(); KoGenStyle autoStyle(KoGenStyle::ChartAutoStyle, "chart", 0); autoStyle.addPropertyPt("style:rotation-angle", 360 - label->rotation()); saveOdfFont(autoStyle, labelFont, QColor()); bodyWriter.addAttribute("chart:style-name", mainStyles.insert(autoStyle, "ch")); bodyWriter.startElement("text:p"); bodyWriter.addTextNode(labelData->document()->toPlainText()); bodyWriter.endElement(); // text:p bodyWriter.endElement(); // chart:title/subtitle/footer }
bool DocBase::saveOdfHelper(SavingContext & documentContext, SaveFlag saveFlag, QString* /*plainText*/) { Q_UNUSED(saveFlag); KoStore * store = documentContext.odfStore.store(); KoXmlWriter * manifestWriter = documentContext.odfStore.manifestWriter(); KoStoreDevice dev(store); KoGenStyles mainStyles;//for compile KoXmlWriter* contentWriter = documentContext.odfStore.contentWriter(); KoXmlWriter* bodyWriter = documentContext.odfStore.bodyWriter(); KoShapeSavingContext savingContext(*bodyWriter, mainStyles, documentContext.embeddedSaver); //todo fixme just add a element for testing saving content.xml bodyWriter->startElement("office:body"); bodyWriter->startElement("office:spreadsheet"); // Saving the map. map()->saveOdf(*contentWriter, savingContext); bodyWriter->endElement(); ////office:spreadsheet bodyWriter->endElement(); ////office:body // Done with writing out the contents to the tempfile, we can now write out the automatic styles mainStyles.saveOdfStyles(KoGenStyles::DocumentAutomaticStyles, contentWriter); documentContext.odfStore.closeContentWriter(); //add manifest line for content.xml manifestWriter->addManifestEntry("content.xml", "text/xml"); mainStyles.saveOdfStylesDotXml(store, manifestWriter); if (!store->open("settings.xml")) return false; KoXmlWriter* settingsWriter = KoOdfWriteStore::createOasisXmlWriter(&dev, "office:document-settings"); settingsWriter->startElement("office:settings"); settingsWriter->startElement("config:config-item-set"); settingsWriter->addAttribute("config:name", "view-settings"); saveUnitOdf(settingsWriter); saveOdfSettings(*settingsWriter); settingsWriter->endElement(); // config:config-item-set settingsWriter->startElement("config:config-item-set"); settingsWriter->addAttribute("config:name", "configuration-settings"); settingsWriter->addConfigItem("SpellCheckerIgnoreList", d->spellListIgnoreAll.join(",")); settingsWriter->endElement(); // config:config-item-set settingsWriter->endElement(); // office:settings settingsWriter->endElement(); // Root:element settingsWriter->endDocument(); delete settingsWriter; if (!store->close()) return false; if (!savingContext.saveDataCenter(store, manifestWriter)) { return false; } manifestWriter->addManifestEntry("settings.xml", "text/xml"); setModified(false); return true; }
void Ko3dScene::saveOdfAttributes(KoXmlWriter &writer) const { // 1. Write scene attributes // Camera attributes writer.addAttribute("dr3d:vrp", (QString("(%1 %2 %3)") .arg(d->vrp.x(), 0, 'f', 11) .arg(d->vrp.y(), 0, 'f', 11) .arg(d->vrp.z(), 0, 'f', 11))); writer.addAttribute("dr3d:vpn", (QString("(%1 %2 %3)") .arg(d->vpn.x(), 0, 'f', 11) .arg(d->vpn.y(), 0, 'f', 11) .arg(d->vpn.z(), 0, 'f', 11))); writer.addAttribute("dr3d:vup", (QString("(%1 %2 %3)") .arg(d->vup.x(), 0, 'f', 11) .arg(d->vup.y(), 0, 'f', 11) .arg(d->vup.z(), 0, 'f', 11))); writer.addAttribute("dr3d:projection", (d->projection == Parallel) ? "parallel" : "perspective"); writer.addAttribute("dr3d:distance", d->distance); writer.addAttribute("dr3d:focal-length", d->focalLength); writer.addAttribute("dr3d:shadow-slant", d->shadowSlant); writer.addAttribute("dr3d:ambient-color", d->ambientColor.name()); // Rendering attributes switch (d->shadeMode) { case Flat: writer.addAttribute("dr3d:shade-mode", "flat"); break; case Phong: writer.addAttribute("dr3d:shade-mode", "phong"); break; case Draft: writer.addAttribute("dr3d:shade-mode", "draft"); break; case Gouraud: default: writer.addAttribute("dr3d:shade-mode", "gouraud"); break; } writer.addAttribute("dr3d:lighting-mode", d->lightingMode); writer.addAttribute("dr3d:transform", d->transform); }
// Called by Document before invoking the table-row-functors void WordsTableHandler::tableStart(Words::Table* table) { kDebug(30513); Q_ASSERT(table); Q_ASSERT(!table->name.isEmpty()); wvWare::SharedPtr<const wvWare::Word97::TAP> tap = table->tap; KoXmlWriter* writer = currentWriter(); m_currentTable = table; m_cellOpen = false; m_row = -1; m_currentY = 0; #ifdef DEBUG_TABLEHANDLER for (unsigned int i = 0; i < (unsigned int)table->m_cellEdges.size(); i++) { kDebug(30513) << table->m_cellEdges[i]; } #endif if (m_currentTable->floating) { const KoGenStyle::PropertyType gt = KoGenStyle::GraphicType; KoGenStyle style(KoGenStyle::GraphicAutoStyle, "graphic"); if (document()->writingHeader()) { style.setAutoStyleInStylesDotXml(true); } //style:wrap if (tap->textWrap) { if (tap->dxaAbs == -8) { style.addProperty("style:wrap", "left", gt); } else if (tap->dxaAbs == 0) { style.addProperty("style:wrap", "right", gt); } else { style.addProperty("style:wrap", "parallel", gt); } //ODF-1.2: Specifies the number of paragraphs that can wrap around //a frame if wrap mode is in {left, right, parallel, dynamic} and //anchor type is in {char, paragraph}. style.addProperty("style:number-wrapped-paragraphs", "no-limit", gt); } else { style.addProperty("style:wrap", "none", gt); } //fo:margin style.addPropertyPt("fo:margin-left", twipsToPt(tap->dxaFromText), gt); style.addPropertyPt("fo:margin-right", twipsToPt(tap->dxaFromTextRight), gt); style.addPropertyPt("fo:margin-top", twipsToPt(tap->dyaFromText), gt); style.addPropertyPt("fo:margin-bottom", twipsToPt(tap->dyaFromTextBottom), gt); int dxaAbs = 0; int dyaAbs = 0; //style:horizontal-pos - horizontal position of the anchor QString pos = Conversion::getHorizontalPos(tap->dxaAbs); style.addProperty("style:horizontal-pos", pos, gt); if (pos == "from-left") { dxaAbs = tap->dxaAbs; } //style:vertical-pos - vertical position of the anchor pos = Conversion::getVerticalPos(tap->dyaAbs); style.addProperty("style:vertical-pos", pos, gt); if (pos == "from-top") { dyaAbs = tap->dyaAbs; } //style:vertical-rel - relative vertical position of the anchor pos = Conversion::getVerticalRel(tap->pcVert); if (!pos.isEmpty()) { style.addProperty("style:vertical-rel", pos, gt); } //style:horizontal-rel - relative horizontal position of the anchor pos = Conversion::getHorizontalRel(tap->pcHorz); if (!pos.isEmpty()) { style.addProperty("style:horizontal-rel", pos, gt); } //draw:auto-grow-height style.addProperty("draw:auto-grow-height", "true", gt); const QString drawStyleName = m_mainStyles->insert(style); writer->startElement("draw:frame"); writer->addAttribute("draw:style-name", drawStyleName.toUtf8()); writer->addAttribute("text:anchor-type", "paragraph"); int width = table->m_cellEdges[table->m_cellEdges.size() - 1] - table->m_cellEdges[0]; writer->addAttributePt("svg:width", twipsToPt(width)); if (style.property("style:horizontal-pos", gt) == "from-left") { writer->addAttributePt("svg:x", twipsToPt(dxaAbs + tap->rgdxaCenter[0])); } writer->addAttributePt("svg:y", twipsToPt(dyaAbs)); writer->startElement("draw:text-box"); } //absolutely positioned table KoGenStyle tableStyle(KoGenStyle::TableAutoStyle, "table"); if (document()->writingHeader()) { tableStyle.setAutoStyleInStylesDotXml(true); } //TODO: process the border color information <table:border-color> if (tap->fBiDi == 1) { tableStyle.addProperty("style:writing-mode", "rl-tb"); } else { tableStyle.addProperty("style:writing-mode", "lr-tb"); } //process horizontal align information QString align; if (m_currentTable->floating) { align = QString("margins"); } else { switch (tap->jc) { case hAlignLeft: align = QString("left"); break; case hAlignCenter: align = QString("center"); break; case hAlignRight: align = QString("right"); break; } } tableStyle.addProperty("table:align", align); int width = table->m_cellEdges[table->m_cellEdges.size() - 1] - table->m_cellEdges[0]; tableStyle.addPropertyPt("style:width", twipsToPt(width)); tableStyle.addProperty("table:border-model", "collapsing"); //process the margin information if (!m_currentTable->floating) { tableStyle.addPropertyPt("fo:margin-left", twipsToPt(tap->rgdxaCenter[0])); } //check if we need a master page name attribute. if (document()->writeMasterPageName() && !document()->writingHeader()) { tableStyle.addAttribute("style:master-page-name", document()->masterPageName()); document()->set_writeMasterPageName(false); } QString tableStyleName = m_mainStyles->insert(tableStyle, QLatin1String("Table"), KoGenStyles::AllowDuplicates); //start table in content writer->startElement("table:table"); writer->addAttribute("table:style-name", tableStyleName); // Write the table:table-column descriptions. for (int r = 0; r < table->m_cellEdges.size() - 1; r++) { KoGenStyle tableColumnStyle(KoGenStyle::TableColumnAutoStyle, "table-column"); //in case a header or footer is processed, save the style into styles.xml if (document()->writingHeader()) { tableColumnStyle.setAutoStyleInStylesDotXml(true); } tableColumnStyle.addPropertyPt("style:column-width", (table->m_cellEdges[r+1] - table->m_cellEdges[r]) / 20.0); QString tableColumnStyleName; if (r >= 26) { tableColumnStyleName = m_mainStyles->insert(tableColumnStyle, tableStyleName + ".A" + QChar('A' + r - 26), KoGenStyles::DontAddNumberToName); } else { tableColumnStyleName = m_mainStyles->insert(tableColumnStyle, tableStyleName + '.' + QChar('A' + r), KoGenStyles::DontAddNumberToName); } writer->startElement("table:table-column"); writer->addAttribute("table:style-name", tableColumnStyleName); writer->endElement(); } }
KoFilter::ConversionStatus KoOdfExporter::convert(const QByteArray& from, const QByteArray& to) { // check for proper conversion if (!acceptsSourceMimeType(from)) { kWarning(30003) << "Invalid source mimetype" << from; return KoFilter::NotImplemented; } if (!acceptsDestinationMimeType(to)) { kWarning(30003) << "Invalid destination mimetype" << to; return KoFilter::NotImplemented; } //create output files KoStore *outputStore = KoStore::createStore(m_chain->outputFile(), KoStore::Write, to, KoStore::Zip); if (!outputStore || outputStore->bad()) { kWarning(30003) << "Unable to open output file!"; delete outputStore; return KoFilter::FileNotFound; } outputStore->disallowNameExpansion(); kDebug(30003) << "created outputStore."; KoOdfWriteStore oasisStore(outputStore); kDebug(30003) << "created oasisStore."; // KoGenStyles for writing styles while we're parsing KoGenStyles mainStyles; KoOdfWriters writers; writers.mainStyles = &mainStyles; // create a writer for meta.xml QBuffer buf; buf.open(QIODevice::WriteOnly); KoXmlWriter metaWriter(&buf); writers.meta = &metaWriter; // create a writer for manifest.xml QBuffer manifestBuf; manifestBuf.open(QIODevice::WriteOnly); KoXmlWriter manifestWriter(&manifestBuf); writers.manifest = &manifestWriter; //open contentWriter & bodyWriter *temp* writers //so we can write picture files while we parse QBuffer contentBuf; KoXmlWriter contentWriter(&contentBuf); writers.content = &contentWriter; QBuffer bodyBuf; KoXmlWriter bodyWriter(&bodyBuf); writers.body = &bodyWriter; // open main tags bodyWriter.startElement("office:body"); bodyWriter.startElement(d->bodyContentElement.constData()); RETURN_IF_ERROR( createDocument(outputStore, &writers) ) //save the office:automatic-styles & and fonts in content.xml mainStyles.saveOdfStyles(KoGenStyles::FontFaceDecls, &contentWriter); mainStyles.saveOdfStyles(KoGenStyles::DocumentAutomaticStyles, &contentWriter); //close tags in body bodyWriter.endElement();//office:* bodyWriter.endElement();//office:body //now create real content/body writers & dump the information there KoXmlWriter* realContentWriter = oasisStore.contentWriter(); if (!realContentWriter) { kWarning(30003) << "Error creating the content writer."; delete outputStore; return KoFilter::CreationError; } realContentWriter->addCompleteElement(&contentBuf); KoXmlWriter* realBodyWriter = oasisStore.bodyWriter(); if (!realBodyWriter) { kWarning(30003) << "Error creating the body writer."; delete outputStore; return KoFilter::CreationError; } realBodyWriter->addCompleteElement(&bodyBuf); //now close content & body writers if (!oasisStore.closeContentWriter()) { kWarning(30003) << "Error closing content."; delete outputStore; return KoFilter::CreationError; } kDebug(30003) << "closed content & body writers."; //create the manifest file KoXmlWriter* realManifestWriter = oasisStore.manifestWriter(to); //create the styles.xml file mainStyles.saveOdfStylesDotXml(outputStore, realManifestWriter); realManifestWriter->addManifestEntry("content.xml", "text/xml"); realManifestWriter->addCompleteElement(&manifestBuf); kDebug(30003) << "created manifest and styles.xml"; // create settings.xml, apparently it is used to note calligra that msoffice files should // have different behavior with some things if (!outputStore->open("settings.xml")) { delete outputStore; return KoFilter::CreationError; } KoStoreDevice settingsDev(outputStore); KoXmlWriter* settings = KoOdfWriteStore::createOasisXmlWriter(&settingsDev, "office:document-settings"); settings->startElement("office:settings"); settings->startElement("config:config-item-set"); settings->addAttribute("config:name", "ooo:configuration-settings"); writeConfigurationSettings(settings); settings->endElement(); // config:config-item-set settings->endElement(); // office:settings settings->endElement(); // office:document-settings settings->endDocument(); delete settings; realManifestWriter->addManifestEntry("settings.xml", "text/xml"); if (!outputStore->close()) { delete outputStore; return KoFilter::CreationError; } //create meta.xml if (!outputStore->open("meta.xml")) { delete outputStore; return KoFilter::CreationError; } KoStoreDevice metaDev(outputStore); KoXmlWriter* meta = KoOdfWriteStore::createOasisXmlWriter(&metaDev, "office:document-meta"); meta->startElement("office:meta"); meta->addCompleteElement(&buf); meta->endElement(); //office:meta meta->endElement(); //office:document-meta meta->endDocument(); delete meta; if (!outputStore->close()) { delete outputStore; return KoFilter::CreationError; } realManifestWriter->addManifestEntry("meta.xml", "text/xml"); oasisStore.closeManifestWriter(); delete outputStore; return KoFilter::OK; }