]> git.lyx.org Git - lyx.git/blobdiff - src/Text2.cpp
Update toolbar and properly reset focus when find widget is closed (#12396)
[lyx.git] / src / Text2.cpp
index ed4b133ff53f4fc34fe994bf16264615979815e0..66dd083d4ad6896f86152e535237609b204adb79 100644 (file)
 #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 <sstream>
 
@@ -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) {
@@ -222,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)
@@ -242,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();
@@ -487,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());
 
@@ -515,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());
 
@@ -835,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());
@@ -846,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
@@ -857,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;
        }
 
        /*
@@ -930,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
@@ -946,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