commit 8914ddeaee2aa78459c3148866ca779d6a693f69
Author: Guillaume Munch <g...@lyx.org>
Date:   Mon Jan 9 23:15:16 2017 +0100

    Reorganise and simplify
---
 src/DocIterator.cpp |   11 +++++-
 src/DocIterator.h   |    2 +
 src/Makefile.am     |    2 +
 src/TocBackend.cpp  |  111 +++-----------------------------------------------
 src/TocBackend.h    |   52 ++++--------------------
 src/TocBuilder.cpp  |   92 ++++++++++++++++++++++++++++++++++++++++++
 src/TocBuilder.h    |   61 ++++++++++++++++++++++++++++
 7 files changed, 182 insertions(+), 149 deletions(-)

diff --git a/src/DocIterator.cpp b/src/DocIterator.cpp
index 57286d9..fdb6187 100644
--- a/src/DocIterator.cpp
+++ b/src/DocIterator.cpp
@@ -26,6 +26,7 @@
 
 #include "insets/InsetTabular.h"
 
+#include "support/convert.h"
 #include "support/debug.h"
 #include "support/ExceptionMessage.h"
 #include "support/gettext.h"
@@ -207,7 +208,7 @@ FontSpan DocIterator::locateWord(word_location const loc) 
const
        return f;
 }
 
-       
+
 CursorSlice const & DocIterator::innerTextSlice() const
 {
        LBUFERR(!empty());
@@ -226,6 +227,14 @@ CursorSlice const & DocIterator::innerTextSlice() const
 }
 
 
+docstring DocIterator::paragraphGotoArgument() const
+{
+       CursorSlice const & s = innerTextSlice();
+       return convert<docstring>(s.paragraph().id()) + ' ' +
+               convert<docstring>(s.pos());
+}
+
+
 DocIterator DocIterator::getInnerText() const
 {
        DocIterator texted = *this;
diff --git a/src/DocIterator.h b/src/DocIterator.h
index 3f71869..425bfa4 100644
--- a/src/DocIterator.h
+++ b/src/DocIterator.h
@@ -165,6 +165,8 @@ public:
        Paragraph & innerParagraph() const;
        /// return the inner text slice.
        CursorSlice const & innerTextSlice() const;
+       // convert a DocIterator into an argument to LFUN_PARAGRAPH_GOTO
+       docstring paragraphGotoArgument() const;
        /// returns a DocIterator for the containing text inset
        DocIterator getInnerText() const;
        /// the first and last positions of a word at top cursor slice
diff --git a/src/Makefile.am b/src/Makefile.am
index f87d029..d2a5e85 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -183,6 +183,7 @@ SOURCEFILESCORE = \
        TextClass.cpp \
        TextMetrics.cpp \
        TocBackend.cpp \
+       TocBuilder.cpp \
        Trans.cpp \
        Undo.cpp \
        VCBackend.cpp \
@@ -288,6 +289,7 @@ HEADERFILESCORE = \
        TextMetrics.h \
        Toc.h \
        TocBackend.h \
+       TocBuilder.h \
        Trans.h \
        Undo.h \
        update_flags.h \
diff --git a/src/TocBackend.cpp b/src/TocBackend.cpp
index 1256a49..1c16066 100644
--- a/src/TocBackend.cpp
+++ b/src/TocBackend.cpp
@@ -17,19 +17,12 @@
 
 #include "Buffer.h"
 #include "BufferParams.h"
-#include "Cursor.h"
-#include "FloatList.h"
-#include "FuncRequest.h"
 #include "InsetList.h"
-#include "Layout.h"
-#include "LyXAction.h"
 #include "Paragraph.h"
-#include "ParIterator.h"
 #include "TextClass.h"
 
 #include "insets/InsetText.h"
 
-#include "support/convert.h"
 #include "support/debug.h"
 #include "support/docstream.h"
 #include "support/gettext.h"
@@ -74,22 +67,11 @@ docstring const TocItem::asString() const
        return prefix + str_;
 }
 
