]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
remove indirection from LyXView::viewStatusMessage().
[lyx.git] / src / Text3.cpp
index 743538db40c35644aae0267552b01b088a9ffa71..7963262a159b37c51349e82e9853c5c1e9025f85 100644 (file)
@@ -41,7 +41,6 @@
 #include "Lexer.h"
 #include "LyXRC.h"
 #include "Paragraph.h"
-#include "paragraph_funcs.h"
 #include "ParagraphParameters.h"
 #include "TextClass.h"
 #include "TextMetrics.h"
 
 #include "frontends/Application.h"
 #include "frontends/Clipboard.h"
-#include "frontends/LyXView.h"
 #include "frontends/Selection.h"
-#include "frontends/WorkArea.h"
 
 #include "insets/InsetCollapsable.h"
 #include "insets/InsetCommand.h"
 #include "insets/InsetExternal.h"
+#include "insets/InsetFloat.h"
 #include "insets/InsetFloatList.h"
 #include "insets/InsetGraphics.h"
 #include "insets/InsetGraphicsParams.h"
@@ -63,6 +61,7 @@
 #include "insets/InsetQuotes.h"
 #include "insets/InsetSpecialChar.h"
 #include "insets/InsetText.h"
+#include "insets/InsetWrap.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
@@ -203,13 +202,14 @@ void regexpDispatch(Cursor & cur, FuncRequest const & cmd)
                return;
        }
        cur.recordUndo();
-       docstring const save_selection = grabAndEraseSelection(cur);
-       selClearOrDel(cur);
-       // replaceSelection(cur);
+       docstring sel = cur.selectionAsString(false);
+
+       // It may happen that sel is empty but there is a selection
+       replaceSelection(cur);
 
        cur.insert(new InsetMathHull(hullRegexp));
        cur.nextInset()->edit(cur, true);
-       cur.niceInsert(save_selection);
+       cur.niceInsert(sel);
 
        cur.message(_("Regexp editor mode"));
 }
@@ -233,6 +233,9 @@ static bool doInsertInset(Cursor & cur, Text * text,
        if (!inset)
                return false;
 
+       if (InsetCollapsable * ci = inset->asInsetCollapsable())
+               ci->setButtonLabel();
+
        cur.recordUndo();
        if (cmd.action == LFUN_INDEX_INSERT) {
                docstring ds = subst(text->getStringToIndex(cur), '\n', ' ');
@@ -240,7 +243,7 @@ static bool doInsertInset(Cursor & cur, Text * text,
                if (edit)
                        inset->edit(cur, true);
                // Now put this into inset
-               cur.text()->insertStringAsLines(cur, ds);
+               cur.text()->insertStringAsLines(cur, ds, cur.current_font);
                cur.leaveInset(*inset);
                return true;
        }
@@ -384,10 +387,6 @@ static void outline(OutlineOp mode, Cursor & cur)
                        break;
        }
 
-       // Do we need to set insets' buffer_ members, because we copied
-       // some stuff? We'll assume we do and reset it otherwise.
-       bool set_buffers = true;
-
        switch (mode) {
                case OutlineUp: {
                        if (start == pars.begin())
@@ -411,10 +410,8 @@ static void outline(OutlineOp mode, Cursor & cur)
                        pit_type const len = distance(start, finish);
                        pit_type const deletepit = pit + len;
                        buf.undo().recordUndo(cur, ATOMIC_UNDO, newpit, deletepit - 1);
-                       pars.insert(dest, start, finish);
-                       start = boost::next(pars.begin(), deletepit);
-                       pit = newpit;
-                       pars.erase(start, finish);
+                       pars.splice(dest, start, finish);
+                       cur.pit() = newpit;
                        break;
                }
                case OutlineDown: {
@@ -432,12 +429,10 @@ static void outline(OutlineOp mode, Cursor & cur)
                        }
                        // One such was found:
                        pit_type newpit = distance(bgn, dest);
-                       pit_type const len = distance(start, finish);
                        buf.undo().recordUndo(cur, ATOMIC_UNDO, pit, newpit - 1);
-                       pars.insert(dest, start, finish);
-                       start = boost::next(bgn, pit);
-                       pit = newpit - len;
-                       pars.erase(start, finish);
+                       pit_type const len = distance(start, finish);
+                       pars.splice(dest, start, finish);
+                       cur.pit() = newpit - len;
                        break;
                }
                case OutlineIn: {
@@ -457,7 +452,6 @@ static void outline(OutlineOp mode, Cursor & cur)
                                        }
                                }
                        }
