]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Fix the rest of bug 5010.
[lyx.git] / src / Text3.cpp
index 579c10fe8b050888d75fa31401e75fa13d15cd56..5ef0d62fb3de1a20921e9aaea2ae6838967d1875 100644 (file)
@@ -57,6 +57,8 @@
 #include "insets/InsetSpecialChar.h"
 #include "insets/InsetText.h"
 #include "insets/InsetInfo.h"
+#include "insets/InsetGraphics.h"
+#include "insets/InsetGraphicsParams.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
@@ -131,7 +133,9 @@ static void mathDispatch(Cursor & cur, FuncRequest const & cmd, bool display)
                const int old_pos = cur.pos();
 #endif
                cur.insert(new InsetMathHull(hullSimple));
+#ifdef ENABLE_ASSERTIONS
                LASSERT(old_pos == cur.pos(), /**/);
+#endif
                cur.nextInset()->edit(cur, true);
                // don't do that also for LFUN_MATH_MODE
                // unless you want end up with always changing
@@ -284,6 +288,9 @@ static void outline(OutlineOp mode, Cursor & cur)
 
        switch (mode) {
                case OutlineUp: {
+                       if (start == pars.begin())
+                               // Nothing to move.
+                               return;
                        ParagraphList::iterator dest = start;
                        // Move out (up) from this header
                        if (dest == bgn)
@@ -309,7 +316,19 @@ static void outline(OutlineOp mode, Cursor & cur)
                        return;
                }
                case OutlineDown: {
-                       ParagraphList::iterator dest = finish;
+                       if (finish == end)
+                               // Nothing to move.
+                               return;
+                       // Go one down from *this* header:
+                       ParagraphList::iterator dest = boost::next(finish, 1);
+                       // Go further down to find header to insert in front of:
+                       for (; dest != end; ++dest) {
+                               toclevel = dest->layout().toclevel;
+                               if (toclevel != Layout::NOT_IN_TOC
+                                   && toclevel <= thistoclevel) {
+                                       break;
+                               }
+                       }
                        // One such was found:
                        pit_type newpit = distance(bgn, dest);
                        pit_type const len = distance(start, finish);
@@ -616,16 +635,26 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_WORD_RIGHT:
        case LFUN_WORD_RIGHT_SELECT:
-               //FIXME: for visual cursor mode, really move right
-               if (reverseDirectionNeeded(cur)) {
-                       cmd.action = cmd.action == LFUN_WORD_RIGHT_SELECT ?
-                                       LFUN_WORD_BACKWARD_SELECT : LFUN_WORD_BACKWARD;
+               if (lyxrc.visual_cursor) {
+                       needsUpdate |= cur.selHandle(cmd.action == LFUN_WORD_RIGHT_SELECT);
+                       needsUpdate |= cursorVisRightOneWord(cur);
+                       if (!needsUpdate && oldTopSlice == cur.top()
+                                       && cur.boundary() == oldBoundary) {
+                               cur.undispatched();
+                               cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+                       }
                } else {
-                       cmd.action = cmd.action == LFUN_WORD_RIGHT_SELECT ?
-                                       LFUN_WORD_FORWARD_SELECT : LFUN_WORD_FORWARD;
+                       if (reverseDirectionNeeded(cur)) {
+                               cmd.action = cmd.action == LFUN_WORD_RIGHT_SELECT ?
+                                               LFUN_WORD_BACKWARD_SELECT : LFUN_WORD_BACKWARD;
+                       } else {
+                               cmd.action = cmd.action == LFUN_WORD_RIGHT_SELECT ?
+                                               LFUN_WORD_FORWARD_SELECT : LFUN_WORD_FORWARD;
+                       }
+                       dispatch(cur, cmd);
+                       return;
                }
-               dispatch(cur, cmd);
-               return;
+               break;
 
        case LFUN_WORD_FORWARD:
        case LFUN_WORD_FORWARD_SELECT:
@@ -635,16 +664,26 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_WORD_LEFT:
        case LFUN_WORD_LEFT_SELECT:
-               //FIXME: for visual cursor mode, really move left
-               if (reverseDirectionNeeded(cur)) {
-                       cmd.action = cmd.action == LFUN_WORD_LEFT_SELECT ?
-                                       LFUN_WORD_FORWARD_SELECT : LFUN_WORD_FORWARD;
+               if (lyxrc.visual_cursor) {
+                       needsUpdate |= cur.selHandle(cmd.action == LFUN_WORD_LEFT_SELECT);
+                       needsUpdate |= cursorVisLeftOneWord(cur);
+                       if (!needsUpdate && oldTopSlice == cur.top()
+                                       && cur.boundary() == oldBoundary) {
+                               cur.undispatched();
+                               cmd = FuncRequest(LFUN_FINISHED_LEFT);
+                       }
                } else {
-                       cmd.action = cmd.action == LFUN_WORD_LEFT_SELECT ?
-                                       LFUN_WORD_BACKWARD_SELECT : LFUN_WORD_BACKWARD;
+                       if (reverseDirectionNeeded(cur)) {
+                               cmd.action = cmd.action == LFUN_WORD_LEFT_SELECT ?
+                                               LFUN_WORD_FORWARD_SELECT : LFUN_WORD_FORWARD;
+                       } else {
+                               cmd.action = cmd.action == LFUN_WORD_LEFT_SELECT ?
+                                               LFUN_WORD_BACKWARD_SELECT : LFUN_WORD_BACKWARD;
+                       }
+                       dispatch(cur, cmd);
+                       return;
                }
-               dispatch(cur, cmd);
-               return;
+               break;
 
        case LFUN_WORD_BACKWARD:
        case LFUN_WORD_BACKWARD_SELECT:
@@ -692,21 +731,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                moveCursor(cur, false);
                break;
 
-       case LFUN_DELETE_FORWARD_SKIP:
-               // Reverse the effect of LFUN_BREAK_PARAGRAPH_SKIP.
-               if (!cur.selection()) {
-                       if (cur.pos() == cur.lastpos()) {
-                               cursorForward(cur);
-                               cursorBackward(cur);
-                       }
-                       erase(cur);
-                       cur.resetAnchor();
-               } else {
-                       cutSelection(cur, true, false);
-               }
-               break;
-
-
        case LFUN_CHAR_DELETE_BACKWARD:
                if (!cur.selection()) {
                        if (bv->getIntl().getTransManager().backspace()) {
@@ -724,36 +748,12 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                }
                break;
 
-       case LFUN_DELETE_BACKWARD_SKIP:
-               // Reverse the effect of LFUN_BREAK_PARAGRAPH_SKIP.
-               if (!cur.selection()) {
-                       // FIXME: look here
-                       //CursorSlice cur = cursor();
-                       backspace(cur);
-                       //anchor() = cur;
-               } else {
-                       cutSelection(cur, true, false);
-               }
-               break;
-
        case LFUN_BREAK_PARAGRAPH:
                cap::replaceSelection(cur);
                breakParagraph(cur, cmd.argument() == "inverse");
                cur.resetAnchor();
                break;
 
-       case LFUN_BREAK_PARAGRAPH_SKIP: {
-               // When at the beginning of a paragraph, remove
-               // indentation.  Otherwise, do the same as LFUN_BREAK_PARAGRAPH.
-               cap::replaceSelection(cur);
-               if (cur.pos() == 0)
-                       cur.paragraph().params().labelWidthString(docstring());
-               else
-                       breakParagraph(cur, false);
-               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??
@@ -836,17 +836,45 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
 
        case LFUN_INSET_SETTINGS: {
-               // if there is an inset at cursor, access this
-               Inset * inset = cur.nextInset();
-               if (inset) {
-                       inset->showInsetDialog(bv);
+               Inset & inset = cur.inset();
+               if (cmd.getArg(0) == insetName(inset.lyxCode())) {
+                       // This inset dialog has been explicitely requested.
+                       inset.showInsetDialog(bv);
                        break;
                }
-               // if not work, access the underlying inset.
-               cur.inset().showInsetDialog(bv);
+               // else, if there is an inset at the cursor, access this
+               Inset * next_inset = cur.nextInset();
+               if (next_inset) {
+                       next_inset->showInsetDialog(bv);
+                       break;
+               }
+               // if not then access the underlying inset.
+               inset.showInsetDialog(bv);
                break;
        }
 
+       case LFUN_SET_GRAPHICS_GROUP: {
+               InsetGraphics * ins = graphics::getCurrentGraphicsInset(cur);
+               if (!ins)
+                       break;
+
+               cur.recordUndoFullDocument();
+
+               string id = to_utf8(cmd.argument());
+               string grp = graphics::getGroupParams(bv->buffer(), id);
+               InsetGraphicsParams tmp, inspar = ins->getParams();
+
+               if (id.empty())
+                       inspar.groupId = to_utf8(cmd.argument());
+               else {
+                       InsetGraphics::string2params(grp, bv->buffer(), tmp);
+                       tmp.filename = inspar.filename;
+                       inspar = tmp;
+               }
+
+               ins->setParams(inspar);
+       }
+
        case LFUN_SPACE_INSERT:
                if (cur.paragraph().layout().free_spacing)
                        insertChar(cur, ' ');
@@ -964,15 +992,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       case LFUN_SERVER_GET_FONT:
-               if (cur.current_font.fontInfo().shape() == ITALIC_SHAPE)
-                       cur.message(from_ascii("E"));
-               else if (cur.current_font.fontInfo().shape() == SMALLCAPS_SHAPE)
-                       cur.message(from_ascii("N"));
-               else
-                       cur.message(from_ascii("0"));
-               break;
-
        case LFUN_SERVER_GET_LAYOUT:
                cur.message(cur.paragraph().layout().name());
                break;
@@ -1248,6 +1267,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        cur.noUpdate();
                        return;
 
+               case mouse_button::none:
+               case mouse_button::button4:
+               case mouse_button::button5:
+                       break;
                } // switch (cmd.button())
 
                break;
@@ -1315,25 +1338,22 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_INFO_INSERT: {
-               Inset * inset = createInset(cur.bv().buffer(), cmd);
-               if (!inset)
-                       break;
-               // if an empty inset is created (cmd.argument() is empty)
-               // use current selection as parameter.
+               Inset * inset;
                if (cmd.argument().empty() && cur.selection()) {
-                       // use selected text as info to avoid a separate UI
+                       // if command argument is empty use current selection as parameter.
                        docstring ds = cur.selectionAsString(false);
                        cutSelection(cur, true, false);
-                       static_cast<InsetInfo *>(inset)->setInfo(to_utf8(ds));
-                       static_cast<InsetInfo *>(inset)->updateInfo();
+                       FuncRequest cmd0(cmd, ds);
+                       inset = createInset(cur.bv().buffer(), cmd0);
+               } else {
+                       inset = createInset(cur.bv().buffer(), cmd);
                }
+               if (!inset)
+                       break;
                insertInset(cur, inset);
                cur.posForward();
                break;
        }
-#if 0
-       case LFUN_LIST_INSERT:
-#endif
        case LFUN_CAPTION_INSERT:
        case LFUN_FOOTNOTE_INSERT:
        case LFUN_NOTE_INSERT:
@@ -1345,7 +1365,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_LISTING_INSERT:
        case LFUN_MARGINALNOTE_INSERT:
        case LFUN_OPTIONAL_INSERT:
-       case LFUN_ENVIRONMENT_INSERT:
        case LFUN_INDEX_INSERT:
                // Open the inset, and move the current selection
                // inside it.
@@ -1447,7 +1466,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                mathDispatch(cur, cmd, true);
                break;
 
-       case LFUN_MATH_IMPORT_SELECTION:
        case LFUN_MATH_MODE:
                if (cmd.argument() == "on")
                        // don't pass "on" as argument
@@ -1563,14 +1581,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       case LFUN_FONT_FREE_APPLY:
+       case LFUN_TEXTSTYLE_APPLY:
                toggleAndShow(cur, this, freefont, toggleall);
                cur.message(_("Character set"));
                break;
 
        // Set the freefont using the contents of \param data dispatched from
        // the frontends and apply it at the current cursor location.
-       case LFUN_FONT_FREE_UPDATE: {
+       case LFUN_TEXTSTYLE_UPDATE: {
                Font font;
                bool toggle;
                if (font.fromString(to_utf8(cmd.argument()), toggle)) {
@@ -1648,7 +1666,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_ACCENT_UNDERDOT:
        case LFUN_ACCENT_UNDERBAR:
        case LFUN_ACCENT_CARON:
-       case LFUN_ACCENT_SPECIAL_CARON:
        case LFUN_ACCENT_BREVE:
        case LFUN_ACCENT_TIE:
        case LFUN_ACCENT_HUNGARIAN_UMLAUT:
@@ -1660,7 +1677,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        bv->translateAndInsert(cmd.argument()[0], this, cur);
                break;
 
-       case LFUN_FLOAT_LIST: {
+       case LFUN_FLOAT_LIST_INSERT: {
                DocumentClass const & tclass = bv->buffer().params().documentClass();
                if (tclass.floats().typeExist(to_utf8(cmd.argument()))) {
                        cur.recordUndo();
@@ -1846,7 +1863,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_APPENDIX:
                flag.setOnOff(cur.paragraph().params().startOfAppendix());
-               return true;
+               break;
 
        case LFUN_BIBITEM_INSERT:
                enable = (cur.paragraph().layout().labeltype == LABEL_BIBLIO
@@ -1920,14 +1937,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_WRAP_INSERT:
                code = WRAP_CODE;
                break;
-       case LFUN_FLOAT_LIST:
+       case LFUN_FLOAT_LIST_INSERT:
                code = FLOAT_LIST_CODE;
                break;
-#if 0
-       case LFUN_LIST_INSERT:
-               code = LIST_CODE;
-               break;
-#endif
        case LFUN_CAPTION_INSERT:
                code = CAPTION_CODE;
                break;
@@ -1968,9 +1980,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                enable = cur.paragraph().insetList().count(OPTARG_CODE)
                        < cur.paragraph().layout().optionalargs;
                break;
-       case LFUN_ENVIRONMENT_INSERT:
-               code = BOX_CODE;
-               break;
        case LFUN_INDEX_INSERT:
                code = INDEX_CODE;
                break;
@@ -2012,27 +2021,27 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_FONT_EMPH:
                flag.setOnOff(fontinfo.emph() == FONT_ON);
-               return true;
+               break;
 
        case LFUN_FONT_NOUN:
                flag.setOnOff(fontinfo.noun() == FONT_ON);
-               return true;
+               break;
 
        case LFUN_FONT_BOLD:
                flag.setOnOff(fontinfo.series() == BOLD_SERIES);
-               return true;
+               break;
 
        case LFUN_FONT_SANS:
                flag.setOnOff(fontinfo.family() == SANS_FAMILY);
-               return true;
+               break;
 
        case LFUN_FONT_ROMAN:
                flag.setOnOff(fontinfo.family() == ROMAN_FAMILY);
-               return true;
+               break;
 
        case LFUN_FONT_TYPEWRITER:
                flag.setOnOff(fontinfo.family() == TYPEWRITER_FAMILY);
-               return true;
+               break;
 
        case LFUN_CUT:
        case LFUN_COPY:
@@ -2121,6 +2130,15 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                enable = (cur.pos() > cur.paragraph().beginOfBody());
                break;
 
+       case LFUN_SET_GRAPHICS_GROUP: {
+               InsetGraphics * ins = graphics::getCurrentGraphicsInset(cur);
+               if (!ins) 
+                       enable = false;
+               else
+                       flag.setOnOff(to_utf8(cmd.argument()) == ins->getParams().groupId);
+               break;
+       }
+
        case LFUN_WORD_DELETE_FORWARD:
        case LFUN_WORD_DELETE_BACKWARD:
        case LFUN_LINE_DELETE:
@@ -2154,11 +2172,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LINE_BEGIN:
        case LFUN_LINE_END:
        case LFUN_CHAR_DELETE_FORWARD:
-       case LFUN_DELETE_FORWARD_SKIP:
        case LFUN_CHAR_DELETE_BACKWARD:
-       case LFUN_DELETE_BACKWARD_SKIP:
        case LFUN_BREAK_PARAGRAPH:
-       case LFUN_BREAK_PARAGRAPH_SKIP:
        case LFUN_PARAGRAPH_SPACING:
        case LFUN_INSET_INSERT:
        case LFUN_WORD_UPCASE:
@@ -2167,7 +2182,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_CHARS_TRANSPOSE:
        case LFUN_SERVER_GET_XY:
        case LFUN_SERVER_SET_XY:
-       case LFUN_SERVER_GET_FONT:
        case LFUN_SERVER_GET_LAYOUT:
        case LFUN_LAYOUT:
        case LFUN_DATE_INSERT:
@@ -2175,7 +2189,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LINE_INSERT:
        case LFUN_NEWPAGE_INSERT:
        case LFUN_MATH_DISPLAY:
-       case LFUN_MATH_IMPORT_SELECTION:
        case LFUN_MATH_MODE:
        case LFUN_MATH_MACRO:
        case LFUN_MATH_MATRIX:
@@ -2188,8 +2201,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_FONT_UNDERLINE:
        case LFUN_FONT_SIZE:
        case LFUN_LANGUAGE:
-       case LFUN_FONT_FREE_APPLY:
-       case LFUN_FONT_FREE_UPDATE:
+       case LFUN_TEXTSTYLE_APPLY:
+       case LFUN_TEXTSTYLE_UPDATE:
        case LFUN_LAYOUT_PARAGRAPH:
        case LFUN_PARAGRAPH_UPDATE:
        case LFUN_ACCENT_UMLAUT:
@@ -2203,7 +2216,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_ACCENT_UNDERDOT:
        case LFUN_ACCENT_UNDERBAR:
        case LFUN_ACCENT_CARON:
-       case LFUN_ACCENT_SPECIAL_CARON:
        case LFUN_ACCENT_BREVE:
        case LFUN_ACCENT_TIE:
        case LFUN_ACCENT_HUNGARIAN_UMLAUT:
@@ -2230,7 +2242,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
            && (cur.empty() || !cur.inset().insetAllowed(code)))
                enable = false;
 
-       flag.enabled(enable);
+       flag.setEnabled(enable);
        return true;
 }