-namespace {
-
-// convert a DocIterator into an argument to LFUN_PARAGRAPH_GOTO 
-docstring paragraph_goto_arg(DocIterator const & dit)
-{
-       CursorSlice const & s = dit.innerTextSlice();
-       return convert<docstring>(s.paragraph().id()) + ' ' +
-               convert<docstring>(s.pos());
-}
-
-} // namespace anon
 
 FuncRequest TocItem::action() const
 {
        if (action_.action() == LFUN_UNKNOWN_ACTION) {
-               return FuncRequest(LFUN_PARAGRAPH_GOTO, 
paragraph_goto_arg(dit_));
+               return FuncRequest(LFUN_PARAGRAPH_GOTO, 
dit_.paragraphGotoArgument());
        } else
                return action_;
 }
@@ -97,7 +79,7 @@ FuncRequest TocItem::action() const
 
 ///////////////////////////////////////////////////////////////////////////
 //
-// Toc implementation
+// TocBackend implementation
 //
 ///////////////////////////////////////////////////////////////////////////
 
@@ -115,9 +97,9 @@ Toc::const_iterator TocBackend::findItem(Toc const & toc,
                // We verify that we don't compare contents of two
                // different document. This happens when you
                // have parent and child documents.
-               if (&it->dit_[0].inset() != &dit_text[0].inset())
+               if (&it->dit()[0].inset() != &dit_text[0].inset())
                        continue;
-               if (it->dit_ <= dit_text)
+               if (it->dit() <= dit_text)
                        return it;
        }
 
@@ -140,85 +122,6 @@ Toc::iterator TocBackend::findItem(Toc & toc, int depth, 
docstring const & str)
 }
 
 
-///////////////////////////////////////////////////////////////////////////
-//
-// TocBuilder implementation
-//
-///////////////////////////////////////////////////////////////////////////
-
-TocBuilder::TocBuilder(shared_ptr<Toc> toc)
-       : toc_(toc ? toc : make_shared<Toc>()),
-         stack_()
-{
-       LATTEST(toc);
-}
-
-void TocBuilder::pushItem(DocIterator const & dit, docstring const & s,
-                          bool output_active, bool is_captioned)
-{
-       toc_->push_back(TocItem(dit, stack_.size(), s, output_active));
-       frame f = {
-               toc_->size() - 1, //pos
-               is_captioned, //is_captioned
-       };
-       stack_.push(f);
-}
-
-void TocBuilder::captionItem(DocIterator const & dit, docstring const & s,
-                             bool output_active)
-{
-       // first show the float before moving to the caption
-       docstring arg = "paragraph-goto " + paragraph_goto_arg(dit);
-       if (!stack_.empty())
-               arg = "paragraph-goto " +
-                       paragraph_goto_arg((*toc_)[stack_.top().pos].dit_) + 
";" + arg;
-       FuncRequest func(LFUN_COMMAND_SEQUENCE, arg);
-
-       if (!stack_.empty() && !stack_.top().is_captioned) {
-               // The float we entered has not yet been assigned a caption.
-               // Assign the caption string to it.
-               TocItem & captionable = (*toc_)[stack_.top().pos];
-               captionable.str(s);
-               captionable.setAction(func);
-               stack_.top().is_captioned = true;
-       } else {
-               // This is a new entry.
-               pop();
-               // the dit is at the float's level, e.g. for the contextual 
menu of
-               // outliner entries
-               DocIterator captionable_dit = dit;
-               captionable_dit.pop_back();
-               pushItem(captionable_dit, s, output_active, true);
-               (*toc_)[stack_.top().pos].setAction(func);
-       }
-}
-
-void TocBuilder::argumentItem(docstring const & arg_str)
-{
-       if (stack_.empty() || arg_str.empty())
-               return;
-       TocItem & item = (*toc_)[stack_.top().pos];
-       docstring const & str = item.str();
-       string const & delim =
-               (str.empty() || !stack_.top().is_captioned) ? "" :  ", ";
-       item.str(str + from_ascii(delim) + arg_str);
-       stack_.top().is_captioned = true;
-}
-
-void TocBuilder::pop()
-{
-       if (!stack_.empty())
-               stack_.pop();
-}
-
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// TocBackend implementation
-//
-///////////////////////////////////////////////////////////////////////////
-
 shared_ptr<Toc const> TocBackend::toc(string const & type) const
 {
        // Is the type already supported?
@@ -276,7 +179,7 @@ bool TocBackend::updateItem(DocIterator const & dit_in)
        //
        // FIXME: This is supposed to accomplish the same as the body of
        // InsetText::iterateForToc(), probably
-       Paragraph & par = toc_item->dit_.paragraph();
+       Paragraph & par = toc_item->dit().paragraph();
        InsetList::const_iterator it = par.insetList().begin();
        InsetList::const_iterator end = par.insetList().end();
        for (; it != end; ++it) {
@@ -290,8 +193,8 @@ bool TocBackend::updateItem(DocIterator const & dit_in)
                }
        }
 