-                       set_buffers = false;
                        break;
                }
                case OutlineOut: {
@@ -477,20 +471,9 @@ static void outline(OutlineOp mode, Cursor & cur)
                                        }
                                }
                        }
-                       set_buffers = false;
                        break;
                }
        }
-       if (set_buffers)
-               // FIXME This only really needs doing for the newly introduced 
-               // paragraphs. Something like:
-               //      pit_type const numpars = distance(start, finish);
-               //      start = boost::next(bgn, pit);
-               //      finish = boost::next(start, numpars);
-               //      for (; start != finish; ++start)
-               //              start->setBuffer(buf);
-               // But while this seems to work, it is kind of fragile.
-               buf.inset().setBuffer(buf);
 }
 
 
@@ -502,8 +485,9 @@ void Text::number(Cursor & cur)
 }
 
 
-bool Text::isRTL(Buffer const & buffer, Paragraph const & par) const
+bool Text::isRTL(Paragraph const & par) const
 {
+       Buffer const & buffer = owner_->buffer();
        return par.isRTL(buffer.params());
 }
 
@@ -549,7 +533,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                pit_type const pit = cur.pit();
                recUndo(cur, pit, pit + 1);
                cur.finishUndo();
-               swap(pars_[pit], pars_[pit + 1]);
+               pars_.swap(pit, pit + 1);
                cur.buffer()->updateLabels();
                needsUpdate = true;
                ++cur.pit();
@@ -560,7 +544,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                pit_type const pit = cur.pit();
                recUndo(cur, pit - 1, pit);
                cur.finishUndo();
-               swap(pars_[pit], pars_[pit - 1]);
+               pars_.swap(pit, pit - 1);
                cur.buffer()->updateLabels();
                --cur.pit();
                needsUpdate = true;
@@ -638,7 +622,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_INSET_BEGIN:
        case LFUN_INSET_BEGIN_SELECT:
                needsUpdate |= cur.selHandle(cmd.action == LFUN_INSET_BEGIN_SELECT);
-               if (cur.depth() == 1 || cur.pos() > 0)
+               if (cur.depth() == 1 || !cur.top().at_begin())
                        needsUpdate |= cursorTop(cur);
                else
                        cur.undispatched();
@@ -648,13 +632,25 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_INSET_END:
        case LFUN_INSET_END_SELECT:
                needsUpdate |= cur.selHandle(cmd.action == LFUN_INSET_END_SELECT);
-               if (cur.depth() == 1 || cur.pos() < cur.lastpos())
+               if (cur.depth() == 1 || !cur.top().at_end())
                        needsUpdate |= cursorBottom(cur);
                else
                        cur.undispatched();
                cur.updateFlags(Update::FitCursor);
                break;
 
+       case LFUN_INSET_SELECT_ALL:
+               if (cur.depth() == 1 || !cur.selection() || !cur.selBegin().at_begin()
+                         || !cur.selEnd().at_end()) {
+                       needsUpdate |= cur.selHandle(false);
+                       needsUpdate |= cursorTop(cur);
+                       needsUpdate |= cur.selHandle(true);
+                       needsUpdate |= cursorBottom(cur);
+               } else 
+                       cur.undispatched();
+               cur.updateFlags(Update::FitCursor);
+               break;
+
        case LFUN_CHAR_FORWARD:
        case LFUN_CHAR_FORWARD_SELECT:
                //LYXERR0(" LFUN_CHAR_FORWARD[SEL]:\n" << cur);
@@ -1048,49 +1044,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                cur.resetAnchor();
                break;
 
