[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [Calligra] cab86cf: Make field support use actual C++ syntax, thereby
From: Shaheed <srhaque () theiet ! org>
Date: 2011-01-13 19:29:19
Message-ID: 20110113192919.F14D3A609B () git ! kde ! org
[Download RAW message or body]
commit cab86cf08c7ed07a5164c2243e3dd06073c82fc7
branch master
Author: Shaheed <srhaque@theiet.org>
Date: Thu Jan 13 19:18:49 2011 +0000
Make field support use actual C++ syntax, thereby reducing LOC. The
code readability is improved, and the state save/restore pattern
seen a bit more clearly, but even more clarity could be achieved
if the URL storage was not being (ab)used as it is.
diff --git a/filters/words/msword-odf/texthandler.cpp \
b/filters/words/msword-odf/texthandler.cpp index f747f56..01b1d02 100644
--- a/filters/words/msword-odf/texthandler.cpp
+++ b/filters/words/msword-odf/texthandler.cpp
@@ -84,12 +84,7 @@ KWordTextHandler::KWordTextHandler(wvWare::SharedPtr<wvWare::Parser> \
parser, KoX , m_listLevelStyleRequired(false)
, m_currentListDepth(-1)
, m_currentListID(0)
- , m_fieldType(UNSUPPORTED)
- , m_insideField(false)
- , m_fieldAfterSeparator(false)
- , m_hyperLinkActive(false)
- , m_fldWriter(0)
- , m_fldBuffer(0)
+ , m_fld(new fld_State())
, m_fldStart(0)
, m_fldEnd(0)
{
@@ -425,15 +420,15 @@ void KWordTextHandler::bookmarkStart( const \
wvWare::BookmarkData& data ) KoXmlWriter* writer;
QBuffer buf;
- if (!m_insideField) {
+ if (!m_fld->m_insideField) {
buf.open(QIODevice::WriteOnly);
writer = new KoXmlWriter(&buf);
} else {
- if (!m_fieldAfterSeparator) {
+ if (!m_fld->m_afterSeparator) {
kWarning(30513) << "bookmark interfers with field instructions, \
omitting"; return;
} else {
- writer = m_fldWriter;
+ writer = m_fld->m_writer;
}
}
//get the name of the bookmark
@@ -454,7 +449,7 @@ void KWordTextHandler::bookmarkStart( const wvWare::BookmarkData& \
data ) writer->endElement();
}
- if (!m_insideField) {
+ if (!m_fld->m_insideField) {
QString content = QString::fromUtf8(buf.buffer(), buf.buffer().size());
m_paragraph->addRunOfText(content, 0, QString(""), m_parser->styleSheet(), \
1); delete writer;
@@ -466,15 +461,15 @@ void KWordTextHandler::bookmarkEnd( const wvWare::BookmarkData& \
data ) KoXmlWriter* writer;
QBuffer buf;
- if (!m_insideField) {
+ if (!m_fld->m_insideField) {
buf.open(QIODevice::WriteOnly);
writer = new KoXmlWriter(&buf);
} else {
- if (!m_fieldAfterSeparator) {
+ if (!m_fld->m_afterSeparator) {
kWarning(30513) << "bookmark interfers with field instructions, \
omitting"; return;
} else {
- writer = m_fldWriter;
+ writer = m_fld->m_writer;
}
}
@@ -491,7 +486,7 @@ void KWordTextHandler::bookmarkEnd( const wvWare::BookmarkData& \
data ) writer->endElement();
}
- if (!m_insideField) {
+ if (!m_fld->m_insideField) {
QString content = QString::fromUtf8(buf.buffer(), buf.buffer().size());
m_paragraph->addRunOfText(content, 0, QString(""), m_parser->styleSheet(), \
1); delete writer;
@@ -632,7 +627,7 @@ void KWordTextHandler::inlineObjectFound(const \
wvWare::PictureData& data) Q_ASSERT(m_paragraph);
//ignore if field instructions are processed
- if (m_insideField && !m_fieldAfterSeparator) {
+ if (m_fld->m_insideField && !m_fld->m_afterSeparator) {
kWarning(30513) << "Warning: Object located in field instractions, \
Ignoring!"; return;
}
@@ -646,18 +641,18 @@ void KWordTextHandler::inlineObjectFound(const \
wvWare::PictureData& data) KoXmlWriter* writer = m_drawingWriter;
//frame or drawing shape acting as a hyperlink
- if (m_hyperLinkActive) {
+ if (m_fld->m_hyperLinkActive) {
writer->startElement("draw:a");
writer->addAttribute("xlink:type", "simple");
- writer->addAttribute("xlink:href", QUrl(m_hyperLinkUrl).toEncoded());
+ writer->addAttribute("xlink:href", QUrl(m_fld->m_hyperLinkUrl).toEncoded());
}
//signal that we have a picture, provide the bodyWriter to GraphicsHandler
emit inlineObjectFound(data, m_drawingWriter);
- if (m_hyperLinkActive) {
+ if (m_fld->m_hyperLinkActive) {
writer->endElement();
- m_hyperLinkActive = false;
+ m_fld->m_hyperLinkActive = false;
}
//now add content to our current paragraph
@@ -678,7 +673,7 @@ void KWordTextHandler::floatingObjectFound(unsigned int globalCP)
Q_ASSERT(m_paragraph);
//ignore if field instructions are processed
- if (m_insideField && !m_fieldAfterSeparator) {
+ if (m_fld->m_insideField && !m_fld->m_afterSeparator) {
kWarning(30513) << "Warning: Object located in field instractions, \
Ignoring!"; return;
}
@@ -692,19 +687,19 @@ void KWordTextHandler::floatingObjectFound(unsigned int \
globalCP) KoXmlWriter* writer = m_drawingWriter;
//frame or drawing shape acting as a hyperlink
- if (m_hyperLinkActive) {
+ if (m_fld->m_hyperLinkActive) {
writer->startElement("draw:a");
writer->addAttribute("xlink:type", "simple");
- writer->addAttribute("xlink:href", QUrl(m_hyperLinkUrl).toEncoded());
+ writer->addAttribute("xlink:href", QUrl(m_fld->m_hyperLinkUrl).toEncoded());
}
saveState();
emit floatingObjectFound(globalCP, m_drawingWriter);
restoreState();
- if (m_hyperLinkActive) {
+ if (m_fld->m_hyperLinkActive) {
writer->endElement();
- m_hyperLinkActive = false;
+ m_fld->m_hyperLinkActive = false;
}
//now add content to our current paragraph
@@ -969,20 +964,17 @@ void KWordTextHandler::fieldStart(const wvWare::FLD* fld, \
wvWare::SharedPtr<cons
kDebug(30513) << "fld->flt:" << fld->flt << "(" << hex << fld->flt << ")";
//nested field
- if (m_insideField) {
+ if (m_fld->m_insideField) {
fld_saveState();
+ } else {
+ delete m_fld;
}
- m_fieldType = fld->flt;
- m_insideField = true;
- m_fieldAfterSeparator = false;
-
- m_fldBuffer = new QBuffer();
- m_fldBuffer->open(QIODevice::WriteOnly);
- m_fldWriter = new KoXmlWriter(m_fldBuffer);
+ m_fld = new fld_State((fldType)fld->flt);
+ m_fld->m_insideField = true;
//check to see if we can process this field type or not
- switch (m_fieldType) {
+ switch (m_fld->m_type) {
case AUTHOR:
break;
case EQ:
@@ -1005,7 +997,7 @@ void KWordTextHandler::fieldStart(const wvWare::FLD* fld, \
wvWare::SharedPtr<cons break;
case REF:
kWarning(30513) << "Warning: unsupported field (REF)";
- m_fieldType = UNSUPPORTED;
+ m_fld->m_type = UNSUPPORTED;
break;
case SUBJECT:
case TITLE:
@@ -1024,8 +1016,8 @@ void KWordTextHandler::fieldStart(const wvWare::FLD* fld, \
wvWare::SharedPtr<cons
kWarning(30513) << "Warning: processing only a subset of field \
instructions!"; break;
default:
- kWarning(30513) << "Warning: unrecognized field type" << m_fieldType << ", \
ignoring!";
- m_fieldType = UNSUPPORTED;
+ kWarning(30513) << "Warning: unrecognized field type" << m_fld->m_type << ", \
ignoring!"; + m_fld->m_type = UNSUPPORTED;
break;
}
m_fldStart++;
@@ -1034,11 +1026,11 @@ void KWordTextHandler::fieldStart(const wvWare::FLD* fld, \
wvWare::SharedPtr<cons void KWordTextHandler::fieldSeparator(const wvWare::FLD* \
/*fld*/, wvWare::SharedPtr<const wvWare::Word97::CHP> /*chp*/) {
kDebug(30513) ;
- m_fieldAfterSeparator = true;
- QString* inst = &m_fldInst;
+ m_fld->m_afterSeparator = true;
+ QString* inst = &m_fld->m_instructions;
//process field instructions if required
- switch (m_fieldType) {
+ switch (m_fld->m_type) {
case HYPERLINK:
{
// Syntax: HYPERLINK field-argument [ switches ]
@@ -1068,14 +1060,14 @@ void KWordTextHandler::fieldSeparator(const wvWare::FLD* \
/*fld*/, wvWare::Shared
// \l field-argument - Text in this switch's field-argument specifies a
// location in the file, such as a bookmark, where to jump.
QRegExp rx("\\s\\\\l\\s\"(\\S+)\"");
- m_hyperLinkActive = true;
+ m_fld->m_hyperLinkActive = true;
if (rx.indexIn(*inst) >= 0) {
- m_hyperLinkUrl = rx.cap(1).prepend("#");
+ m_fld->m_hyperLinkUrl = rx.cap(1).prepend("#");
} else {
rx = QRegExp("HYPERLINK\\s\"(\\S+)\"");
if (rx.indexIn(*inst) >= 0) {
- m_hyperLinkUrl = rx.cap(1);
+ m_fld->m_hyperLinkUrl = rx.cap(1);
} else {
kDebug(30513) << "HYPERLINK: missing URL";
}
@@ -1102,12 +1094,12 @@ void KWordTextHandler::fieldSeparator(const wvWare::FLD* \
/*fld*/, wvWare::Shared // \h - Creates a hyperlink to the bookmarked paragraph.
QRegExp rx("PAGEREF\\s(\\S+)");
if (rx.indexIn(*inst) >= 0) {
- m_hyperLinkUrl = rx.cap(1);
+ m_fld->m_hyperLinkUrl = rx.cap(1);
}
rx = QRegExp("\\s\\\\h\\s");
if (rx.indexIn(*inst) >= 0) {
- m_hyperLinkActive = true;
- m_hyperLinkUrl.prepend("#");
+ m_fld->m_hyperLinkActive = true;
+ m_fld->m_hyperLinkUrl.prepend("#");
}
break;
}
@@ -1295,10 +1287,10 @@ void KWordTextHandler::fieldEnd(const wvWare::FLD* /*fld*/, \
wvWare::SharedPtr<co QBuffer buf;
buf.open(QIODevice::WriteOnly);
KoXmlWriter writer(&buf);
- QString* inst = &m_fldInst;
+ QString* inst = &m_fld->m_instructions;
QString tmp;
- switch (m_fieldType) {
+ switch (m_fld->m_type) {
case EQ:
{
//TODO: nested fields support required
@@ -1318,13 +1310,13 @@ void KWordTextHandler::fieldEnd(const wvWare::FLD* /*fld*/, \
wvWare::SharedPtr<co }
case HYPERLINK:
{
- if (m_hyperLinkActive) {
+ if (m_fld->m_hyperLinkActive) {
writer.startElement("text:a", false);
writer.addAttribute("xlink:type", "simple");
- writer.addAttribute("xlink:href", QUrl(m_hyperLinkUrl).toEncoded());
+ writer.addAttribute("xlink:href", \
QUrl(m_fld->m_hyperLinkUrl).toEncoded()); writer.startElement("text:span");
- writer.addAttribute("text:style-name", m_fldStyleName.toUtf8());
- writer.addCompleteElement(m_fldBuffer);
+ writer.addAttribute("text:style-name", m_fld->m_styleName.toUtf8());
+ writer.addCompleteElement(m_fld->m_buffer);
writer.endElement(); //text:span
writer.endElement(); //text:a
}
@@ -1356,22 +1348,22 @@ void KWordTextHandler::fieldEnd(const wvWare::FLD* /*fld*/, \
wvWare::SharedPtr<co break;
case PAGEREF:
{
- if (m_hyperLinkActive) {
+ if (m_fld->m_hyperLinkActive) {
writer.startElement("text:a", false);
writer.addAttribute("xlink:type", "simple");
- writer.addAttribute("xlink:href", QUrl(m_hyperLinkUrl).toEncoded());
+ writer.addAttribute("xlink:href", \
QUrl(m_fld->m_hyperLinkUrl).toEncoded()); writer.startElement("text:span");
- writer.addAttribute("text:style-name", m_fldStyleName.toUtf8());
- writer.addCompleteElement(m_fldBuffer);
+ writer.addAttribute("text:style-name", m_fld->m_styleName.toUtf8());
+ writer.addCompleteElement(m_fld->m_buffer);
writer.endElement(); //text:span
writer.endElement(); //text:a
} else {
writer.startElement("text:bookmark-ref");
writer.addAttribute("text:reference-format", "page");
- writer.addAttribute("text:ref-name", QUrl(m_hyperLinkUrl).toEncoded());
+ writer.addAttribute("text:ref-name", \
QUrl(m_fld->m_hyperLinkUrl).toEncoded()); writer.startElement("text:span");
- writer.addAttribute("text:style-name", m_fldStyleName.toUtf8());
- writer.addCompleteElement(m_fldBuffer);
+ writer.addAttribute("text:style-name", m_fld->m_styleName.toUtf8());
+ writer.addCompleteElement(m_fld->m_buffer);
writer.endElement(); //text:span
writer.endElement(); //text:bookmark-ref
}
@@ -1449,21 +1441,8 @@ void KWordTextHandler::fieldEnd(const wvWare::FLD* /*fld*/, \
wvWare::SharedPtr<co }
//reset
- m_fieldType = UNSUPPORTED;
- m_insideField = false;
- m_fieldAfterSeparator = false;
- m_hyperLinkActive = false;
-
- //cleanup
- m_hyperLinkUrl.clear();
- m_fldInst.clear();
- m_fldResult.clear();
- m_fldStyleName.clear();
-
- delete m_fldWriter;
- m_fldWriter = 0;
- delete m_fldBuffer;
- m_fldBuffer = 0;
+ delete m_fld;
+ m_fld = new fld_State();
m_fldEnd++;
@@ -1496,17 +1475,17 @@ void KWordTextHandler::runOfText(const wvWare::UString& text, \
wvWare::SharedPtr< return;
}
- if (m_insideField) {
+ if (m_fld->m_insideField) {
//processing field instructions
- if (!m_fieldAfterSeparator) {
- switch (m_fieldType) {
+ if (!m_fld->m_afterSeparator) {
+ switch (m_fld->m_type) {
case EQ:
case HYPERLINK:
case MACROBUTTON:
case PAGEREF:
case SYMBOL:
case TOC:
- m_fldInst.append(newText);
+ m_fld->m_instructions.append(newText);
break;
default:
kDebug(30513) << "Ignoring field instructions!";
@@ -1515,8 +1494,8 @@ void KWordTextHandler::runOfText(const wvWare::UString& text, \
wvWare::SharedPtr< }
//processing the field result
else {
- KoXmlWriter* writer = m_fldWriter;
- switch (m_fieldType) {
+ KoXmlWriter* writer = m_fld->m_writer;
+ switch (m_fld->m_type) {
case PAGEREF:
writer->addTextNode(newText);
break;
@@ -1548,8 +1527,8 @@ void KWordTextHandler::runOfText(const wvWare::UString& text, \
wvWare::SharedPtr<
//styles related information. Reuse the addRunOfText function.
//create a style for the <text:span> element (if applicable)
- if (m_fldStyleName.isEmpty()) {
- m_fldStyleName = m_paragraph->createTextStyle(chp, \
m_parser->styleSheet()); + if (m_fld->m_styleName.isEmpty()) {
+ m_fld->m_styleName = m_paragraph->createTextStyle(chp, \
m_parser->styleSheet()); }
return;
}
@@ -2050,20 +2029,10 @@ void KWordTextHandler::restoreState()
void KWordTextHandler::fld_saveState()
{
- m_fldStates.push(fld_State(m_fieldType, m_insideField, m_fieldAfterSeparator, \
m_hyperLinkActive,
- m_hyperLinkUrl, m_fldInst, m_fldResult, \
m_fldStyleName, m_fldWriter, m_fldBuffer)); + m_fldStates.push(m_fld);
//reset fields related variables
- m_fieldType = UNSUPPORTED;
- m_insideField = false;
- m_fieldAfterSeparator = false;
- m_hyperLinkActive = false;
- m_hyperLinkUrl.clear();
- m_fldInst.clear();
- m_fldResult.clear();
- m_fldStyleName.clear();
- m_fldWriter = 0;
- m_fldBuffer = 0;
+ m_fld = 0;
}
void KWordTextHandler::fld_restoreState()
@@ -2073,28 +2042,17 @@ void KWordTextHandler::fld_restoreState()
kWarning() << "Error: save/restore stack is corrupt!";
return;
}
- fld_State s(m_fldStates.top());
- m_fldStates.pop();
//warn if pointers weren't reset properly, but restore state anyway
- if (m_fldWriter != 0) {
- kWarning() << "m_fldWriter pointer wasn't reset";
+ if (m_fld->m_writer != 0) {
+ kWarning() << "m_fld->m_writer pointer wasn't reset";
}
- m_fldWriter = s.writer;
-
- if (m_fldBuffer != 0) {
- kWarning() << "m_fldBuffer pointer wasn't reset";
+ if (m_fld->m_buffer != 0) {
+ kWarning() << "m_fld->m_buffer pointer wasn't reset";
}
- m_fldBuffer = s.buffer;
- m_fieldType = s.type;
- m_insideField = s.inside;
- m_fieldAfterSeparator = s.afterSeparator;
- m_hyperLinkActive = s.hyperLinkActive;
- m_hyperLinkUrl = s.hyperLinkUrl;
- m_fldInst = s.instructions;
- m_fldResult = s.result;
- m_fldStyleName = s.styleName;
+ m_fld = m_fldStates.top();
+ m_fldStates.pop();
}
#include "texthandler.moc"
diff --git a/filters/words/msword-odf/texthandler.h \
b/filters/words/msword-odf/texthandler.h index b2580b6..738eca1 100644
--- a/filters/words/msword-odf/texthandler.h
+++ b/filters/words/msword-odf/texthandler.h
@@ -251,41 +251,6 @@ private:
// Field related
// ************************************************
- //save/restore for processing field (very similar to the wv2 method)
- struct fld_State
- {
- fld_State(int type, bool inside, bool afterSep, bool hyperLink, QString url,
- QString inst, QString result, QString stlName, KoXmlWriter* \
writer, QBuffer* buf) :
- type(type),
- inside(inside),
- afterSeparator(afterSep),
- hyperLinkActive(hyperLink),
- hyperLinkUrl(url),
- instructions(inst),
- result(result),
- styleName(stlName),
- writer(writer),
- buffer(buf) {}
-
- int type;
- bool inside;
- bool afterSeparator;
- bool hyperLinkActive;
- QString hyperLinkUrl;
- QString instructions;
- QString result;
- QString styleName;
- KoXmlWriter* writer;
- QBuffer* buffer;
- };
-
- std::stack<fld_State> m_fldStates;
- void fld_saveState();
- void fld_restoreState();
-
- //storage for XML snippets of already processed fields
- QList<QString> m_fld_snippets;
-
//field type enumeration as defined in MS-DOC page 354/609
enum fldType
{
@@ -309,26 +274,70 @@ private:
SHAPE = 0x5f
};
- //set to 0 for a field we can't handle, anything else is the field type
- int m_fieldType;
-
- //other field related variables
- bool m_insideField;
- bool m_fieldAfterSeparator;
- bool m_hyperLinkActive;
+ //save/restore for processing field (very similar to the wv2 method)
+ struct fld_State
+ {
+ fld_State(fldType type = UNSUPPORTED) :
+ m_type(type),
+ m_insideField(false),
+ m_afterSeparator(false),
+ m_hyperLinkActive(false),
+ m_hyperLinkUrl(QString::null),
+ m_instructions(QString::null),
+ m_result(QString::null),
+ m_styleName(QString::null),
+ m_writer(0),
+ m_buffer(0)
+ {
+ m_buffer = new QBuffer();
+ m_buffer->open(QIODevice::WriteOnly);
+ m_writer = new KoXmlWriter(m_buffer);
+ }
+
+ ~fld_State()
+ {
+ delete m_writer;
+ m_writer = 0;
+ delete m_buffer;
+ m_buffer = 0;
+ }
+
+ //set to UNSUPPORTED for a field we can't handle, anything else is the field \
type + fldType m_type;
+
+ //other field related variables
+ bool m_insideField;
+ bool m_afterSeparator;
+ bool m_hyperLinkActive;
+
+ //stores the location (bookmark/URL) to jump to
+ QString m_hyperLinkUrl;
+
+ //stores field instructions
+ QString m_instructions;
+
+ //stores the field result
+ QString m_result;
+
+ //KoGenStyle name for the <text:span> element encapsulating the field
+ //result (if applicable)
+ QString m_styleName;
+
+ //writer and buffer used to place bookmark elements into the field result,
+ //if bookmarks are not to be supported by your field type, use m_result
+ KoXmlWriter* m_writer;
+ QBuffer* m_buffer;
+ };
- //writer and buffer used to place bookmark elements into the field result,
- //if bookmarks are not to be supported by your field type, use m_fldResult
- KoXmlWriter* m_fldWriter;
- QBuffer* m_fldBuffer;
+ std::stack<fld_State *> m_fldStates;
+ void fld_saveState();
+ void fld_restoreState();
- QString m_hyperLinkUrl; //stores the location (bookmark/URL) to jump to
- QString m_fldInst; //stores field instructions
- QString m_fldResult; //stores the field result
+ //storage for XML snippets of already processed fields
+ QList<QString> m_fld_snippets;
- //KoGenStyle name for the <text:span> element encapsulating the field
- //result (if applicable)
- QString m_fldStyleName;
+ // Current field.
+ fld_State *m_fld;
//counters
int m_fldStart;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic