]> git.lyx.org Git - lyx.git/blobdiff - src/Text.cpp
Cleanup: Replace a bunch of Cursor arguments with DocIterators.
[lyx.git] / src / Text.cpp
index 7f1861efb2e35649797c38ae95c6f568a4a4f116..8edbe2f0a69815407583f37e24e9ea08d4793bc8 100644 (file)
@@ -60,7 +60,6 @@
 #include "insets/InsetSpecialChar.h"
 #include "insets/InsetTabular.h"
 
-#include "support/convert.h"
 #include "support/debug.h"
 #include "support/docstream.h"
 #include "support/gettext.h"
@@ -80,11 +79,16 @@ namespace lyx {
 using cap::cutSelection;
 using cap::pasteParagraphList;
 
-namespace {
+InsetText const & Text::inset() const
+{
+       return *owner_;
+}
+
 
-void readParToken(Buffer const & buf, Paragraph & par, Lexer & lex,
+void Text::readParToken(Paragraph & par, Lexer & lex,
        string const & token, Font & font, Change & change, ErrorList & errorList)
 {
+       Buffer const & buf = owner_->buffer();
        BufferParams const & bp = buf.params();
 
        if (token[0] != '\\') {
@@ -103,7 +107,7 @@ void readParToken(Buffer const & buf, Paragraph & par, Lexer & lex,
                if (layoutname.empty())
                        layoutname = tclass.defaultLayoutName();
 
-               if (par.forcePlainLayout()) {
+               if (owner_->forcePlainLayout()) {
                        // in this case only the empty layout is allowed
                        layoutname = tclass.plainLayoutName();
                } else if (par.usePlainLayout()) {
@@ -188,6 +192,15 @@ void readParToken(Buffer const & buf, Paragraph & par, Lexer & lex,
                else
                        lex.printError("Unknown bar font flag "
                                       "`$$Token'");
+       } else if (token == "\\strikeout") {
+               lex.next();
+               font.fontInfo().setStrikeout(font.setLyXMisc(lex.getString()));
+       } else if (token == "\\uuline") {
+               lex.next();
+               font.fontInfo().setUuline(font.setLyXMisc(lex.getString()));
+       } else if (token == "\\uwave") {
+               lex.next();
+               font.fontInfo().setUwave(font.setLyXMisc(lex.getString()));
        } else if (token == "\\noun") {
                lex.next();
                font.fontInfo().setNoun(font.setLyXMisc(lex.getString()));
@@ -210,32 +223,24 @@ void readParToken(Buffer const & buf, Paragraph & par, Lexer & lex,
                par.insertInset(par.size(), new InsetLine, font, change);
        } else if (token == "\\change_unchanged") {
                change = Change(Change::UNCHANGED);
-       } else if (token == "\\change_inserted") {
-               lex.eatLine();
-               istringstream is(lex.getString());
-               unsigned int aid;
-               time_t ct;
-               is >> aid >> ct;
-               if (aid >= bp.author_map.size()) {
-                       errorList.push_back(ErrorItem(_("Change tracking error"),
-                                           bformat(_("Unknown author index for insertion: %1$d\n"), aid),
-                                           par.id(), 0, par.size()));
-                       change = Change(Change::UNCHANGED);
-               } else
-                       change = Change(Change::INSERTED, bp.author_map[aid], ct);
-       } else if (token == "\\change_deleted") {
+       } else if (token == "\\change_inserted" || token == "\\change_deleted") {
                lex.eatLine();
                istringstream is(lex.getString());
                unsigned int aid;
                time_t ct;
                is >> aid >> ct;
-               if (aid >= bp.author_map.size()) {
+               map<unsigned int, int> const & am = bp.author_map;
+               if (am.find(aid) == am.end()) {
                        errorList.push_back(ErrorItem(_("Change tracking error"),
-                                           bformat(_("Unknown author index for deletion: %1$d\n"), aid),
+                                           bformat(_("Unknown author index for change: %1$d\n"), aid),
                                            par.id(), 0, par.size()));
                        change = Change(Change::UNCHANGED);
-               } else
-                       change = Change(Change::DELETED, bp.author_map[aid], ct);
+               } else {
+                       if (token == "\\change_inserted")
+                               change = Change(Change::INSERTED, am.find(aid)->second, ct);
+                       else
+                               change = Change(Change::DELETED, am.find(aid)->second, ct);
+               }
        } else {
                lex.eatLine();
                errorList.push_back(ErrorItem(_("Unknown token"),
@@ -246,7 +251,7 @@ void readParToken(Buffer const & buf, Paragraph & par, Lexer & lex,
 }
 
 
-void readParagraph(Buffer const & buf, Paragraph & par, Lexer & lex,
+void Text::readParagraph(Paragraph & par, Lexer & lex,
        ErrorList & errorList)
 {
        lex.nextToken();
@@ -255,7 +260,7 @@ void readParagraph(Buffer const & buf, Paragraph & par, Lexer & lex,
        Change change(Change::UNCHANGED);
 
        while (lex.isOK()) {
-               readParToken(buf, par, lex, token, font, change, errorList);
+               readParToken(par, lex, token, font, change, errorList);
 
                lex.nextToken();
                token = lex.getString();
@@ -287,8 +292,6 @@ void readParagraph(Buffer const & buf, Paragraph & par, Lexer & lex,
 }
 
 
-} // namespace anon
-
 class TextCompletionList : public CompletionList
 {
 public:
@@ -328,10 +331,10 @@ bool Text::empty() const
 }
 
 
-double Text::spacing(Buffer const & buffer, Paragraph const & par) const
+double Text::spacing(Paragraph const & par) const
 {
        if (par.params().spacing().isDefault())
-               return buffer.params().spacing().getValue();
+               return owner_->buffer().params().spacing().getValue();
        return par.params().spacing().getValue();
 }
 
@@ -453,12 +456,12 @@ void Text::insertChar(Cursor & cur, char_type c)
                                     || par.isSeparator(cur.pos() - 2)
                                     || par.isNewline(cur.pos() - 2))
                                  ) {
-                                       setCharFont(buffer, pit, cur.pos() - 1, cur.current_font,
+                                       setCharFont(pit, cur.pos() - 1, cur.current_font,
                                                tm.font_);
                                } else if (contains(number_seperators, c)
                                     && cur.pos() >= 2
                                     && tm.displayFont(pit, cur.pos() - 2).fontInfo().number() == FONT_ON) {
-                                       setCharFont(buffer, pit, cur.pos() - 1, cur.current_font,
+                                       setCharFont(pit, cur.pos() - 1, cur.current_font,
                                                tm.font_);
                                }
                        }
@@ -545,7 +548,8 @@ void Text::insertChar(Cursor & cur, char_type c)
        cur.checkBufferStructure();
 
 //             cur.updateFlags(Update::Force);
-       setCursor(cur.top(), cur.pit(), cur.pos() + 1);
+       bool boundary = tm.isRTLBoundary(cur.pit(), cur.pos() + 1);
+       setCursor(cur, cur.pit(), cur.pos() + 1, false, boundary);
        charInserted(cur);
 }
 
@@ -566,8 +570,8 @@ void Text::charInserted(Cursor & cur)
 
        // register word if a non-letter was entered
        if (cur.pos() > 1
-           && par.isLetter(cur.pos() - 2)
-           && !par.isLetter(cur.pos() - 1)) {
+           && !par.isWordSeparator(cur.pos() - 2)
+           && par.isWordSeparator(cur.pos() - 1)) {
                // get the word in front of cursor
                LASSERT(this == cur.text(), /**/);
                cur.paragraph().updateWords();
@@ -601,14 +605,14 @@ bool Text::cursorForwardOneWord(Cursor & cur)
                         ++pos;
 
                // Skip over either a non-char inset or a full word
-               if (pos != lastpos && !par.isLetter(pos))
+               if (pos != lastpos && par.isWordSeparator(pos))
                        ++pos;
-               else while (pos != lastpos && par.isLetter(pos))
+               else while (pos != lastpos && !par.isWordSeparator(pos))
                             ++pos;
        } else {
                LASSERT(pos < lastpos, /**/); // see above
-               if (par.isLetter(pos))
-                       while (pos != lastpos && par.isLetter(pos))
+               if (!par.isWordSeparator(pos))
+                       while (pos != lastpos && !par.isWordSeparator(pos))
                                ++pos;
                else if (par.isChar(pos))
                        while (pos != lastpos && par.isChar(pos))
@@ -643,17 +647,17 @@ bool Text::cursorBackwardOneWord(Cursor & cur)
                        --pos;
 
                // Skip over either a non-char inset or a full word
-               if (pos != 0 && !par.isLetter(pos - 1) && !par.isChar(pos - 1))
+               if (pos != 0 && par.isWordSeparator(pos - 1) && !par.isChar(pos - 1))
                        --pos;
-               else while (pos != 0 && par.isLetter(pos - 1))
+               else while (pos != 0 && !par.isWordSeparator(pos - 1))
                             --pos;
        } else {
                // Skip over white space
                while (pos != 0 && par.isSpace(pos - 1))
                             --pos;
 
-               if (pos != 0 && par.isLetter(pos - 1))
-                       while (pos != 0 && par.isLetter(pos - 1))
+               if (pos != 0 && !par.isWordSeparator(pos - 1))
+                       while (pos != 0 && !par.isWordSeparator(pos - 1))
                                --pos;
                else if (pos != 0 && par.isChar(pos - 1))
                        while (pos != 0 && par.isChar(pos - 1))
@@ -681,9 +685,9 @@ bool Text::cursorVisLeftOneWord(Cursor & cur)
                // collect some information about current cursor position
                temp_cur.getSurroundingPos(left_pos, right_pos);
                left_is_letter = 
-                       (left_pos > -1 ? temp_cur.paragraph().isLetter(left_pos) : false);
+                       (left_pos > -1 ? !temp_cur.paragraph().isWordSeparator(left_pos) : false);
                right_is_letter = 
-                       (right_pos > -1 ? temp_cur.paragraph().isLetter(right_pos) : false);
+                       (right_pos > -1 ? !temp_cur.paragraph().isWordSeparator(right_pos) : false);
 
                // if we're not at a letter/non-letter boundary, continue moving
                if (left_is_letter == right_is_letter)
@@ -718,9 +722,9 @@ bool Text::cursorVisRightOneWord(Cursor & cur)
                // collect some information about current cursor position
                temp_cur.getSurroundingPos(left_pos, right_pos);
                left_is_letter = 
-                       (left_pos > -1 ? temp_cur.paragraph().isLetter(left_pos) : false);
+                       (left_pos > -1 ? !temp_cur.paragraph().isWordSeparator(left_pos) : false);
                right_is_letter = 
-                       (right_pos > -1 ? temp_cur.paragraph().isLetter(right_pos) : false);
+                       (right_pos > -1 ? !temp_cur.paragraph().isWordSeparator(right_pos) : false);
 
                // if we're not at a letter/non-letter boundary, continue moving
                if (left_is_letter == right_is_letter)
@@ -794,8 +798,8 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
        LASSERT(this == cur.text(), /**/);
 
        if (!cur.selection()) {
-               Change const & change = cur.paragraph().lookupChange(cur.pos());
-               if (!(change.changed() && findNextChange(&cur.bv())))
+               bool const changed = cur.paragraph().isChanged(cur.pos());
+               if (!(changed && findNextChange(&cur.bv())))
                        return;
        }
 
@@ -832,9 +836,9 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
                pos_type right = (pit == endPit ? endPos : parSize);
 
                if (op == ACCEPT) {
-                       pars_[pit].acceptChanges(cur.buffer()->params(), left, right);
+                       pars_[pit].acceptChanges(left, right);
                } else {
-                       pars_[pit].rejectChanges(cur.buffer()->params(), left, right);
+                       pars_[pit].rejectChanges(left, right);
                }
        }
 
@@ -896,22 +900,24 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
 }
 
 
-void Text::acceptChanges(BufferParams const & bparams)
+void Text::acceptChanges()
 {
+       BufferParams const & bparams = owner_->buffer().params();
        lyx::acceptChanges(pars_, bparams);
        deleteEmptyParagraphMechanism(0, pars_.size() - 1, bparams.trackChanges);
 }
 
 
-void Text::rejectChanges(BufferParams const & bparams)
+void Text::rejectChanges()
 {
+       BufferParams const & bparams = owner_->buffer().params();
        pit_type pars_size = static_cast<pit_type>(pars_.size());
 
        // first, reject changes within each individual paragraph
        // (do not consider end-of-par)
        for (pit_type pit = 0; pit < pars_size; ++pit) {
                if (!pars_[pit].empty())   // prevent assertion failure
-                       pars_[pit].rejectChanges(bparams, 0, pars_[pit].size());
+                       pars_[pit].rejectChanges(0, pars_[pit].size());
        }
 
        // next, reject imaginary end-of-par characters
@@ -1207,7 +1213,7 @@ bool Text::dissolveInset(Cursor & cur)
 {
        LASSERT(this == cur.text(), return false);
 
-       if (isMainText(cur.bv().buffer()) || cur.inset().nargs() != 1)
+       if (isMainText() || cur.inset().nargs() != 1)
                return false;
 
        cur.recordUndoInset();
@@ -1240,7 +1246,10 @@ bool Text::dissolveInset(Cursor & cur)
                // restore position
                cur.pit() = min(cur.lastpit(), spit);
                cur.pos() = min(cur.lastpos(), spos);
-       }
+       } else
+               // this is the least that needs to be done (bug 6003)
+               // in the above case, pasteParagraphList handles this
+               cur.buffer()->updateLabels();
        cur.clearSelection();
        cur.resetAnchor();
        return true;
@@ -1255,8 +1264,9 @@ void Text::getWord(CursorSlice & from, CursorSlice & to,
 }
 
 
-void Text::write(Buffer const & buf, ostream & os) const
+void Text::write(ostream & os) const
 {
+       Buffer const & buf = owner_->buffer();
        ParagraphList::const_iterator pit = paragraphs().begin();
        ParagraphList::const_iterator end = paragraphs().end();
        depth_type dth = 0;
@@ -1269,9 +1279,10 @@ void Text::write(Buffer const & buf, ostream & os) const
 }
 
 
-bool Text::read(Buffer const & buf, Lexer & lex, 
+bool Text::read(Lexer & lex, 
                ErrorList & errorList, InsetText * insetPtr)
 {
+       Buffer const & buf = owner_->buffer();
        depth_type depth = 0;
        bool res = true;
 
@@ -1304,10 +1315,7 @@ bool Text::read(Buffer const & buf, Lexer & lex,
                        par.params().depth(depth);
                        par.setFont(0, Font(inherit_font, buf.params().language));
                        pars_.push_back(par);
-
-                       // FIXME: goddamn InsetTabular makes us pass a Buffer
-                       // not BufferParams
-                       lyx::readParagraph(buf, pars_.back(), lex, errorList);
+                       readParagraph(pars_.back(), lex, errorList);
 
                        // register the words in the global word list
                        CursorSlice sl = CursorSlice(*insetPtr);
@@ -1352,7 +1360,7 @@ docstring Text::currentState(Cursor const & cur) const
 
        Change change = par.lookupChange(cur.pos());
 
-       if (change.type != Change::UNCHANGED) {
+       if (change.changed()) {
                Author const & a = buf.params().authors().get(change.author);
                os << _("Change: ") << a.name();
                if (!a.email().empty())
@@ -1603,8 +1611,8 @@ bool Text::completionSupported(Cursor const & cur) const
 {
        Paragraph const & par = cur.paragraph();
        return cur.pos() > 0
-               && (cur.pos() >= par.size() || !par.isLetter(cur.pos()))
-               && par.isLetter(cur.pos() - 1);
+               && (cur.pos() >= par.size() || par.isWordSeparator(cur.pos()))
+               && !par.isWordSeparator(cur.pos() - 1);
 }