X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FText3.cpp;h=1d3f0e30dff6d41d3ef1c8ceca73660ffbba5566;hb=e54ae72e5fac6f750c3f7972c74bb42b57f3a049;hp=a4eda43b8d77f5b61427be0f5b06e486d2c5328e;hpb=646fe23a4a5ee2891c87fca8b64f331d5e30e09a;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index a4eda43b8d..1d3f0e30df 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -79,7 +79,6 @@ using cap::cutSelection; using cap::pasteFromStack; using cap::pasteClipboard; using cap::replaceSelection; -using cap::saveSelection; using support::isStrUnsignedInt; using support::token; @@ -90,7 +89,7 @@ using std::istringstream; using std::ostringstream; -extern string current_layout; +extern docstring current_layout; namespace { @@ -119,7 +118,6 @@ namespace { { if (selecting || cur.mark()) cur.setSelection(); - saveSelection(cur); } @@ -377,17 +375,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) recUndo(cur, pit, pit + 1); finishUndo(); std::swap(pars_[pit], pars_[pit + 1]); - - ParIterator begin(cur); - // begin.pos() (== cur.pos()) may point beyond the end of the - // paragraph referenced by begin. This would cause a crash - // in updateLabels() - begin.pos() = 0; - ++cur.pit(); - ParIterator end = boost::next(ParIterator(cur)); - updateLabels(cur.buffer(), begin, end); - + updateLabels(cur.buffer()); needsUpdate = true; + ++cur.pit(); break; } @@ -396,17 +386,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) recUndo(cur, pit - 1, pit); finishUndo(); std::swap(pars_[pit], pars_[pit - 1]); - - ParIterator end = ParIterator(cur); - // end.pos() (== cur.pos()) may point beyond the end of the - // paragraph referenced by end. This would cause a crash - // in boost::next() - end.pos() = 0; - end = boost::next(end); + updateLabels(cur.buffer()); --cur.pit(); - ParIterator begin(cur); - updateLabels(cur.buffer(), begin, end); - needsUpdate = true; break; } @@ -415,11 +396,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) Paragraph & par = cur.paragraph(); bool start = !par.params().startOfAppendix(); -#ifdef WITH_WARNINGS -#warning The code below only makes sense at top level. +// FIXME: The code below only makes sense at top level. // Should LFUN_APPENDIX be restricted to top-level paragraphs? -#endif // ensure that we have only one start_of_appendix in this document + // FIXME: this don't work for multipart document! for (pit_type tmp = 0, end = pars_.size(); tmp != end; ++tmp) { if (pars_[tmp].params().startOfAppendix()) { recUndo(cur, tmp); @@ -437,20 +417,26 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_WORD_DELETE_FORWARD: - cur.clearSelection(); - deleteWordForward(cur); + if (cur.selection()) { + cutSelection(cur, true, false); + } else + deleteWordForward(cur); finishChange(cur, false); break; case LFUN_WORD_DELETE_BACKWARD: - cur.clearSelection(); - deleteWordBackward(cur); + if (cur.selection()) { + cutSelection(cur, true, false); + } else + deleteWordBackward(cur); finishChange(cur, false); break; case LFUN_LINE_DELETE: - cur.clearSelection(); - deleteLineForward(cur); + if (cur.selection()) { + cutSelection(cur, true, false); + } else + deleteLineForward(cur); finishChange(cur, false); break; @@ -488,8 +474,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) && cur.boundary() == oldBoundary) { cur.undispatched(); cmd = FuncRequest(LFUN_FINISHED_RIGHT); - } else if (cur.selection()) - saveSelection(cur); + } break; case LFUN_CHAR_BACKWARD: @@ -506,8 +491,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.undispatched(); cmd = FuncRequest(LFUN_FINISHED_LEFT); } - if (cur.selection()) - saveSelection(cur); break; case LFUN_UP_SELECT: @@ -532,9 +515,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } else cur.undispatched(); - // save new selection - if (cur.selection()) - saveSelection(cur); break; } @@ -542,16 +522,12 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_PARAGRAPH_UP_SELECT: needsUpdate |= cur.selHandle(cmd.action == LFUN_PARAGRAPH_UP_SELECT); needsUpdate |= cursorUpParagraph(cur); - if (cur.selection()) - saveSelection(cur); break; case LFUN_PARAGRAPH_DOWN: case LFUN_PARAGRAPH_DOWN_SELECT: needsUpdate |= cur.selHandle(cmd.action == LFUN_PARAGRAPH_DOWN_SELECT); needsUpdate |= cursorDownParagraph(cur); - if (cur.selection()) - saveSelection(cur); break; case LFUN_SCREEN_UP: @@ -562,8 +538,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) else { cursorPrevious(cur); } - if (cur.selection()) - saveSelection(cur); break; case LFUN_SCREEN_DOWN: @@ -575,8 +549,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) else { cursorNext(cur); } - if (cur.selection()) - saveSelection(cur); break; case LFUN_LINE_BEGIN: @@ -589,8 +561,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_LINE_END_SELECT: needsUpdate |= cur.selHandle(cmd.action == LFUN_LINE_END_SELECT); needsUpdate |= cursorEnd(cur); - if (cur.selection()) - saveSelection(cur); break; case LFUN_WORD_FORWARD: @@ -600,8 +570,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) needsUpdate |= cursorLeftOneWord(cur); else needsUpdate |= cursorRightOneWord(cur); - if (cur.selection()) - saveSelection(cur); break; case LFUN_WORD_BACKWARD: @@ -611,8 +579,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) needsUpdate |= cursorRightOneWord(cur); else needsUpdate |= cursorLeftOneWord(cur); - if (cur.selection()) - saveSelection(cur); break; case LFUN_WORD_SELECT: { @@ -687,9 +653,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_DELETE_BACKWARD_SKIP: // Reverse the effect of LFUN_BREAK_PARAGRAPH_SKIP. if (!cur.selection()) { -#ifdef WITH_WARNINGS -#warning look here -#endif + // FIXME: look here //CursorSlice cur = cursor(); backspace(cur); //anchor() = cur; @@ -787,6 +751,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) dispatch(cur, fr); } */ + if (cur.selection()) + cutSelection(cur, true, false); insertInset(cur, inset); cur.posRight(); } @@ -903,12 +869,12 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) break; case LFUN_SERVER_GET_LAYOUT: - cur.message(from_utf8(cur.paragraph().layout()->name())); + cur.message(cur.paragraph().layout()->name()); break; case LFUN_LAYOUT: { - string layout = to_ascii(cmd.argument()); - LYXERR(Debug::INFO) << "LFUN_LAYOUT: (arg) " << layout << endl; + docstring layout = cmd.argument(); + LYXERR(Debug::INFO) << "LFUN_LAYOUT: (arg) " << to_utf8(layout) << endl; // Derive layout number from given argument (string) // and current buffer's textclass (number) @@ -919,7 +885,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // If the entry is obsolete, use the new one instead. if (hasLayout) { - string const & obs = tclass[layout]->obsoleted_by(); + docstring const & obs = tclass[layout]->obsoleted_by(); if (!obs.empty()) layout = obs; } @@ -1017,14 +983,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) break; } - case LFUN_DATE_INSERT: - if (cmd.argument().empty()) - lyx::dispatch(FuncRequest(LFUN_SELF_INSERT, - formatted_time(current_time()))); - else - lyx::dispatch(FuncRequest(LFUN_SELF_INSERT, - formatted_time(current_time(), to_utf8(cmd.argument())))); + case LFUN_DATE_INSERT: { + string const format = cmd.argument().empty() + ? lyxrc.date_insert_format : to_utf8(cmd.argument()); + string const time = formatted_time(current_time(), format); + lyx::dispatch(FuncRequest(LFUN_SELF_INSERT, time)); break; + } case LFUN_MOUSE_TRIPLE: if (cmd.button() == mouse_button::button1) { @@ -1033,7 +998,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cursorEnd(cur); cur.setSelection(); bv->cursor() = cur; - saveSelection(cur); } break; @@ -1050,38 +1014,30 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) if (cmd.button() == mouse_button::button3) cur.clearSelection(); - // Middle button press pastes if we have a selection - // We do this here as if the selection was inside an inset - // it could get cleared on the unlocking of the inset so - // we have to check this first - bool paste_internally = false; - if (cmd.button() == mouse_button::button2 && cap::selection()) { - // Copy the selection buffer to the clipboard - // stack, because we want it to appear in the - // "Edit->Paste recent" menu. - cap::copySelectionToStack(); - paste_internally = true; - } + // Set the cursor + bool update = bv->mouseSetCursor(cur); // Insert primary selection with middle mouse // if there is a local selection in the current buffer, // insert this if (cmd.button() == mouse_button::button2) { - if (paste_internally) { - cap::pasteSelection(cur, bv->buffer()->errorList("Paste")); + if (cap::selection()) { + // Copy the selection buffer to the clipboard + // stack, because we want it to appear in the + // "Edit->Paste recent" menu. + cap::copySelectionToStack(); + + cap::pasteSelection(bv->cursor(), + bv->buffer()->errorList("Paste")); bv->buffer()->errors("Paste"); - cur.clearSelection(); // bug 393 bv->buffer()->markDirty(); finishUndo(); } else { - bv->mouseSetCursor(cur); lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph")); } } - // we have to update after dePM triggered - bool update = bv->mouseSetCursor(cur); - + // we have to update after dEPM triggered if (!update && cmd.button() == mouse_button::button1) { needsUpdate = false; cur.noUpdate(); @@ -1145,7 +1101,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // but bvcur is current mouse position Cursor & bvcur = cur.bv().cursor(); bvcur.selection() = true; - saveSelection(bvcur); } needsUpdate = false; cur.noUpdate(); @@ -1164,9 +1119,17 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // "auto_region_delete", which defaults to // true (on). - if (lyxrc.auto_region_delete) - if (cur.selection()) - cutSelection(cur, false, false); + if (lyxrc.auto_region_delete && cur.selection()) { + cutSelection(cur, false, false); + // When change tracking is set to off, the metrics update + // mechanism correctly detects if a full update is needed or not. + // This detection fails when a selection spans multiple rows and + // change tracking is enabled because the paragraph metrics stays + // the same. In this case, we force the full update: + // (see http://bugzilla.lyx.org/show_bug.cgi?id=3992) + if (cur.buffer().params().trackChanges) + cur.updateFlags(Update::Force); + } cur.clearSelection(); Font const old_font = real_current_font; @@ -1183,15 +1146,39 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_URL_INSERT: { InsetCommandParams p("url"); + docstring content; + if (cur.selection()) { + content = cur.selectionAsString(false); + cutSelection(cur, true, false); + } + p["target"] = (cmd.argument().empty()) ? + content : cmd.argument(); string const data = InsetCommandMailer::params2string("url", p); - bv->showInsetDialog("url", data, 0); + if (p["target"].empty()) { + bv->showInsetDialog("url", data, 0); + } else { + FuncRequest fr(LFUN_INSET_INSERT, data); + dispatch(cur, fr); + } break; } case LFUN_HTML_INSERT: { InsetCommandParams p("htmlurl"); + docstring content; + if (cur.selection()) { + content = cur.selectionAsString(false); + cutSelection(cur, true, false); + } + p["target"] = (cmd.argument().empty()) ? + content : cmd.argument(); string const data = InsetCommandMailer::params2string("url", p); - bv->showInsetDialog("url", data, 0); + if (p["target"].empty()) { + bv->showInsetDialog("url", data, 0); + } else { + FuncRequest fr(LFUN_INSET_INSERT, data); + dispatch(cur, fr); + } break; } @@ -1366,6 +1353,12 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_MATH_MATRIX: case LFUN_MATH_DELIM: case LFUN_MATH_BIGDELIM: { + if (cur.selection()) + cur.clearSelection(); + // FIXME: instead of the above, this one + // should be used (but it asserts with Bidi enabled) + // cf. http://bugzilla.lyx.org/show_bug.cgi?id=4055 + // cap::replaceSelection(cur); cur.insert(new InsetMathHull(hullSimple)); checkAndActivateInset(cur, true); BOOST_ASSERT(cur.inMathed()); @@ -1522,9 +1515,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_FLOAT_LIST: { TextClass const & tclass = bv->buffer()->params().getTextClass(); if (tclass.floats().typeExist(to_utf8(cmd.argument()))) { - // not quite sure if we want this... recordUndo(cur); - cur.clearSelection(); + if (cur.selection()) + cutSelection(cur, true, false); breakParagraph(cur); if (cur.lastpos() != 0) { @@ -1589,7 +1582,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_ESCAPE: if (cur.selection()) { cur.selection() = false; - saveSelection(cur); } else { cur.undispatched(); cmd = FuncRequest(LFUN_FINISHED_RIGHT);