X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText.cpp;h=cc404b2f1f56ac780073679b65b2b3cd407a298e;hb=f5fe3c17be0a66b32085585962877dfc2dae9140;hp=00b575b07a70174413c2385c899048450e4e30f8;hpb=86c33c96a0dd026148f79b7da96fee5a0bb705bc;p=lyx.git diff --git a/src/Text.cpp b/src/Text.cpp index 00b575b07a..cc404b2f1f 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -240,6 +240,21 @@ bool Text::isFirstInSequence(pit_type par_offset) const } +pit_type Text::lastInSequence(pit_type pit) const +{ + depth_type const depth = pars_[pit].getDepth(); + pit_type newpit = pit; + + while (size_t(newpit + 1) < pars_.size() && + (pars_[newpit + 1].getDepth() > depth || + (pars_[newpit + 1].getDepth() == depth && + pars_[newpit + 1].layout() == pars_[pit].layout()))) + ++newpit; + + return newpit; +} + + int Text::getTocLevel(pit_type par_offset) const { Paragraph const & par = pars_[par_offset]; @@ -376,8 +391,8 @@ void Text::readParToken(Paragraph & par, Lexer & lex, if (added_one) { // Warn the user. docstring const s = bformat(_("Layout `%1$s' was not found."), layoutname); - errorList.push_back( - ErrorItem(_("Layout Not Found"), s, par.id(), 0, par.size())); + errorList.push_back(ErrorItem(_("Layout Not Found"), s, + {par.id(), 0}, {par.id(), -1})); } par.setLayout(bp.documentClass()[layoutname]); @@ -403,7 +418,7 @@ void Text::readParToken(Paragraph & par, Lexer & lex, lex.eatLine(); docstring line = lex.getDocString(); errorList.push_back(ErrorItem(_("Unknown Inset"), line, - par.id(), 0, par.size())); + {par.id(), 0}, {par.id(), -1})); } } else if (token == "\\family") { lex.next(); @@ -520,8 +535,7 @@ void Text::readParToken(Paragraph & par, Lexer & lex, "missing until the corresponding tracked changes " "are merged or this user edits the file again.\n"), aid), - par.id(), par.size(), par.size() + 1 - )); + {par.id(), par.size()}, {par.id(), par.size() + 1})); bp.addAuthor(Author(aid)); } if (token == "\\change_inserted") @@ -531,9 +545,10 @@ void Text::readParToken(Paragraph & par, Lexer & lex, } else { lex.eatLine(); errorList.push_back(ErrorItem(_("Unknown token"), - bformat(_("Unknown token: %1$s %2$s\n"), from_utf8(token), - lex.getDocString()), - par.id(), 0, par.size())); + bformat(_("Unknown token: %1$s %2$s\n"), + from_utf8(token), + lex.getDocString()), + {par.id(), 0}, {par.id(), -1})); } } @@ -586,7 +601,7 @@ class TextCompletionList : public CompletionList { public: /// - TextCompletionList(Cursor const & cur, WordList const * list) + TextCompletionList(Cursor const & cur, WordList const & list) : buffer_(cur.buffer()), list_(list) {} /// @@ -597,19 +612,19 @@ public: /// virtual size_t size() const { - return list_->size(); + return list_.size(); } /// virtual docstring const & data(size_t idx) const { - return list_->word(idx); + return list_.word(idx); } private: /// Buffer const * buffer_; /// - WordList const * list_; + WordList const & list_; }; @@ -738,12 +753,17 @@ void Text::breakParagraph(Cursor & cur, bool inverse_logic) Layout const & layout = cpar.layout(); if (cur.lastpos() == 0 && !cpar.allowEmpty()) { - if (changeDepthAllowed(cur, DEC_DEPTH)) + if (changeDepthAllowed(cur, DEC_DEPTH)) { changeDepth(cur, DEC_DEPTH); - else { + pit_type const prev = depthHook(cpit, cpar.getDepth()); + docstring const & lay = pars_[prev].layout().name(); + if (lay != layout.name()) + setLayout(cur, lay); + } else { docstring const & lay = cur.paragraph().usePlainLayout() ? tclass.plainLayoutName() : tclass.defaultLayoutName(); - setLayout(cur, lay); + if (lay != layout.name()) + setLayout(cur, lay); } return; } @@ -1037,11 +1057,6 @@ void Text::insertChar(Cursor & cur, char_type c) par.eraseChar(pos - 1, cur.buffer()->params().track_changes); c = 0x2014; pos--; - } else if (par.getChar(pos - 1) == 0x2014) { - // convert "----" to "-" - par.eraseChar(pos - 1, cur.buffer()->params().track_changes); - c = '-'; - pos--; } } @@ -1446,7 +1461,7 @@ void Text::rejectChanges() } -void Text::deleteWordForward(Cursor & cur) +void Text::deleteWordForward(Cursor & cur, bool const force) { LBUFERR(this == cur.text()); if (cur.lastpos() == 0) @@ -1456,13 +1471,15 @@ void Text::deleteWordForward(Cursor & cur) cur.selection(true); cursorForwardOneWord(cur); cur.setSelection(); - cutSelection(cur, true, false); - cur.checkBufferStructure(); + if (force || !cur.confirmDeletion()) { + cutSelection(cur, true, false); + cur.checkBufferStructure(); + } } } -void Text::deleteWordBackward(Cursor & cur) +void Text::deleteWordBackward(Cursor & cur, bool const force) { LBUFERR(this == cur.text()); if (cur.lastpos() == 0) @@ -1472,8 +1489,10 @@ void Text::deleteWordBackward(Cursor & cur) cur.selection(true); cursorBackwardOneWord(cur); cur.setSelection(); - cutSelection(cur, true, false); - cur.checkBufferStructure(); + if (force || !cur.confirmDeletion()) { + cutSelection(cur, true, false); + cur.checkBufferStructure(); + } } } @@ -2037,20 +2056,36 @@ docstring Text::asString(pit_type beg, pit_type end, int options) const void Text::shortenForOutliner(docstring & str, size_t const maxlen) { support::truncateWithEllipsis(str, maxlen); - docstring::iterator it = str.begin(); - docstring::iterator end = str.end(); - for (; it != end; ++it) - if ((*it) == L'\n' || (*it) == L'\t') - (*it) = L' '; + for (char_type & c : str) + if (c == L'\n' || c == L'\t') + c = L' '; } void Text::forOutliner(docstring & os, size_t const maxlen, - bool const shorten) const + bool const shorten) const +{ + pit_type end = pars_.size() - 1; + if (0 <= end && !pars_[0].labelString().empty()) + os += pars_[0].labelString() + ' '; + forOutliner(os, maxlen, 0, end, shorten); +} + + +void Text::forOutliner(docstring & os, size_t const maxlen, + pit_type pit_start, pit_type pit_end, + bool const shorten) const { size_t tmplen = shorten ? maxlen + 1 : maxlen; - for (size_t i = 0; i != pars_.size() && os.length() < tmplen; ++i) - pars_[i].forOutliner(os, tmplen, false); + pit_type end = min(size_t(pit_end), pars_.size() - 1); + bool first = true; + for (pit_type i = pit_start; i <= end && os.length() < tmplen; ++i) { + if (!first) + os += ' '; + // This function lets the first label be treated separately + pars_[i].forOutliner(os, tmplen, false, !first); + first = false; + } if (shorten) shortenForOutliner(os, maxlen); } @@ -2151,7 +2186,7 @@ bool Text::completionSupported(Cursor const & cur) const CompletionList const * Text::createCompletionList(Cursor const & cur) const { - WordList const * list = theWordList(cur.getFont().language()->lang()); + WordList const & list = theWordList(cur.getFont().language()->lang()); return new TextCompletionList(cur, list); }