[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