summaryrefslogtreecommitdiffstats
path: root/writerperfect/source/common/TextRunStyle.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerperfect/source/common/TextRunStyle.cxx')
-rw-r--r--writerperfect/source/common/TextRunStyle.cxx279
1 files changed, 279 insertions, 0 deletions
diff --git a/writerperfect/source/common/TextRunStyle.cxx b/writerperfect/source/common/TextRunStyle.cxx
new file mode 100644
index 000000000000..8bb34efc5518
--- /dev/null
+++ b/writerperfect/source/common/TextRunStyle.cxx
@@ -0,0 +1,279 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* TextRunStyle: Stores (and writes) paragraph/span-style-based information
+ * (e.g.: a paragraph might be bold) that is needed at the head of an OO
+ * document.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * For further information visit http://libwpd.sourceforge.net
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+#include "FilterInternal.hxx"
+#include "TextRunStyle.hxx"
+#include "DocumentElement.hxx"
+
+#ifdef _MSC_VER
+#include <minmax.h>
+#endif
+
+#include <string.h>
+
+ParagraphStyle::ParagraphStyle(const WPXPropertyList &pPropList, const WPXPropertyListVector &xTabStops, const WPXString &sName) :
+ mpPropList(pPropList),
+ mxTabStops(xTabStops),
+ msName(sName)
+{
+}
+
+ParagraphStyle::~ParagraphStyle()
+{
+}
+
+void ParagraphStyle::write(OdfDocumentHandler *pHandler) const
+{
+ WRITER_DEBUG_MSG(("Writing a paragraph style..\n"));
+
+ WPXPropertyList propList;
+ propList.insert("style:name", msName.cstr());
+ propList.insert("style:family", "paragraph");
+ if (mpPropList["style:parent-style-name"])
+ propList.insert("style:parent-style-name", mpPropList["style:parent-style-name"]->getStr());
+ if (mpPropList["style:master-page-name"])
+ propList.insert("style:master-page-name", mpPropList["style:master-page-name"]->getStr());
+ pHandler->startElement("style:style", propList);
+
+ propList.clear();
+ WPXPropertyList::Iter i(mpPropList);
+ for (i.rewind(); i.next(); )
+ {
+ if (strncmp(i.key(), "fo:margin-",10) == 0)
+ {
+ if (strcmp(i.key(), "fo:margin-left") == 0 ||
+ strcmp(i.key(), "fo:margin-right") == 0 ||
+ strcmp(i.key(), "fo:margin-top") == 0)
+ propList.insert(i.key(), i()->getStr());
+ else if (strcmp(i.key(), "fo:margin-bottom") == 0)
+ {
+ if (i()->getDouble() > 0.0)
+ propList.insert("fo:margin-bottom", i()->getStr());
+ else
+ propList.insert("fo:margin-bottom", 0.0);
+ }
+ }
+ else if (strcmp(i.key(), "fo:text-indent") == 0)
+ propList.insert("fo:text-indent", i()->getStr());
+ else if (strcmp(i.key(), "fo:line-height") == 0)
+ propList.insert("fo:line-height", i()->getStr());
+ else if (strcmp(i.key(), "style:line-height-at-least") == 0)
+ propList.insert("style:line-height-at-least", i()->getStr());
+ else if (strcmp(i.key(), "fo:break-before") == 0)
+ propList.insert("fo:break-before", i()->getStr());
+ else if (strcmp(i.key(), "fo:text-align") == 0)
+ propList.insert("fo:text-align", i()->getStr());
+ else if (strcmp(i.key(), "fo:text-align-last") == 0)
+ propList.insert("fo:text-align-last", i()->getStr());
+ else if (strcmp(i.key(), "style:page-number") == 0)
+ propList.insert("style:page-number", i()->getStr());
+ else if (strcmp(i.key(), "fo:background-color") == 0)
+ propList.insert("fo:background-color", i()->getStr());
+ else if (strncmp(i.key(), "fo:border", 9) == 0)
+ {
+ if (strcmp(i.key(), "fo:border") == 0 ||
+ strcmp(i.key(), "fo:border-left") == 0 ||
+ strcmp(i.key(), "fo:border-right") == 0 ||
+ strcmp(i.key(), "fo:border-top") == 0 ||
+ strcmp(i.key(), "fo:border-bottom") == 0)
+ propList.insert(i.key(), i()->getStr());
+ }
+ else if (strcmp(i.key(), "fo:keep-together") == 0)
+ propList.insert("fo:keep-together", i()->getStr());
+ else if (strcmp(i.key(), "fo:keep-with-next") == 0)
+ propList.insert("fo:keep-with-next", i()->getStr());
+ }
+
+ propList.insert("style:justify-single-word", "false");
+ pHandler->startElement("style:paragraph-properties", propList);
+
+ if (mxTabStops.count() > 0)
+ {
+ TagOpenElement tabListOpen("style:tab-stops");
+ tabListOpen.write(pHandler);
+ WPXPropertyListVector::Iter k(mxTabStops);
+ for (k.rewind(); k.next();)
+ {
+ if (k()["style:position"] && k()["style:position"]->getDouble() < 0.0)
+ continue;
+ TagOpenElement tabStopOpen("style:tab-stop");
+
+ WPXPropertyList::Iter j(k());
+ for (j.rewind(); j.next(); )
+ {
+ tabStopOpen.addAttribute(j.key(), j()->getStr().cstr());
+ }
+ tabStopOpen.write(pHandler);
+ pHandler->endElement("style:tab-stop");
+ }
+ pHandler->endElement("style:tab-stops");
+ }
+
+ pHandler->endElement("style:paragraph-properties");
+ pHandler->endElement("style:style");
+}
+
+SpanStyle::SpanStyle(const char *psName, const WPXPropertyList &xPropList) :
+ Style(psName),
+ mPropList(xPropList)
+{
+}
+
+void SpanStyle::write(OdfDocumentHandler *pHandler) const
+{
+ WRITER_DEBUG_MSG(("Writing a span style..\n"));
+ WPXPropertyList styleOpenList;
+ styleOpenList.insert("style:name", getName());
+ styleOpenList.insert("style:family", "text");
+ pHandler->startElement("style:style", styleOpenList);
+
+ WPXPropertyList propList(mPropList);
+
+ if (mPropList["style:font-name"])
+ {
+ propList.insert("style:font-name-asian", mPropList["style:font-name"]->getStr());
+ propList.insert("style:font-name-complex", mPropList["style:font-name"]->getStr());
+ }
+
+ if (mPropList["fo:font-size"])
+ {
+ if (mPropList["fo:font-size"]->getDouble() > 0.0)
+ {
+ propList.insert("style:font-size-asian", mPropList["fo:font-size"]->getStr());
+ propList.insert("style:font-size-complex", mPropList["fo:font-size"]->getStr());
+ }
+ else
+ propList.remove("fo:font-size");
+ }
+
+ if (mPropList["fo:font-weight"])
+ {
+ propList.insert("style:font-weight-asian", mPropList["fo:font-weight"]->getStr());
+ propList.insert("style:font-weight-complex", mPropList["fo:font-weight"]->getStr());
+ }
+
+ if (mPropList["fo:font-style"])
+ {
+ propList.insert("style:font-style-asian", mPropList["fo:font-style"]->getStr());
+ propList.insert("style:font-style-complex", mPropList["fo:font-style"]->getStr());
+ }
+
+ pHandler->startElement("style:text-properties", propList);
+
+ pHandler->endElement("style:text-properties");
+ pHandler->endElement("style:style");
+}
+
+void ParagraphStyleManager::clean()
+{
+ mNameHash.clear();
+ mStyleHash.clear();
+}
+
+void ParagraphStyleManager::write(OdfDocumentHandler *pHandler) const
+{
+ for (std::map<WPXString, shared_ptr<ParagraphStyle>, ltstr>::const_iterator iter = mStyleHash.begin();
+ iter != mStyleHash.end(); ++iter)
+ {
+ if (strcmp(iter->second->getName().cstr(), "Standard") == 0)
+ continue;
+ (iter->second)->write(pHandler);
+ }
+}
+
+WPXString ParagraphStyleManager::getKey(const WPXPropertyList &xPropList, const WPXPropertyListVector &tabStops) const
+{
+ WPXString sKey = propListToStyleKey(xPropList);
+
+ WPXString sTabStops;
+ sTabStops.sprintf("[num-tab-stops:%i]", tabStops.count());
+ WPXPropertyListVector::Iter i(tabStops);
+ for (i.rewind(); i.next();)
+ {
+ sTabStops.append(propListToStyleKey(i()));
+ }
+ sKey.append(sTabStops);
+
+ return sKey;
+}
+
+WPXString ParagraphStyleManager::findOrAdd(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops)
+{
+ WPXString hashKey = getKey(propList, tabStops);
+ std::map<WPXString, WPXString, ltstr>::const_iterator iter =
+ mNameHash.find(hashKey);
+ if (iter!=mNameHash.end()) return iter->second;
+
+ // ok create a new list
+ WRITER_DEBUG_MSG(("ParagraphStyleManager::findOrAdd: Paragraph Hash Key: %s\n", hashKey.cstr()));
+
+ WPXString sName;
+ sName.sprintf("S%i", mStyleHash.size());
+ shared_ptr<ParagraphStyle> parag(new ParagraphStyle(propList, tabStops, sName));
+ mStyleHash[sName] =parag;
+ mNameHash[hashKey] = sName;
+ return sName;
+}
+
+shared_ptr<ParagraphStyle> const ParagraphStyleManager::get(const WPXString &name) const
+{
+ std::map<WPXString, shared_ptr<ParagraphStyle>, ltstr>::const_iterator iter
+ = mStyleHash.find(name);
+ if (iter == mStyleHash.end()) return shared_ptr<ParagraphStyle>();
+ return iter->second;
+}
+
+void SpanStyleManager::clean()
+{
+ mNameHash.clear();
+ mStyleHash.clear();
+}
+
+void SpanStyleManager::write(OdfDocumentHandler *pHandler) const
+{
+ for (std::map<WPXString, shared_ptr<SpanStyle>, ltstr>::const_iterator iter = mStyleHash.begin();
+ iter != mStyleHash.end(); ++iter)
+ {
+ (iter->second)->write(pHandler);
+ }
+}
+
+WPXString SpanStyleManager::findOrAdd(const WPXPropertyList &propList)
+{
+ WPXString hashKey = propListToStyleKey(propList);
+ std::map<WPXString, WPXString, ltstr>::const_iterator iter =
+ mNameHash.find(hashKey);
+ if (iter!=mNameHash.end()) return iter->second;
+
+ // ok create a new list
+ WRITER_DEBUG_MSG(("SpanStyleManager::findOrAdd: Span Hash Key: %s\n", hashKey.cstr()));
+
+ WPXString sName;
+ sName.sprintf("Span%i", mStyleHash.size());
+ shared_ptr<SpanStyle> span(new SpanStyle(sName.cstr(), propList));
+ mStyleHash[sName] = span;
+ mNameHash[hashKey] = sName;
+ return sName;
+}
+
+shared_ptr<SpanStyle> const SpanStyleManager::get(const WPXString &name) const
+{
+ std::map<WPXString, shared_ptr<SpanStyle>, ltstr>::const_iterator iter
+ = mStyleHash.find(name);
+ if (iter == mStyleHash.end()) return shared_ptr<SpanStyle>();
+ return iter->second;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */