]> git.lyx.org Git - lyx.git/blobdiff - src/Text2.cpp
Keep dialog connected to cross-ref inset after Apply.
[lyx.git] / src / Text2.cpp
index e4c0c2614edcbf79b3d4076becae0f5d0f80b81b..7e30ecd7d01e98b321684a17b8d6c9b74bb282bf 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) {
@@ -182,10 +170,16 @@ 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));
        }
+
+       deleteEmptyParagraphMechanism(start, end - 1, bp.track_changes);
 }
 
 
@@ -198,6 +192,7 @@ void Text::setLayout(Cursor & cur, docstring const & layout)
        pit_type end = cur.selEnd().pit() + 1;
        cur.recordUndoSelection();
        setLayout(start, end, layout);
+       cur.fixIfBroken();
        cur.setCurrentFont();
        cur.forceBufferUpdate();
 }
@@ -215,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)
@@ -235,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();
@@ -480,7 +475,7 @@ void Text::setLabelWidthStringToSequence(Cursor const & cur,
 }
 
 
-void Text::setParagraphs(Cursor & cur, docstring arg, bool merge)
+void Text::setParagraphs(Cursor const & cur, docstring const & arg, bool merge)
 {
        LBUFERR(cur.text());
 
@@ -508,7 +503,7 @@ void Text::setParagraphs(Cursor & cur, docstring arg, bool merge)
 }
 
 
-void Text::setParagraphs(Cursor & cur, ParagraphParameters const & p)
+void Text::setParagraphs(Cursor const & cur, ParagraphParameters const & p)
 {
        LBUFERR(cur.text());
 
@@ -600,7 +595,7 @@ bool Text::checkAndActivateInsetVisual(Cursor & cur, bool movingForward, bool mo
        if (cur.pos() == cur.lastpos())
                return false;
        Paragraph & par = cur.paragraph();
-       Inset * inset = par.isInset(cur.pos()) ? par.getInset(cur.pos()) : 0;
+       Inset * inset = par.isInset(cur.pos()) ? par.getInset(cur.pos()) : nullptr;
        if (!inset || !inset->editable())
                return false;
        if (cur.selection() && cur.realAnchor().find(inset) == -1)
@@ -818,6 +813,7 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
 
        Paragraph & oldpar = old.paragraph();
        bool const trackChanges = cur.buffer()->params().track_changes;
+       bool result = false;
 
        // We do nothing if cursor did not move
        if (cur.top() == old.top())
@@ -831,15 +827,10 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
        if (oldpar.isFreeSpacing())
                return false;
 
-       // Find a common inset and the corresponding depth.
-       size_t depth = 0;
-       for (; depth < cur.depth(); ++depth)
-               if (&old.inset() == &cur[depth].inset())
-                       break;
-
        // Whether a common inset is found and whether the cursor is still in
        // the same paragraph (possibly nested).
-       bool const same_par = depth < cur.depth() && old.idx() == cur[depth].idx()
+       int const depth = cur.find(&old.inset());
+       bool const same_par = depth != -1 && old.idx() == cur[depth].idx()
                && old.pit() == cur[depth].pit();
 
        /*
@@ -847,8 +838,7 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
         * them, but only if the cursor has really moved.
         */
 
-       /* Ok I'll put some comments here about what is missing.
-          There are still some small problems that can lead to
+       /* There are still some small problems that can lead to
           double spaces stored in the document file or space at
           the beginning of paragraphs(). This happens if you have
           the cursor between two spaces and then save. Or if you
@@ -856,14 +846,6 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
           beginning and then save right after the paste. (Lgb)
        */
 
-       // If old.pos() == 0 and old.pos()(1) == LineSeparator
-       // delete the LineSeparator.
-       // MISSING
-
-       // If old.pos() == 1 and old.pos()(0) == LineSeparator
-       // delete the LineSeparator.
-       // MISSING
-
        // find range of spaces around cursors
        pos_type from = old.pos();
        while (from > 0
@@ -899,7 +881,7 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
                                cur[depth].pos() = min(from + 1, old.lastpos());
                        need_anchor_change = true;
                }
-               return true;
+               result = true;
        }
 
        /*
@@ -908,52 +890,46 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
 
        // only do our other magic if we changed paragraph
        if (same_par)
-               return false;
+               return result;
+
+       // only do our magic if the paragraph is empty
+       if (!oldpar.empty())
+               return result;
 
        // don't delete anything if this is the ONLY paragraph!
        if (old.lastpit() == 0)
-               return false;
+               return result;
 
        // Do not delete empty paragraphs with keepempty set.
        if (oldpar.allowEmpty())
-               return false;
-
-       if (oldpar.empty() || (oldpar.size() == 1 && oldpar.isLineSeparator(0))) {
-               // Delete old par.
-               old.recordUndo(max(old.pit() - 1, pit_type(0)),
-                              min(old.pit() + 1, old.lastpit()));
-               ParagraphList & plist = old.text()->paragraphs();
-               bool const soa = oldpar.params().startOfAppendix();
-               plist.erase(lyx::next(plist.begin(), old.pit()));
-               // do not lose start of appendix marker (bug 4212)
-               if (soa && old.pit() < pit_type(plist.size()))
-                       plist[old.pit()].params().startOfAppendix(true);
-
-               // see #warning (FIXME?) above
-               if (cur.depth() >= old.depth()) {
-                       CursorSlice & curslice = cur[old.depth() - 1];
-                       if (&curslice.inset() == &old.inset()
-                           && curslice.pit() > old.pit()) {
-                               --curslice.pit();
-                               // since a paragraph has been deleted, all the
-                               // insets after `old' have been copied and
-                               // their address has changed. Therefore we
-                               // need to `regenerate' cur. (JMarc)
-                               cur.updateInsets(&(cur.bottom().inset()));
-                               need_anchor_change = true;
-                       }
+               return result;
+
+       // Delete old par.
+       old.recordUndo(max(old.pit() - 1, pit_type(0)),
+                      min(old.pit() + 1, old.lastpit()));
+       ParagraphList & plist = old.text()->paragraphs();
+       bool const soa = oldpar.params().startOfAppendix();
+       plist.erase(plist.iterator_at(old.pit()));
+       // do not lose start of appendix marker (bug 4212)
+       if (soa && old.pit() < pit_type(plist.size()))
+               plist[old.pit()].params().startOfAppendix(true);
+
+       // see #warning (FIXME?) above
+       if (cur.depth() >= old.depth()) {
+               CursorSlice & curslice = cur[old.depth() - 1];
+               if (&curslice.inset() == &old.inset()
+                   && curslice.pit() > old.pit()) {
+                       --curslice.pit();
+                       // since a paragraph has been deleted, all the
+                       // insets after `old' have been copied and
+                       // their address has changed. Therefore we
+                       // need to `regenerate' cur. (JMarc)
+                       cur.updateInsets(&(cur.bottom().inset()));
+                       need_anchor_change = true;
                }
-               return true;
-       }
-
-       if (oldpar.stripLeadingSpaces(trackChanges)) {
-               need_anchor_change = true;
-               // We return true here because the Paragraph contents changed and
-               // we need a redraw before further action is processed.
-               return true;
        }
 
-       return false;
+       return true;
 }
 
 
@@ -1005,13 +981,11 @@ void Text::deleteEmptyParagraphMechanism(pit_type first, pit_type last, bool tra
                        continue;
 
                if (par.empty() || (par.size() == 1 && par.isLineSeparator(0))) {
-                       pars_.erase(lyx::next(pars_.begin(), pit));
+                       pars_.erase(pars_.iterator_at(pit));
                        --pit;
                        --last;
                        continue;
                }
-
-               par.stripLeadingSpaces(trackChanges);
        }
 }