-       // TODO
-       // With the creation of LFUN_PARAGRAPH_PARAMS, this is now redundant,
-       // as its duties can be performed there. Should it be removed??
-       // FIXME For now, it can just dispatch LFUN_PARAGRAPH_PARAMS...
-       case LFUN_PARAGRAPH_SPACING: {
-               Paragraph & par = cur.paragraph();
-               Spacing::Space cur_spacing = par.params().spacing().getSpace();
-               string cur_value = "1.0";
-               if (cur_spacing == Spacing::Other)
-                       cur_value = par.params().spacing().getValueAsString();
-
-               istringstream is(to_utf8(cmd.argument()));
-               string tmp;
-               is >> tmp;
-               Spacing::Space new_spacing = cur_spacing;
-               string new_value = cur_value;
-               if (tmp.empty()) {
-                       lyxerr << "Missing argument to `paragraph-spacing'"
-                              << endl;
-               } else if (tmp == "single") {
-                       new_spacing = Spacing::Single;
-               } else if (tmp == "onehalf") {
-                       new_spacing = Spacing::Onehalf;
-               } else if (tmp == "double") {
-                       new_spacing = Spacing::Double;
-               } else if (tmp == "other") {
-                       new_spacing = Spacing::Other;
-                       string tmpval = "0.0";
-                       is >> tmpval;
-                       lyxerr << "new_value = " << tmpval << endl;
-                       if (tmpval != "0.0")
-                               new_value = tmpval;
-               } else if (tmp == "default") {
-                       new_spacing = Spacing::Default;
-               } else {
-                       lyxerr << to_utf8(_("Unknown spacing argument: "))
-                              << to_utf8(cmd.argument()) << endl;
-               }
-               if (cur_spacing != new_spacing || cur_value != new_value)
-                       par.params().spacing(Spacing(new_spacing, new_value));
-               break;
-       }
-
        case LFUN_INSET_INSERT: {
                cur.recordUndo();
 
@@ -1325,7 +1278,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (layout.empty())
                        layout = tclass.defaultLayoutName();
 
-               if (para.forcePlainLayout())
+               if (owner_->forcePlainLayout())
                        // in this case only the empty layout is allowed
                        layout = tclass.plainLayoutName();
                else if (para.usePlainLayout()) {
@@ -1722,7 +1675,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
                // add a separate paragraph for the caption inset
                pars.push_back(Paragraph());
-               pars.back().setInsetOwner(&pars[0].inInset());
+               pars.back().setInsetOwner(&cur.text()->inset());
                pars.back().setPlainOrDefaultLayout(tclass);
                int cap_pit = pars.size() - 1;
 
@@ -1731,7 +1684,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // the graphics (or table).
                if (!content) {
                        pars.push_back(Paragraph());
-                       pars.back().setInsetOwner(&pars[0].inInset());
+                       pars.back().setInsetOwner(&cur.text()->inset());
                        pars.back().setPlainOrDefaultLayout(tclass);
                }
 
@@ -2184,10 +2137,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       if (lyxrc.spellcheck_continuously && cur.inTexted())
-               // Take this opportunity to spellcheck current word.
-               cur.paragraph().isMisspelled(cur.pos());
-
        needsUpdate |= (cur.pos() != cur.lastpos()) && cur.selection();
 
        // FIXME: The cursor flag is reset two lines below
@@ -2326,9 +2275,36 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
        case LFUN_FLOAT_INSERT:
        case LFUN_FLOAT_WIDE_INSERT:
+               // FIXME: If there is a selection, we should check whether there
+               // are floats in the selection, but this has performance issues, see
+               // LFUN_CHANGE_ACCEPT/REJECT.
                code = FLOAT_CODE;
-               // not allowed in description items
-               enable = !inDescriptionItem(cur);
+               if (inDescriptionItem(cur))
+                       // not allowed in description items
+                       enable = false;
+               else {
+                       InsetCode const inset_code = cur.inset().lyxCode();
+
+                       // algorithm floats cannot be put in another float
+                       if (to_utf8(cmd.argument()) == "algorithm") {
+                               enable = inset_code != WRAP_CODE && inset_code != FLOAT_CODE;
+                               break;
+                       }
+
+                       // for figures and tables: only allow in another
+                       // float or wrap if it is of the same type and
+                       // not a subfloat already
+                       if(cur.inset().lyxCode() == code) {
+                               InsetFloat const & ins =
+                                       static_cast<InsetFloat const &>(cur.inset());
+                               enable = ins.params().type == to_utf8(cmd.argument())
+                                       && !ins.params().subfloat;
+                       } else if(cur.inset().lyxCode() == WRAP_CODE) {
+                               InsetWrap const & ins =
+                                       static_cast<InsetWrap const &>(cur.inset());
+                               enable = ins.params().type == to_utf8(cmd.argument());
+                       }
+               }
                break;
        case LFUN_WRAP_INSERT:
                code = WRAP_CODE;
@@ -2446,7 +2422,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_MATH_MACRO:
        case LFUN_MATH_SUBSCRIPT:
        case LFUN_MATH_SUPERSCRIPT:
-               code = MATH_CODE;
+               code = MATH_HULL_CODE;
                break;
 
        case LFUN_INSET_MODIFY:
@@ -2554,7 +2530,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        enable = cur.inset().lyxCode() == FLEX_CODE
                                 && il.lyxtype() == type;
                } else {
-                       enable = ((!isMainText(cur.bv().buffer())
+                       enable = ((!isMainText()
                                      && cur.inset().nargs() == 1)
                                  || (cur.nextInset()
                                      && cur.nextInset()->nargs() == 1));
@@ -2568,10 +2544,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                // However, without proper optimizations, this will inevitably
                // result in unacceptable performance - just imagine a user who
                // wants to select the complete content of a long document.
-               if (!cur.selection()) {
-                       Change const & change = cur.paragraph().lookupChange(cur.pos());
-                       enable = change.changed();
-               } else
+               if (!cur.selection())
+                       enable = cur.paragraph().isChanged(cur.pos());
+               else
                        // TODO: context-sensitive enabling of LFUN_CHANGE_ACCEPT/REJECT
                        // for selections.
                        enable = true;
@@ -2583,7 +2558,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_OUTLINE_OUT:
        case LFUN_OUTLINE_DRAGMOVE:
                // FIXME: LyX is not ready for outlining within inset.
-               enable = isMainText(cur.bv().buffer())
+               enable = isMainText()
                        && cur.paragraph().layout().toclevel != Layout::NOT_IN_TOC;
                break;
 
@@ -2660,7 +2635,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LINE_END:
        case LFUN_CHAR_DELETE_FORWARD:
        case LFUN_CHAR_DELETE_BACKWARD:
-       case LFUN_PARAGRAPH_SPACING:
        case LFUN_INSET_INSERT:
        case LFUN_WORD_UPCASE:
        case LFUN_WORD_LOWCASE:
@@ -2709,6 +2683,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_INSET_END:
        case LFUN_INSET_BEGIN_SELECT:
        case LFUN_INSET_END_SELECT:
+       case LFUN_INSET_SELECT_ALL:
        case LFUN_UNICODE_INSERT:
                // these are handled in our dispatch()
                enable = true;
@@ -2763,11 +2738,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_FONT_UWAVE:
        case LFUN_LABEL_GOTO:
        case LFUN_LAYOUT_TABULAR:
-       case LFUN_MENU_OPEN:
        case LFUN_NOACTION:
        case LFUN_NOTE_NEXT:
        case LFUN_REFERENCE_NEXT:
-       case LFUN_SERVER_GOTO_FILE_ROW:
        case LFUN_SERVER_NOTIFY:
        case LFUN_SERVER_SET_XY:
        case LFUN_TEXTSTYLE_APPLY:
@@ -2791,9 +2764,9 @@ void Text::pasteString(Cursor & cur, docstring const & clip,
        if (!clip.empty()) {
                cur.recordUndo();
                if (asParagraphs)
-                       insertStringAsParagraphs(cur, clip);
+                       insertStringAsParagraphs(cur, clip, cur.current_font);
                else
-                       insertStringAsLines(cur, clip);
+                       insertStringAsLines(cur, clip, cur.current_font);
        }
 }