X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=d5c1051080f85566edc0938071a51a744abfd385;hb=371ed5aff5cd0de3bb0e7ba1e8265780137cd8c4;hp=0c7c759c8fd593b4d6d79ea2c502bcbfab2d4761;hpb=cf333f5ab43c057d1433c490213bde1b9c4a681f;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index 0c7c759c8f..d5c1051080 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -27,12 +27,10 @@ #include "BufferView.h" #include "Cursor.h" #include "CutAndPaste.h" -#include "support/debug.h" #include "DispatchResult.h" #include "ErrorList.h" #include "factory.h" #include "FuncRequest.h" -#include "support/gettext.h" #include "InsetList.h" #include "Intl.h" #include "Language.h" @@ -44,7 +42,6 @@ #include "Paragraph.h" #include "paragraph_funcs.h" #include "ParagraphParameters.h" -#include "ParIterator.h" #include "TextClass.h" #include "TextMetrics.h" #include "VSpace.h" @@ -61,8 +58,10 @@ #include "insets/InsetText.h" #include "insets/InsetInfo.h" -#include "support/lstrings.h" #include "support/convert.h" +#include "support/debug.h" +#include "support/gettext.h" +#include "support/lstrings.h" #include "support/lyxtime.h" #include "mathed/InsetMathHull.h" @@ -183,12 +182,14 @@ static void specialChar(Cursor & cur, InsetSpecialChar::Kind kind) static bool doInsertInset(Cursor & cur, Text * text, FuncRequest const & cmd, bool edit, bool pastesel) { - Inset * inset = createInset(cur.bv().buffer(), cmd); + Buffer & buffer = cur.bv().buffer(); + BufferParams const & bparams = buffer.params(); + Inset * inset = createInset(buffer, cmd); if (!inset) return false; if (InsetCollapsable * ci = inset->asInsetCollapsable()) - ci->setLayout(cur.bv().buffer().params()); + ci->setLayout(bparams); cur.recordUndo(); if (cmd.action == LFUN_INDEX_INSERT) { @@ -198,42 +199,44 @@ static bool doInsertInset(Cursor & cur, Text * text, inset->edit(cur, true); // Now put this into inset static_cast(inset)->text_.insertStringAsParagraphs(cur, ds); - } else { - bool gotsel = false; - if (cur.selection()) { - lyx::dispatch(FuncRequest(LFUN_CUT)); - gotsel = true; - } - text->insertInset(cur, inset); + return true; + } - if (edit) - inset->edit(cur, true); + bool gotsel = false; + if (cur.selection()) { + lyx::dispatch(FuncRequest(LFUN_CUT)); + gotsel = true; + } + text->insertInset(cur, inset); - if (gotsel && pastesel) { - lyx::dispatch(FuncRequest(LFUN_PASTE, "0")); - InsetText * insetText = dynamic_cast(inset); - if (insetText && !insetText->allowMultiPar() - || cur.lastpit() == 0) { - // reset first par to default - LayoutPtr const layout = - cur.buffer().params().getTextClass().defaultLayout(); - cur.text()->paragraphs().begin()->layout(layout); - cur.pos() = 0; - cur.pit() = 0; - // Merge multiple paragraphs -- hack - while (cur.lastpit() > 0) { - mergeParagraph(cur.buffer().params(), - cur.text()->paragraphs(), 0); - } - } else { - // reset surrounding par to default - docstring const layoutname = - cur.buffer().params().getTextClass().defaultLayoutName(); - cur.leaveInset(*inset); - text->setLayout(cur, layoutname); - } - } + if (edit) + inset->edit(cur, true); + + if (!gotsel || !pastesel) + return true; + + lyx::dispatch(FuncRequest(LFUN_PASTE, "0")); + InsetText * insetText = dynamic_cast(inset); + if (insetText && !insetText->allowMultiPar() || cur.lastpit() == 0) { + // reset first par to default + LayoutPtr const layout = insetText->useEmptyLayout() + ? bparams.getTextClass().emptyLayout() + : bparams.getTextClass().defaultLayout(); + cur.text()->paragraphs().begin()->layout(layout); + cur.pos() = 0; + cur.pit() = 0; + // Merge multiple paragraphs -- hack + while (cur.lastpit() > 0) + mergeParagraph(bparams, cur.text()->paragraphs(), 0); + } else { + // reset surrounding par to default + docstring const layoutname = insetText->useEmptyLayout() + ? bparams.getTextClass().emptyLayoutName() + : bparams.getTextClass().defaultLayoutName(); + cur.leaveInset(*inset); + text->setLayout(cur, layoutname); } + return true; } @@ -530,29 +533,50 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CHAR_LEFT: case LFUN_CHAR_LEFT_SELECT: - //FIXME: for visual cursor, really move left - if (reverseDirectionNeeded(cur)) { - cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ? - LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD; + if (lyxrc.visual_cursor) { + needsUpdate |= cur.selHandle(cmd.action == LFUN_CHAR_LEFT_SELECT); + needsUpdate |= cursorVisLeft(cur); + if (!needsUpdate && oldTopSlice == cur.top() + && cur.boundary() == oldBoundary) { + cur.undispatched(); + cmd = FuncRequest(LFUN_FINISHED_LEFT); + } } else { - cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ? + if (reverseDirectionNeeded(cur)) { + cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ? + LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD; + } else { + cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ? LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD; + } + dispatch(cur, cmd); + return; } - dispatch(cur, cmd); - return; + break; case LFUN_CHAR_RIGHT: case LFUN_CHAR_RIGHT_SELECT: - //FIXME: for visual cursor, really move right - if (reverseDirectionNeeded(cur)) { - cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ? - LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD; + if (lyxrc.visual_cursor) { + needsUpdate |= cur.selHandle(cmd.action == LFUN_CHAR_RIGHT_SELECT); + needsUpdate |= cursorVisRight(cur); + if (!needsUpdate && oldTopSlice == cur.top() + && cur.boundary() == oldBoundary) { + cur.undispatched(); + cmd = FuncRequest(LFUN_FINISHED_RIGHT); + } } else { - cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ? + if (reverseDirectionNeeded(cur)) { + cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ? + LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD; + } else { + cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ? LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD; + } + dispatch(cur, cmd); + return; } - dispatch(cur, cmd); - return; + break; + case LFUN_UP_SELECT: case LFUN_DOWN_SELECT: @@ -993,13 +1017,26 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) docstring layout = cmd.argument(); LYXERR(Debug::INFO, "LFUN_LAYOUT: (arg) " << to_utf8(layout)); - docstring const old_layout = cur.paragraph().layout()->name(); - - // Derive layout number from given argument (string) - // and current buffer's textclass (number) + Paragraph const & para = cur.paragraph(); + docstring const old_layout = para.layout()->name(); TextClass const & tclass = bv->buffer().params().getTextClass(); + if (layout.empty()) layout = tclass.defaultLayoutName(); + + if (para.forceEmptyLayout()) + // in this case only the empty layout is allowed + layout = tclass.emptyLayoutName(); + else if (para.useEmptyLayout()) { + // in this case, default layout maps to empty layout + if (layout == tclass.defaultLayoutName()) + layout = tclass.emptyLayoutName(); + } else { + // otherwise, the empty layout maps to the default + if (layout == tclass.emptyLayoutName()) + layout = tclass.defaultLayoutName(); + } + bool hasLayout = tclass.hasLayout(layout); // If the entry is obsolete, use the new one instead. @@ -1317,13 +1354,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) #endif case LFUN_CAPTION_INSERT: case LFUN_FOOTNOTE_INSERT: - // Open the inset, and move the current selection - // inside it. - doInsertInset(cur, this, cmd, true, true); - cur.posForward(); - // These insets are numbered. - updateLabels(bv->buffer()); - break; case LFUN_NOTE_INSERT: case LFUN_FLEX_INSERT: case LFUN_BOX_INSERT: @@ -1334,10 +1364,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) 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. doInsertInset(cur, this, cmd, true, true); cur.posForward(); + // Some insets are numbered, others are shown in the outline pane so + // let's update the labels and the toc backend. + updateLabels(bv->buffer()); break; case LFUN_TABULAR_INSERT: @@ -1363,7 +1397,10 @@ 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().layout(tclass.defaultLayout()); + if (pars.back().useEmptyLayout()) + pars.back().layout(tclass.emptyLayout()); + else + pars.back().layout(tclass.defaultLayout()); int cap_pit = pars.size() - 1; @@ -1373,8 +1410,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) if (!content) { pars.push_back(Paragraph()); pars.back().setInsetOwner(pars[0].inInset()); - pars.back().layout(tclass.defaultLayout()); - + if (pars.back().useEmptyLayout()) + pars.back().layout(tclass.emptyLayout()); + else + pars.back().layout(tclass.defaultLayout()); } // reposition the cursor to the caption @@ -1392,11 +1431,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) break; } - case LFUN_INDEX_INSERT: - doInsertInset(cur, this, cmd, true, true); - cur.posForward(); - break; - case LFUN_NOMENCL_INSERT: { FuncRequest cmd1 = cmd; if (cmd.argument().empty()) @@ -1581,18 +1615,24 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_FINISHED_LEFT: LYXERR(Debug::DEBUG, "handle LFUN_FINISHED_LEFT:\n" << cur); - if (reverseDirectionNeeded(cur)) { - ++cur.pos(); - cur.setCurrentFont(); - } + // We're leaving an inset, going left. If the inset is LTR, we're + // leaving from the front, so we should not move (remain at --- but + // not in --- the inset). If the inset is RTL, move left, without + // entering the inset itself; i.e., move to after the inset. + if (cur.paragraph().getFontSettings( + cur.bv().buffer().params(), cur.pos()).isRightToLeft()) + cursorVisLeft(cur, true); break; case LFUN_FINISHED_RIGHT: LYXERR(Debug::DEBUG, "handle LFUN_FINISHED_RIGHT:\n" << cur); - if (!reverseDirectionNeeded(cur)) { - ++cur.pos(); - cur.setCurrentFont(); - } + // We're leaving an inset, going right. If the inset is RTL, we're + // leaving from the front, so we should not move (remain at --- but + // not in --- the inset). If the inset is LTR, move right, without + // entering the inset itself; i.e., move to after the inset. + if (!cur.paragraph().getFontSettings( + cur.bv().buffer().params(), cur.pos()).isRightToLeft()) + cursorVisRight(cur, true); break; case LFUN_FINISHED_BACKWARD: @@ -1618,7 +1658,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) params2string(cur.paragraph(), data); // Will the paragraph accept changes from the dialog? - bool const accept = !cur.inset().forceDefaultParagraphs(cur.idx()); + bool const accept = + cur.inset().allowParagraphCustomization(cur.idx()); data = "update " + convert(accept) + '\n' + data; bv->updateDialog("paragraph", data); @@ -1661,6 +1702,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) breakParagraph(cur); } + //FIXME Check if this should be emptyLayout() setLayout(cur, tclass.defaultLayoutName()); ParagraphParameters p; setParagraphs(cur, p);