]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetText.cpp
Remove TextClassPtr without losing the type safety it provided.
[lyx.git] / src / insets / InsetText.cpp
index 5226edb6ae09eb6c60113fe3f4bb6f0edf4669cc..83f705dbf0b73fbb864176cfceaacf529de91f6e 100644 (file)
@@ -43,6 +43,7 @@
 #include "TextClass.h"
 #include "TextMetrics.h"
 #include "TexRow.h"
+#include "WordList.h"
 
 #include "frontends/alert.h"
 #include "frontends/Painter.h"
@@ -65,30 +66,32 @@ namespace lyx {
 using graphics::PreviewLoader;
 
 
-class TextCompletionList : public Inset::CompletionList {
+class TextCompletionList : public Inset::CompletionList
+{
 public:
        ///
        TextCompletionList(Cursor const & cur)
-       : buf_(cur.buffer()), it_(buf_.registeredWords().begin()), pos_(0) {}
+       : buf_(cur.buffer()), pos_(0) {}
        ///
        virtual ~TextCompletionList() {}
 
        ///
-       virtual size_t size() const {
-               return buf_.registeredWords().size();
+       virtual bool sorted() const { return true; }
+       ///
+       virtual size_t size() const
+       {
+               return theWordList().size();
        }
        ///
-       virtual docstring data(size_t idx) const {
-               std::set<docstring>::const_iterator it
-               = buf_.registeredWords().begin();
-               for (size_t i = 0; i < idx; ++i)
-                       it++;
-               return *it;
+       virtual docstring const & data(size_t idx) const
+       {
+               return theWordList().word(idx);
        }
 
 private:
+       ///
        Buffer const & buf_;
-       std::set<docstring>::const_iterator const it_;
+       ///
        size_t pos_;
 };
 
@@ -100,10 +103,7 @@ InsetText::InsetText(BufferParams const & bp)
 {
        paragraphs().push_back(Paragraph());
        Paragraph & ourpar = paragraphs().back();
-       if (useEmptyLayout())
-               ourpar.layout(bp.getTextClass().emptyLayout());
-       else
-               ourpar.layout(bp.getTextClass().defaultLayout());
+       ourpar.setEmptyOrDefaultLayout(bp.documentClass());
        ourpar.setInsetOwner(this);
 }
 
@@ -140,7 +140,7 @@ void InsetText::clear()
        pars.clear();
        pars.push_back(Paragraph());
        pars.begin()->setInsetOwner(this);
-       pars.begin()->layout(old_layout);
+       pars.begin()->setLayout(old_layout);
 }
 
 
@@ -161,14 +161,14 @@ Dimension const InsetText::dimension(BufferView const & bv) const
 }
 
 
-void InsetText::write(Buffer const & buf, ostream & os) const
+void InsetText::write(ostream & os) const
 {
        os << "Text\n";
-       text_.write(buf, os);
+       text_.write(buffer(), os);
 }
 
 
-void InsetText::read(Buffer const & buf, Lexer & lex)
+void InsetText::read(Lexer & lex)
 {
        clear();
 
@@ -176,7 +176,7 @@ void InsetText::read(Buffer const & buf, Lexer & lex)
        Paragraph oldpar = *paragraphs().begin();
        paragraphs().clear();
        ErrorList errorList;
-       bool res = text_.read(buf, lex, errorList, this);
+       bool res = text_.read(buffer(), lex, errorList, this);
 
        if (!res) {
                lex.printError("Missing \\end_inset at this point. "
@@ -228,7 +228,7 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
 }
 
 
-docstring const InsetText::editMessage() const
+docstring InsetText::editMessage() const
 {
        return _("Opened Text Inset");
 }
@@ -297,17 +297,15 @@ void InsetText::rejectChanges(BufferParams const & bparams)
 }
 
 
-int InsetText::latex(Buffer const & buf, odocstream & os,
-                    OutputParams const & runparams) const
+int InsetText::latex(odocstream & os, OutputParams const & runparams) const
 {
        TexRow texrow;
-       latexParagraphs(buf, text_, os, texrow, runparams);
+       latexParagraphs(buffer(), text_, os, texrow, runparams);
        return texrow.rows();
 }
 
 
-int InsetText::plaintext(Buffer const & buf, odocstream & os,
-                        OutputParams const & runparams) const
+int InsetText::plaintext(odocstream & os, OutputParams const & runparams) const
 {
        ParagraphList::const_iterator beg = paragraphs().begin();
        ParagraphList::const_iterator end = paragraphs().end();
@@ -321,7 +319,7 @@ int InsetText::plaintext(Buffer const & buf, odocstream & os,
                                os << '\n';
                }
                odocstringstream oss;
-               writePlaintextParagraph(buf, *it, oss, runparams, ref_printed);
+               writePlaintextParagraph(buffer(), *it, oss, runparams, ref_printed);
                docstring const str = oss.str();
                os << str;
                // FIXME: len is not computed fully correctly; in principle,
@@ -333,10 +331,9 @@ int InsetText::plaintext(Buffer const & buf, odocstream & os,
 }
 
 
-int InsetText::docbook(Buffer const & buf, odocstream & os,
-                      OutputParams const & runparams) const
+int InsetText::docbook(odocstream & os, OutputParams const & runparams) const
 {
-       docbookParagraphs(paragraphs(), buf, os, runparams);
+       docbookParagraphs(paragraphs(), buffer(), os, runparams);
        return 0;
 }
 
@@ -410,7 +407,7 @@ void InsetText::setFrameColor(ColorCode col)
 }
 
 
-void InsetText::appendParagraphs(Buffer * buffer, ParagraphList & plist)
+void InsetText::appendParagraphs(ParagraphList & plist)
 {
        // There is little we can do here to keep track of changes.
        // As of 2006/10/20, appendParagraphs is used exclusively by
@@ -422,7 +419,7 @@ void InsetText::appendParagraphs(Buffer * buffer, ParagraphList & plist)
        ParagraphList::iterator pit = plist.begin();
        ParagraphList::iterator ins = pl.insert(pl.end(), *pit);
        ++pit;
-       mergeParagraph(buffer->params(), pl,
+       mergeParagraph(buffer().params(), pl,
                       distance(pl.begin(), ins) - 1);
 
        for_each(pit, plist.end(),
@@ -444,12 +441,12 @@ void InsetText::addPreview(PreviewLoader & loader) const
 }
 
 
-//FIXME: instead of this hack, which only works by chance,
+// FIXME: instead of this hack, which only works by chance,
 // cells should have their own insetcell type, which returns CELL_CODE!
-bool InsetText::neverIndent(Buffer const & buffer) const
+bool InsetText::neverIndent() const
 {
        // this is only true for tabular cells
-       return !text_.isMainText(buffer) && lyxCode() == TEXT_CODE;
+       return !text_.isMainText(buffer()) && lyxCode() == TEXT_CODE;
 }
 
 
@@ -465,12 +462,31 @@ ParagraphList & InsetText::paragraphs()
 }
 
 
-void InsetText::updateLabels(Buffer const & buf, ParIterator const & it)
+void InsetText::updateLabels(ParIterator const & it)
 {
        ParIterator it2 = it;
        it2.forwardPos();
        BOOST_ASSERT(&it2.inset() == this && it2.pit() == 0);
-       lyx::updateLabels(buf, it2);
+       lyx::updateLabels(buffer(), it2);
+}
+
+
+bool InsetText::notifyCursorLeaves(Cursor const & old, Cursor & cur)
+{
+       if (cur.buffer().isClean())
+               return Inset::notifyCursorLeaves(old, cur);
+       
+       // find text inset in old cursor
+       Cursor insetCur = old;
+       int scriptSlice = insetCur.find(this);
+       BOOST_ASSERT(scriptSlice != -1);
+       insetCur.cutOff(scriptSlice);
+       BOOST_ASSERT(&insetCur.inset() == this);
+       
+       // update the old paragraph's words
+       insetCur.paragraph().updateWords(insetCur.buffer(), insetCur.top());
+       
+       return Inset::notifyCursorLeaves(old, cur);
 }
 
 
@@ -504,8 +520,8 @@ bool InsetText::automaticPopupCompletion() const
 }
 
 
-Inset::CompletionList const 
-* InsetText::createCompletionList(Cursor const & cur) const
+Inset::CompletionList const * InsetText::createCompletionList(
+       Cursor const & cur) const
 {
        if (!completionSupported(cur))
                return 0;
@@ -514,7 +530,7 @@ Inset::CompletionList const
 }
 
 
-docstring InsetText::previousWord(Buffer const & buffer, CursorSlice const & sl) const
+docstring InsetText::previousWord(CursorSlice const & sl) const
 {
        CursorSlice from = sl;
        CursorSlice to = sl;
@@ -523,7 +539,7 @@ docstring InsetText::previousWord(Buffer const & buffer, CursorSlice const & sl)
                return docstring();
        
        Paragraph const & par = sl.paragraph();
-       return par.asString(buffer, from.pos(), to.pos(), false);
+       return par.asString(from.pos(), to.pos(), false);
 }
 
 
@@ -531,13 +547,12 @@ docstring InsetText::completionPrefix(Cursor const & cur) const
 {
        if (!completionSupported(cur))
                return docstring();
-       
-       return previousWord(cur.buffer(), cur.top());
+       return previousWord(cur.top());
 }
 
 
 bool InsetText::insertCompletion(Cursor & cur, docstring const & s,
-                                    bool finished)
+       bool /*finished*/)
 {
        if (!completionSupported(cur))
                return false;
@@ -545,29 +560,37 @@ bool InsetText::insertCompletion(Cursor & cur, docstring const & s,
        BOOST_ASSERT(cur.bv().cursor() == cur);
        cur.insert(s);
        cur.bv().cursor() = cur;
+       if (!(cur.disp_.update() & Update::Force))
+               cur.updateFlags(cur.disp_.update() | Update::SinglePar);
        return true;
 }
 
 
 void InsetText::completionPosAndDim(Cursor const & cur, int & x, int & y, 
-                                       Dimension & dim) const
+       Dimension & dim) const
 {
+       Cursor const & bvcur = cur.bv().cursor();
+       
        // get word in front of cursor
-       docstring word = previousWord(cur.buffer(), cur.top());
-       DocIterator wordStart = cur;
+       docstring word = previousWord(bvcur.top());
+       DocIterator wordStart = bvcur;
        wordStart.pos() -= word.length();
        
-       // get position on screen of the word start
+       // get position on screen of the word start and end
        Point lxy = cur.bv().getPos(wordStart, false);
-       x = lxy.x_;
-       y = lxy.y_;
-
-       // Calculate dimensions of the word
+       Point rxy = cur.bv().getPos(bvcur, bvcur.boundary());
+       
+       // calculate dimensions of the word
        TextMetrics const & tm = cur.bv().textMetrics(&text_);
-       dim = tm.rowHeight(cur.pit(), wordStart.pos(), cur.pos(), false);
-       Point rxy = cur.bv().getPos(cur, cur.boundary());
-       dim.wid = abs(rxy.x_ - x);
-       x = (rxy.x_ < x) ? x - dim.wid : x; // for RTL
+       dim = tm.rowHeight(bvcur.pit(), wordStart.pos(), bvcur.pos(), false);
+       dim.wid = abs(rxy.x_ - lxy.x_);
+       
+       // calculate position of word
+       y = lxy.y_;
+       x = min(rxy.x_, lxy.x_);
+       
+       //lyxerr << "wid=" << dim.width() << " x=" << x << " y=" << y << " lxy.x_=" << lxy.x_ << " rxy.x_=" << rxy.x_ << " word=" << word << std::endl;
+       //lyxerr << " wordstart=" << wordStart << " bvcur=" << bvcur << " cur=" << cur << std::endl;
 }