-       int const toclevel = toc_item->dit_.text()->
-               getTocLevel(toc_item->dit_.pit());
+       int const toclevel = toc_item->dit().text()->
+               getTocLevel(toc_item->dit().pit());
        if (toclevel != Layout::NOT_IN_TOC && toclevel >= min_toclevel
                && tocstring.empty())
                par.forOutliner(tocstring, TOC_ENTRY_LENGTH);
diff --git a/src/TocBackend.h b/src/TocBackend.h
index 1e58ec2..3f2ee41 100644
--- a/src/TocBackend.h
+++ b/src/TocBackend.h
@@ -19,12 +19,11 @@
 #include "FuncRequest.h"
 #include "OutputEnums.h"
 #include "Toc.h"
+#include "TocBuilder.h"
 
 #include "support/strfwd.h"
 #include "support/unique_ptr.h"
 
-#include <stack>
-
 
 namespace lyx {
 
@@ -54,9 +53,6 @@ class Buffer;
 */
 class TocItem
 {
-       friend class TocBackend;
-       friend class TocBuilder;
-
 public:
        /// Default constructor for STL containers.
        TocItem() : dit_(0), depth_(0), output_(false) {}
@@ -68,31 +64,28 @@ public:
                FuncRequest action = FuncRequest(LFUN_UNKNOWN_ACTION)
                );
        ///
-       ~TocItem() {}
-       ///
-       int id() const;
+       DocIterator const & dit() const { return dit_; }
        ///
        int depth() const { return depth_; }
        ///
        docstring const & str() const { return str_; }
        ///
        void str(docstring const & s) { str_ = s; }
-       /// String for display, e.g. it has a mark if output is inactive
-       docstring const asString() const;
-       ///
-       DocIterator const & dit() const { return dit_; }
        ///
        bool isOutput() const { return output_; }
        ///
        void setAction(FuncRequest a) { action_ = a; }
+
        /// custom action, or the default one (paragraph-goto) if not customised
        FuncRequest action() const;
+       ///
+       int id() const;
+       /// String for display, e.g. it has a mark if output is inactive
+       docstring const asString() const;
 
-protected:
+private:
        /// Current position of item.
        DocIterator dit_;
-
-private:
        /// nesting depth
        int depth_;
        /// Full item string
@@ -104,35 +97,6 @@ private:
 };
 
 
