X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText2.cpp;h=66dd083d4ad6896f86152e535237609b204adb79;hb=bca1b63d89e27b31b089ab48c63368640084b3a6;hp=2d1ca0ec4ee0dc6f6a57368e0fd611f22ac2b881;hpb=fc5b22a2f1009538abbfb335f2afe97ef16e433a;p=lyx.git diff --git a/src/Text2.cpp b/src/Text2.cpp index 2d1ca0ec4e..66dd083d4a 100644 --- a/src/Text2.cpp +++ b/src/Text2.cpp @@ -23,34 +23,22 @@ #include "Text.h" #include "Buffer.h" -#include "buffer_funcs.h" -#include "BufferList.h" #include "BufferParams.h" #include "BufferView.h" #include "Changes.h" #include "Cursor.h" -#include "CutAndPaste.h" -#include "DispatchResult.h" -#include "ErrorList.h" #include "Language.h" #include "Layout.h" -#include "Lexer.h" -#include "LyX.h" #include "LyXRC.h" #include "Paragraph.h" #include "ParagraphParameters.h" #include "TextClass.h" #include "TextMetrics.h" -#include "insets/InsetCollapsible.h" - -#include "mathed/InsetMathHull.h" +#include "insets/InsetText.h" #include "support/lassert.h" -#include "support/debug.h" #include "support/gettext.h" -#include "support/lyxalgo.h" -#include "support/textutils.h" #include @@ -157,7 +145,7 @@ void Text::setInsetFont(BufferView const & bv, pit_type pit, Inset * const inset = pars_[pit].getInset(pos); LASSERT(inset && inset->resetFontEdit(), return); - CursorSlice::idx_type endidx = inset->nargs(); + idx_type endidx = inset->nargs(); for (CursorSlice cs(*inset); cs.idx() != endidx; ++cs.idx()) { Text * text = cs.text(); if (text) { @@ -182,7 +170,11 @@ void Text::setLayout(pit_type start, pit_type end, for (pit_type pit = start; pit != end; ++pit) { Paragraph & par = pars_[pit]; - par.applyLayout(lyxlayout); + // Is this a separating paragraph? If so, + // this needs to be standard layout + bool const is_separator = par.size() == 1 + && par.isEnvSeparator(0); + par.applyLayout(is_separator ? bp.documentClass().defaultLayout() : lyxlayout); if (lyxlayout.margintype == MARGIN_MANUAL) par.setLabelWidthString(par.expandLabel(lyxlayout, bp)); } @@ -218,7 +210,7 @@ static bool changeDepthAllowed(Text::DEPTH_CHANGE type, } -bool Text::changeDepthAllowed(Cursor & cur, DEPTH_CHANGE type) const +bool Text::changeDepthAllowed(Cursor const & cur, DEPTH_CHANGE type) const { LBUFERR(this == cur.text()); // this happens when selecting several cells in tabular (bug 2630) @@ -238,7 +230,7 @@ bool Text::changeDepthAllowed(Cursor & cur, DEPTH_CHANGE type) const } -void Text::changeDepth(Cursor & cur, DEPTH_CHANGE type) +void Text::changeDepth(Cursor const & cur, DEPTH_CHANGE type) { LBUFERR(this == cur.text()); pit_type const beg = cur.selBegin().pit(); @@ -483,7 +475,7 @@ void Text::setLabelWidthStringToSequence(Cursor const & cur, } -void Text::setParagraphs(Cursor & cur, docstring const & arg, bool merge) +void Text::setParagraphs(Cursor const & cur, docstring const & arg, bool merge) { LBUFERR(cur.text()); @@ -511,7 +503,7 @@ void Text::setParagraphs(Cursor & cur, docstring const & arg, bool merge) } -void Text::setParagraphs(Cursor & cur, ParagraphParameters const & p) +void Text::setParagraphs(Cursor const & cur, ParagraphParameters const & p) { LBUFERR(cur.text()); @@ -831,10 +823,6 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur, if (cur.buffer()->isReadonly()) return false; - // We allow all kinds of "mumbo-jumbo" when freespacing. - if (oldpar.isFreeSpacing()) - return false; - // Whether a common inset is found and whether the cursor is still in // the same paragraph (possibly nested). int const depth = cur.find(&old.inset()); @@ -842,8 +830,9 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur, && old.pit() == cur[depth].pit(); /* - * (1) If the chars around the old cursor were spaces, delete some of - * them, but only if the cursor has really moved. + * (1) If the chars around the old cursor were spaces and the + * paragraph is not in free spacing mode, delete some of them, but + * only if the cursor has really moved. */ /* There are still some small problems that can lead to @@ -853,43 +842,44 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur, cut and paste and the selection has a space at the beginning and then save right after the paste. (Lgb) */ + if (!oldpar.isFreeSpacing()) { + // find range of spaces around cursors + pos_type from = old.pos(); + while (from > 0 + && oldpar.isLineSeparator(from - 1) + && !oldpar.isDeleted(from - 1)) + --from; + pos_type to = old.pos(); + while (to < old.lastpos() + && oldpar.isLineSeparator(to) + && !oldpar.isDeleted(to)) + ++to; + + int num_spaces = to - from; + // If we are not at the start of the paragraph, keep one space + if (from != to && from > 0) + --num_spaces; - // find range of spaces around cursors - pos_type from = old.pos(); - while (from > 0 - && oldpar.isLineSeparator(from - 1) - && !oldpar.isDeleted(from - 1)) - --from; - pos_type to = old.pos(); - while (to < old.lastpos() - && oldpar.isLineSeparator(to) - && !oldpar.isDeleted(to)) - ++to; - - int num_spaces = to - from; - // If we are not at the start of the paragraph, keep one space - if (from != to && from > 0) - --num_spaces; - - // If cursor is inside range, keep one additional space - if (same_par && cur.pos() > from && cur.pos() < to) - --num_spaces; - - // Remove spaces and adapt cursor. - if (num_spaces > 0) { - old.recordUndo(); - int const deleted = - deleteSpaces(oldpar, from, to, num_spaces, trackChanges); - // correct cur position - // FIXME: there can be other cursors pointing there, we should update them - if (same_par) { - if (cur[depth].pos() >= to) - cur[depth].pos() -= deleted; - else if (cur[depth].pos() > from) - cur[depth].pos() = min(from + 1, old.lastpos()); - need_anchor_change = true; + // If cursor is inside range, keep one additional space + if (same_par && cur.pos() > from && cur.pos() < to) + --num_spaces; + + // Remove spaces and adapt cursor. + if (num_spaces > 0) { + old.recordUndo(); + int const deleted = + deleteSpaces(oldpar, from, to, num_spaces, trackChanges); + // correct cur position + // FIXME: there can be other cursors pointing there, we should update them + if (same_par) { + if (cur[depth].pos() >= to) + cur[depth].pos() -= deleted; + else if (cur[depth].pos() > from) + cur[depth].pos() = min(from + 1, old.lastpos()); + need_anchor_change = true; + } + result = true; } - result = true; } /* @@ -926,6 +916,7 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur, if (cur.depth() >= old.depth()) { CursorSlice & curslice = cur[old.depth() - 1]; if (&curslice.inset() == &old.inset() + && curslice.idx() == old.idx() && curslice.pit() > old.pit()) { --curslice.pit(); // since a paragraph has been deleted, all the @@ -942,42 +933,57 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur, void Text::deleteEmptyParagraphMechanism(pit_type first, pit_type last, bool trackChanges) +{ + pos_type last_pos = pars_[last].size() - 1; + deleteEmptyParagraphMechanism(first, last, 0, last_pos, trackChanges); +} + + +void Text::deleteEmptyParagraphMechanism(pit_type first, pit_type last, + pos_type first_pos, pos_type last_pos, + bool trackChanges) { LASSERT(first >= 0 && first <= last && last < (int) pars_.size(), return); for (pit_type pit = first; pit <= last; ++pit) { Paragraph & par = pars_[pit]; - // We allow all kinds of "mumbo-jumbo" when freespacing. - if (par.isFreeSpacing()) - continue; - - pos_type from = 0; - while (from < par.size()) { - // skip non-spaces - while (from < par.size() - && (!par.isLineSeparator(from) || par.isDeleted(from))) - ++from; - // find string of spaces - pos_type to = from; - while (to < par.size() - && par.isLineSeparator(to) && !par.isDeleted(to)) - ++to; - // empty? We are done - if (from == to) - break; - - int num_spaces = to - from; - - // If we are not at the extremity of the paragraph, keep one space - if (from != to && from > 0 && to < par.size()) - --num_spaces; - - // Remove spaces if needed - int const deleted = deleteSpaces(par, from , to, num_spaces, trackChanges); - from = to - deleted; + /* + * (1) Delete consecutive spaces + */ + if (!par.isFreeSpacing()) { + pos_type from = (pit == first) ? first_pos : 0; + pos_type to_pos = (pit == last) ? last_pos + 1 : par.size(); + while (from < to_pos) { + // skip non-spaces + while (from < par.size() + && (!par.isLineSeparator(from) || par.isDeleted(from))) + ++from; + // find string of spaces + pos_type to = from; + while (to < par.size() + && par.isLineSeparator(to) && !par.isDeleted(to)) + ++to; + // empty? We are done + if (from == to) + break; + + int num_spaces = to - from; + + // If we are not at the extremity of the paragraph, keep one space + if (from != to && from > 0 && to < par.size()) + --num_spaces; + + // Remove spaces if needed + int const deleted = deleteSpaces(par, from , to, num_spaces, trackChanges); + from = to - deleted; + } } + /* + * (2) Delete empty pragraphs + */ + // don't delete anything if this is the only remaining paragraph // within the given range. Note: Text::acceptOrRejectChanges() // sets the cursor to 'first' after calling DEPM