File indexing completed on 2024-12-08 12:56:11

0001 /* This file is part of the KDE project
0002  *
0003  * Copyright (C) 2013 Inge Wallin <inge@lysator.liu.se>
0004  *
0005  * This library is free software; you can redistribute it and/or
0006  * modify it under the terms of the GNU Library General Public
0007  * License as published by the Free Software Foundation; either
0008  * version 2 of the License, or (at your option) any later version.
0009  *
0010  * This library is distributed in the hope that it will be useful,
0011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0013  * Library General Public License for more details.
0014  *
0015  * You should have received a copy of the GNU Library General Public License
0016  * along with this library; see the file COPYING.LIB.  If not, write to
0017  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0018  * Boston, MA 02110-1301, USA.
0019  */
0020 
0021 
0022 // Own
0023 #include "KoOdfStyle.h"
0024 
0025 // Qt
0026 #include <QString>
0027 
0028 // Odflib
0029 #include "KoXmlStreamReader.h"
0030 #include "KoXmlWriter.h"
0031 #include "KoOdfStyleProperties.h"
0032 #include "KoOdfTextProperties.h"
0033 #include "KoOdfParagraphProperties.h"
0034 #include "KoOdfGraphicProperties.h"
0035 
0036 #include "Odf2Debug.h"
0037 
0038 // ================================================================
0039 //                         class KoOdfStyle
0040 
0041 
0042 class Q_DECL_HIDDEN KoOdfStyle::Private
0043 {
0044 public:
0045     Private();
0046     ~Private();
0047 
0048     QString family;
0049     QString parent;
0050 
0051     QHash<QString, KoOdfStyleProperties*> properties;  // e.g. "text-properties",
0052 };
0053 
0054 KoOdfStyle::Private::Private()
0055 {
0056 }
0057 
0058 KoOdfStyle::Private::~Private()
0059 {
0060     qDeleteAll(properties);
0061 }
0062 
0063 
0064 // ----------------------------------------------------------------
0065 
0066 
0067 KoOdfStyle::KoOdfStyle()
0068     : KoOdfStyleBase(StyleStyle)
0069     , d(new KoOdfStyle::Private())
0070 {
0071 }
0072 
0073 KoOdfStyle::~KoOdfStyle()
0074 {
0075     delete d;
0076 }
0077 
0078 
0079 QString KoOdfStyle::family() const
0080 {
0081     return d->family;
0082 }
0083 
0084 void KoOdfStyle::setFamily(const QString &family)
0085 {
0086     d->family = family;
0087 }
0088 
0089 QString KoOdfStyle::parent() const
0090 {
0091     return d->parent;
0092 }
0093 
0094 void KoOdfStyle::setParent(const QString &parent)
0095 {
0096     d->parent = parent;
0097 }
0098 
0099 
0100 QHash<QString, KoOdfStyleProperties*> KoOdfStyle::properties() const
0101 {
0102     return d->properties;
0103 }
0104 
0105 KoOdfStyleProperties *KoOdfStyle::properties(const QString& name) const
0106 {
0107     return d->properties.value(name, 0);
0108 }
0109 
0110 QString KoOdfStyle::property(const QString &propertySet, const QString &property) const
0111 {
0112     KoOdfStyleProperties *props = d->properties.value(propertySet, 0);
0113     if (props)
0114         return props->attribute(property);
0115     else
0116         return QString();
0117 }
0118 
0119 void KoOdfStyle::setProperty(const QString &propertySet, const QString &property, const QString &value)
0120 {
0121     KoOdfStyleProperties *props = d->properties.value(propertySet);
0122     if (!props)
0123         props = new KoOdfStyleProperties();
0124     props->setAttribute(property, value);
0125 }
0126 
0127 
0128 bool KoOdfStyle::readOdf(KoXmlStreamReader &reader)
0129 {
0130     // Load style attributes.
0131     KoXmlStreamAttributes  attrs = reader.attributes();
0132 
0133     setName(attrs.value("style:name").toString());
0134     setDisplayName(attrs.value("style:display-name").toString());
0135     setFamily(attrs.value("style:family").toString());
0136     setParent(attrs.value("style:parent-style-name").toString());
0137 
0138     debugOdf2 << "Style:" << name() << family() << parent() << displayName();
0139 
0140     // Load child elements: property sets and other children.
0141     while (reader.readNextStartElement()) {
0142 
0143         // So far we only have support for text-, paragraph- and graphic-properties
0144         const QString propertiesType = reader.qualifiedName().toString();
0145         // Create a new propertyset variable depending on the type of properties.
0146         KoOdfStyleProperties *properties = 0;
0147         if (propertiesType == "style:text-properties") {
0148             properties = new KoOdfTextProperties();
0149         } else if (propertiesType == "style:paragraph-properties") {
0150             properties = new KoOdfParagraphProperties();
0151         } else if (propertiesType == "style:graphic-properties") {
0152             properties = new KoOdfGraphicProperties();
0153         }
0154 
0155         if (properties) {
0156             if (!properties->readOdf(reader)) {
0157                 delete properties;
0158                 return false;
0159             }
0160             d->properties[propertiesType] = properties;
0161         }
0162     }
0163 
0164     return true;
0165 }
0166 
0167 bool KoOdfStyle::saveOdf(KoXmlWriter *writer)
0168 {
0169     if (isDefaultStyle()) {
0170         writer->startElement("style:default-style");
0171     }
0172     else {
0173         writer->startElement("style:style");
0174         writer->addAttribute("style:name", name());
0175     }
0176 
0177     // Write style attributes
0178     writer->addAttribute("style:family", family());
0179     if (!d->parent.isEmpty()) {
0180         writer->addAttribute("style:parent-style-name", d->parent);
0181     }
0182     if (!displayName().isEmpty()) {
0183         writer->addAttribute("style:display-name", displayName());
0184     }
0185 
0186     // Write properties
0187     foreach(const QString &propertySet, d->properties.keys()) {
0188         d->properties.value(propertySet)->saveOdf(propertySet, writer);
0189     }
0190 
0191     writer->endElement();  // style:{default-,}style
0192     return true;
0193 }