-/// Caption-enabled TOC builders
-class TocBuilder
-{
-public:
-       TocBuilder(std::shared_ptr<Toc> toc);
-       /// When entering a float or flex or paragraph (with AddToToc)
-       void pushItem(DocIterator const & dit, docstring const & s,
-                     bool output_active, bool is_captioned = false);
-       /// When encountering a float caption
-       void captionItem(DocIterator const & dit, docstring const & s,
-                        bool output_active);
-       /// When encountering an argument (with isTocCaption) for flex or 
paragraph
-       void argumentItem(docstring const & arg_str);
-       /// When exiting a float or flex or paragraph
-       void pop();
-private:
-       TocBuilder(){}
-       ///
-       struct frame {
-               Toc::size_type pos;
-               bool is_captioned;
-       };
-       ///
-       std::shared_ptr<Toc> const toc_;
-       ///
-       std::stack<frame> stack_;
-};
-
-
 /// Class to build and access the Tocs of a particular buffer.
 class TocBackend
 {
diff --git a/src/TocBuilder.cpp b/src/TocBuilder.cpp
new file mode 100644
index 0000000..deaace2
--- /dev/null
+++ b/src/TocBuilder.cpp
@@ -0,0 +1,92 @@
+/**
+ * \file TocBuilder.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Guillaume Munch
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "TocBuilder.h"
+
+#include "TocBackend.h"
+
+#include "support/lassert.h"
+
+using namespace std;
+
+
+namespace lyx {
+
+
+
+TocBuilder::TocBuilder(shared_ptr<Toc> toc)
+       : toc_(toc ? toc : make_shared<Toc>()),
+         stack_()
+{
+       LATTEST(toc);
+}
+
+void TocBuilder::pushItem(DocIterator const & dit, docstring const & s,
+                          bool output_active, bool is_captioned)
+{
+       toc_->push_back(TocItem(dit, stack_.size(), s, output_active));
+       frame f = {
+               toc_->size() - 1, //pos
+               is_captioned, //is_captioned
+       };
+       stack_.push(f);
+}
+
+void TocBuilder::captionItem(DocIterator const & dit, docstring const & s,
+                             bool output_active)
+{
+       // first show the float before moving to the caption
+       docstring arg = "paragraph-goto " + dit.paragraphGotoArgument();
+       if (!stack_.empty())
+               arg = "paragraph-goto " +
+                       (*toc_)[stack_.top().pos].dit().paragraphGotoArgument() 
+ ";" + arg;
+       FuncRequest func(LFUN_COMMAND_SEQUENCE, arg);
+
+       if (!stack_.empty() && !stack_.top().is_captioned) {
+               // The float we entered has not yet been assigned a caption.
+               // Assign the caption string to it.
+               TocItem & captionable = (*toc_)[stack_.top().pos];
+               captionable.str(s);
+               captionable.setAction(func);
+               stack_.top().is_captioned = true;
+       } else {
+               // This is a new entry.
+               pop();
+               // the dit is at the float's level, e.g. for the contextual 
menu of
+               // outliner entries
+               DocIterator captionable_dit = dit;
+               captionable_dit.pop_back();
+               pushItem(captionable_dit, s, output_active, true);
+               (*toc_)[stack_.top().pos].setAction(func);
+       }
+}
+
+void TocBuilder::argumentItem(docstring const & arg_str)
+{
+       if (stack_.empty() || arg_str.empty())
+               return;
+       TocItem & item = (*toc_)[stack_.top().pos];
+       docstring const & str = item.str();
+       string const & delim =
+               (str.empty() || !stack_.top().is_captioned) ? "" :  ", ";
+       item.str(str + from_ascii(delim) + arg_str);
+       stack_.top().is_captioned = true;
+}
+
+void TocBuilder::pop()
+{
+       if (!stack_.empty())
+               stack_.pop();
+}
+
+
+} // namespace lyx
diff --git a/src/TocBuilder.h b/src/TocBuilder.h
new file mode 100644
index 0000000..da016a6
--- /dev/null
+++ b/src/TocBuilder.h
@@ -0,0 +1,61 @@
+// -*- C++ -*-
+/**
+ * \file TocBuilder.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Guillaume Munch
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef TOC_BUILDER_H
+#define TOC_BUILDER_H
+
+#include "DocIterator.h"
+#include "Toc.h"
+
+#include "support/strfwd.h"
+
+#include <stack>
+
+
+namespace lyx {
+
+
+/// Caption-enabled TOC builders
+class TocBuilder
+{
+public:
+       TocBuilder(std::shared_ptr<Toc> toc);
+       /// Open a level.
+       /// When entering a float or flex or paragraph (with AddToToc)
+       void pushItem(DocIterator const & dit, docstring const & s,
+                     bool output_active, bool is_captioned = false);
+       /// Edit entry at current level. Add new entry if already captioned.
+       /// When encountering a float caption
+       void captionItem(DocIterator const & dit, docstring const & s,
+                        bool output_active);
+       /// Edit entry at current level (always).
+       /// When encountering an argument (with isTocCaption) for flex or 
paragraph
+       void argumentItem(docstring const & arg_str);
+       /// Close a level.
+       /// When exiting a float or flex or paragraph
+       void pop();
+private:
+       TocBuilder(){}
+       ///
+       struct frame {
+               Toc::size_type pos;
+               bool is_captioned;
+       };
+       ///
+       std::shared_ptr<Toc> const toc_;
+       ///
+       std::stack<frame> stack_;
+};
+
+
+} // namespace lyx
+
+#endif // TOC_BUILDER_H

Reply via email to