void KoGenStyle::writeStyle(KoXmlWriter* writer, const KoGenStyles& styles, const char* elementName, const QString& name, const char* propertiesElementName, bool closeElement, bool drawElement) const { //kDebug(30003) <<"writing out style" << name <<" display-name=" << m_attributes["style:display-name"] <<" family=" << m_familyName; writer->startElement(elementName); const KoGenStyle* parentStyle = 0; if (!m_defaultStyle) { if (!drawElement) writer->addAttribute("style:name", name); else writer->addAttribute("draw:name", name); if (!m_parentName.isEmpty()) { parentStyle = styles.style(m_parentName); if (parentStyle && m_familyName.isEmpty()) { // get family from parent style, just in case // Note: this is saving code, don't convert to attributeNS! const_cast<KoGenStyle *>(this)-> m_familyName = parentStyle->attribute("style:family").toLatin1(); //kDebug(30003) <<"Got familyname" << m_familyName <<" from parent"; } if (parentStyle && !parentStyle->isDefaultStyle()) writer->addAttribute("style:parent-style-name", m_parentName); } } else { // default-style Q_ASSERT(qstrcmp(elementName, "style:default-style") == 0); Q_ASSERT(m_parentName.isEmpty()); } if (!m_familyName.isEmpty()) const_cast<KoGenStyle *>(this)-> addAttribute("style:family", QString::fromLatin1(m_familyName)); else { if (qstrcmp(elementName, "style:style") == 0) kWarning(30003) << "User style " << name << " is without family - invalid. m_type=" << m_type; } #if 0 // #ifndef NDEBUG kDebug(30003) << "style:" << name; printDebug(); if (parentStyle) { kDebug(30003) << " parent:" << m_parentName; parentStyle->printDebug(); } #endif // Write attributes [which differ from the parent style] // We only look at the direct parent style because we assume // that styles are fully specified, i.e. the inheritance is // only in the final file, not in the caller's code. QMap<QString, QString>::const_iterator it = m_attributes.constBegin(); for (; it != m_attributes.constEnd(); ++it) { bool writeit = true; if (parentStyle && it.key() != "style:family" // always write the family out && parentStyle->attribute(it.key()) == it.value()) writeit = false; if (writeit) writer->addAttribute(it.key().toUtf8(), it.value().toUtf8()); } bool createPropertiesTag = propertiesElementName && propertiesElementName[0] != '\0'; KoGenStyle::PropertyType i = KoGenStyle::DefaultType; KoGenStyle::PropertyType defaultPropertyType = KoGenStyle::DefaultType; if (createPropertiesTag) defaultPropertyType = propertyTypeByElementName(propertiesElementName); if (!m_properties[i].isEmpty() || !m_properties[KoGenStyle::ChildElement].isEmpty() || !m_properties[defaultPropertyType].isEmpty()) { if (createPropertiesTag) writer->startElement(propertiesElementName); // e.g. paragraph-properties it = m_properties[i].constBegin(); for (; it != m_properties[i].constEnd(); ++it) { if (!parentStyle || parentStyle->property(it.key(), i) != it.value()) writer->addAttribute(it.key().toUtf8(), it.value().toUtf8()); } //write the explicitly-defined properties that are the same type as the default, //but only if defaultPropertyType is Text, Paragraph, or GraphicType if (defaultPropertyType != 0) { it = m_properties[defaultPropertyType].constBegin(); for (; it != m_properties[defaultPropertyType].constEnd(); ++it) { if (!parentStyle || parentStyle->property(it .key(), defaultPropertyType) != it.value()) writer->addAttribute(it.key().toUtf8(), it.value().toUtf8()); } } //write child elements of the properties elements i = KoGenStyle::ChildElement; it = m_properties[i].constBegin(); for (; it != m_properties[i].constEnd(); ++it) { if (!parentStyle || parentStyle->property(it.key(), i) != it.value()) { writer->addCompleteElement(it.value().toUtf8()); } } if (createPropertiesTag) writer->endElement(); } // now write out any other properties elements //start with i=1 to skip the defaultType that we already took care of for (int i = 1; i < s_propertyNamesCount; ++i) { //skip any properties that are the same as the defaultType if (s_propertyTypes[i] != defaultPropertyType) { writeStyleProperties(writer, s_propertyTypes[i], parentStyle); } } //write child elements that aren't in any of the properties elements i = KoGenStyle::StyleChildElement; it = m_properties[i].constBegin(); for (; it != m_properties[i].constEnd(); ++it) { if (!parentStyle || parentStyle->property(it.key(), i) != it.value()) { writer->addCompleteElement(it.value().toUtf8()); } } // And now the style maps for (int i = 0; i < m_maps.count(); ++i) { bool writeit = true; if (parentStyle && compareMap(m_maps[i], parentStyle->m_maps[i]) == 0) writeit = false; if (writeit) { writer->startElement("style:map"); QMap<QString, QString>::const_iterator it = m_maps[i].constBegin(); for (; it != m_maps[i].constEnd(); ++it) { writer->addAttribute(it.key().toUtf8(), it.value().toUtf8()); } writer->endElement(); // style:map } } if (closeElement) writer->endElement(); }