30
30
class KoOdfLoadingContext::Private
33
Private(KoOdfStylesReader &sr, KoStore *s)
36
generatorType(KoOdfLoadingContext::Unknown),
38
useStylesAutoStyles(false)
43
KoOdfStylesReader &stylesReader;
44
KoStyleStack styleStack;
46
mutable QString generator;
47
GeneratorType generatorType;
48
mutable bool metaXmlParsed;
49
bool useStylesAutoStyles;
51
KoXmlDocument manifestDoc;
53
KoOdfStylesReader defaultStylesReader;
54
KoXmlDocument doc; // the doc needs to be kept around so it is possible to access the styles
34
KoOdfLoadingContext::KoOdfLoadingContext(KoOdfStylesReader& stylesReader, KoStore* store, const KComponentData & componentData)
36
, m_stylesReader(stylesReader)
37
, m_metaXmlParsed(false)
38
, m_useStylesAutoStyles(false)
57
KoOdfLoadingContext::KoOdfLoadingContext(KoOdfStylesReader &stylesReader, KoStore* store, const KComponentData &componentData)
58
: d(new Private(stylesReader, store))
41
60
// Ideally this should be done by KoDocument and passed as argument here...
42
61
KoOdfReadStore oasisStore(store);
44
(void)oasisStore.loadAndParse("tar:/META-INF/manifest.xml", m_manifestDoc, dummy);
63
(void)oasisStore.loadAndParse("tar:/META-INF/manifest.xml", d->manifestDoc, dummy);
46
65
if (componentData.isValid()) {
47
66
QString fileName( KStandardDirs::locate( "styles", "defaultstyles.xml", componentData ) );
48
67
if ( ! fileName.isEmpty() ) {
49
68
QFile file( fileName );
50
69
QString errorMessage;
51
if ( KoOdfReadStore::loadAndParse( &file, m_doc, errorMessage, fileName ) ) {
52
m_defaultStylesReader.createStyleMap( m_doc, true );
70
if ( KoOdfReadStore::loadAndParse( &file, d->doc, errorMessage, fileName ) ) {
71
d->defaultStylesReader.createStyleMap( d->doc, true );
55
74
kWarning(30010) << "reading of defaultstyles.xml failed:" << errorMessage;
77
96
// find all styles associated with an object and push them on the stack
78
97
if (object.hasAttributeNS(nsURI, attrName)) {
79
98
const QString styleName = object.attributeNS(nsURI, attrName, QString());
80
const KoXmlElement * style = m_stylesReader.findStyle(styleName, family, m_useStylesAutoStyles);
99
const KoXmlElement * style = d->stylesReader.findStyle(styleName, family, d->useStylesAutoStyles);
83
addStyles(style, family, m_useStylesAutoStyles);
102
addStyles(style, family, d->useStylesAutoStyles);
85
kWarning(32500) << "style" << styleName << "not found in" << (m_useStylesAutoStyles ? "styles.xml" : "content.xml");
104
kWarning(32500) << "style" << styleName << "not found in" << (d->useStylesAutoStyles ? "styles.xml" : "content.xml");
102
121
kWarning(32500) << "Parent style not found: " << family << parentStyleName << usingStylesAutoStyles;
103
122
//we are handling a non compliant odf file. let's at the very least load the application default, and the eventual odf default
105
const KoXmlElement* def = m_stylesReader.defaultStyle(family);
124
const KoXmlElement* def = d->stylesReader.defaultStyle(family);
106
125
if (def) { // then, the default style for this family
107
m_styleStack.push(*def);
126
d->styleStack.push(*def);
111
130
} else if (family) {
112
const KoXmlElement* def = m_stylesReader.defaultStyle(family);
131
const KoXmlElement* def = d->stylesReader.defaultStyle(family);
113
132
if (def) { // then, the default style for this family
114
m_styleStack.push(*def);
133
d->styleStack.push(*def);
118
137
//kDebug(32500) <<"pushing style" << style->attributeNS( KoXmlNS::style,"name", QString() );
119
m_styleStack.push(*style);
138
d->styleStack.push(*style);
141
void KoOdfLoadingContext::parseGenerator() const
143
// Regardless of whether we cd into the parent directory
144
// or not to find a meta.xml, restore the directory that
145
// we were in afterwards.
146
d->store->pushDirectory();
148
// Some embedded documents to not contain their own meta.xml
149
// Use the parent directory's instead.
150
if (!d->store->hasFile("meta.xml"))
151
// Only has an effect if there is a parent directory
152
d->store->leaveDirectory();
154
if (d->store->hasFile("meta.xml")) {
155
KoXmlDocument metaDoc;
156
KoOdfReadStore oasisStore(d->store);
158
if (oasisStore.loadAndParse("meta.xml", metaDoc, errorMsg)) {
159
KoXmlNode meta = KoXml::namedItemNS(metaDoc, KoXmlNS::office, "document-meta");
160
KoXmlNode office = KoXml::namedItemNS(meta, KoXmlNS::office, "meta");
161
KoXmlElement generator = KoXml::namedItemNS(office, KoXmlNS::meta, "generator");
162
if (!generator.isNull()) {
163
d->generator = generator.text();
164
if (d->generator.startsWith("KOffice")) {
165
d->generatorType = KOffice;
166
} else if (d->generator.startsWith("OpenOffice.org")) {
167
d->generatorType = OpenOffice;
168
} else if (d->generator.startsWith("MicrosoftOffice")) {
169
d->generatorType = MicrosoftOffice;
174
d->metaXmlParsed = true;
176
d->store->popDirectory();
122
179
QString KoOdfLoadingContext::generator() const
128
void KoOdfLoadingContext::parseMeta() const
130
if (!m_metaXmlParsed && m_store) {
131
// Regardless of whether we cd into the parent directory
132
// or not to find a meta.xml, restore the directory that
133
// we were in afterwards.
134
m_store->pushDirectory();
136
// Some embedded documents to not contain their own meta.xml
137
// Use the parent directory's instead.
138
if (!m_store->hasFile("meta.xml"))
139
// Only has an effect if there is a parent directory
140
m_store->leaveDirectory();
142
if (m_store->hasFile("meta.xml")) {
143
KoXmlDocument metaDoc;
144
KoOdfReadStore oasisStore(m_store);
146
if (oasisStore.loadAndParse("meta.xml", metaDoc, errorMsg)) {
147
KoXmlNode meta = KoXml::namedItemNS(metaDoc, KoXmlNS::office, "document-meta");
148
KoXmlNode office = KoXml::namedItemNS(meta, KoXmlNS::office, "meta");
149
KoXmlElement generator = KoXml::namedItemNS(office, KoXmlNS::meta, "generator");
150
if (!generator.isNull())
151
m_generator = generator.text();
154
m_metaXmlParsed = true;
156
m_store->popDirectory();
181
if (!d->metaXmlParsed && d->store) {
187
KoOdfLoadingContext::GeneratorType KoOdfLoadingContext::generatorType() const
189
if (!d->metaXmlParsed && d->store) {
192
return d->generatorType;
195
KoStore *KoOdfLoadingContext::store() const
200
KoOdfStylesReader &KoOdfLoadingContext::stylesReader()
202
return d->stylesReader;
206
* Get the application default styles styleReader
208
KoOdfStylesReader &KoOdfLoadingContext::defaultStylesReader()
210
return d->defaultStylesReader;
213
KoStyleStack &KoOdfLoadingContext::styleStack() const
215
return d->styleStack;
218
const KoXmlDocument &KoOdfLoadingContext::manifestDocument() const
220
return d->manifestDoc;
223
void KoOdfLoadingContext::setUseStylesAutoStyles(bool useStylesAutoStyles)
225
d->useStylesAutoStyles = useStylesAutoStyles;
228
bool KoOdfLoadingContext::useStylesAutoStyles() const
230
return d->useStylesAutoStyles;