X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=e730e268a198de167006eda687888b3242c18221;hb=8db4a8dd4663cdd6a3cf67777ea2538a380d0dd2;hp=5ec6a6051b67a85839b8016f713a9e67efdc680e;hpb=1f70aa50d454b96c4d9d74e48183ca4045322895;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index 5ec6a6051b..e730e268a1 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -71,6 +71,10 @@ #include #include +using std::endl; +using std::string; +using std::istringstream; +using std::ostringstream; namespace lyx { @@ -83,14 +87,9 @@ using cap::replaceSelection; using support::isStrUnsignedInt; using support::token; -using std::endl; -using std::string; -using std::istringstream; -using std::ostringstream; - - +namespace frontend { extern docstring current_layout; - +} namespace { @@ -396,10 +395,8 @@ 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) { @@ -655,9 +652,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; @@ -690,6 +685,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) 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(); @@ -755,6 +754,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) dispatch(cur, fr); } */ + if (cur.selection()) + cutSelection(cur, true, false); insertInset(cur, inset); cur.posRight(); } @@ -819,15 +820,15 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.message(_("Paste")); cap::replaceSelection(cur); if (cmd.argument().empty() && !theClipboard().isInternal()) - pasteClipboard(cur, bv->buffer()->errorList("Paste")); + pasteClipboard(cur, bv->buffer().errorList("Paste")); else { string const arg(to_utf8(cmd.argument())); - pasteFromStack(cur, bv->buffer()->errorList("Paste"), + pasteFromStack(cur, bv->buffer().errorList("Paste"), isStrUnsignedInt(arg) ? convert(arg) : 0); } - bv->buffer()->errors("Paste"); + bv->buffer().errors("Paste"); cur.clearSelection(); // bug 393 finishUndo(); break; @@ -880,7 +881,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // Derive layout number from given argument (string) // and current buffer's textclass (number) - TextClass const & tclass = bv->buffer()->params().getTextClass(); + TextClass const & tclass = bv->buffer().params().getTextClass(); if (layout.empty()) layout = tclass.defaultLayoutName(); bool hasLayout = tclass.hasLayout(layout); @@ -898,7 +899,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) break; } - bool change_layout = (current_layout != layout); + bool change_layout = (frontend::current_layout != layout); if (!change_layout && cur.selection() && cur.selBegin().pit() != cur.selEnd().pit()) @@ -906,7 +907,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) pit_type spit = cur.selBegin().pit(); pit_type epit = cur.selEnd().pit() + 1; while (spit != epit) { - if (pars_[spit].layout()->name() != current_layout) { + if (pars_[spit].layout()->name() != frontend::current_layout) { change_layout = true; break; } @@ -924,9 +925,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CLIPBOARD_PASTE: cur.clearSelection(); - pasteClipboard(cur, bv->buffer()->errorList("Paste"), + pasteClipboard(cur, bv->buffer().errorList("Paste"), cmd.argument() == "paragraph"); - bv->buffer()->errors("Paste"); + bv->buffer().errors("Paste"); break; case LFUN_PRIMARY_SELECTION_PASTE: @@ -952,7 +953,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_QUOTE_INSERT: { Paragraph & par = cur.paragraph(); pos_type pos = cur.pos(); - BufferParams const & bufparams = bv->buffer()->params(); + BufferParams const & bufparams = bv->buffer().params(); Layout_ptr const & style = par.layout(); if (!style->pass_thru && par.getFontSettings(bufparams, pos).language()->lang() != "hebrew") { @@ -985,14 +986,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) { @@ -1017,38 +1017,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")); - bv->buffer()->errors("Paste"); - cur.clearSelection(); // bug 393 - bv->buffer()->markDirty(); + 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"); + 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(); @@ -1157,15 +1149,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; } @@ -1196,7 +1212,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // inside it. doInsertInset(cur, this, cmd, true, true); cur.posRight(); - updateLabels(*bv->buffer()); + updateLabels(bv->buffer()); break; case LFUN_NOTE_INSERT: case LFUN_CHARSTYLE_INSERT: @@ -1233,7 +1249,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.posRight(); ParagraphList & pars = cur.text()->paragraphs(); - TextClass const & tclass = bv->buffer()->params().getTextClass(); + TextClass const & tclass = bv->buffer().params().getTextClass(); // add a separate paragraph for the caption inset pars.push_back(Paragraph()); @@ -1340,6 +1356,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()); @@ -1494,11 +1516,11 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) break; case LFUN_FLOAT_LIST: { - TextClass const & tclass = bv->buffer()->params().getTextClass(); + 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) { @@ -1507,7 +1529,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } setLayout(cur, tclass.defaultLayoutName()); - setParagraph(cur, Spacing(), LYX_ALIGN_LAYOUT, docstring(), 0); + ParagraphParameters p; + setParagraphs(cur, p); insertInset(cur, new InsetFloatList(to_utf8(cmd.argument()))); cur.posRight(); } else { @@ -1545,17 +1568,21 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_PARAGRAPH_PARAMS_APPLY: { // Given data, an encoding of the ParagraphParameters // generated in the Paragraph dialog, this function sets - // the current paragraph appropriately. - istringstream is(to_utf8(cmd.argument())); - Lexer lex(0, 0); - lex.setStream(is); - ParagraphParameters params; - params.read(lex); - setParagraph(cur, - params.spacing(), - params.align(), - params.labelWidthString(), - params.noindent()); + // the current paragraph, or currently selected paragraphs, + // appropriately. + // NOTE: This function overrides all existing settings. + setParagraphs(cur, cmd.argument()); + cur.message(_("Paragraph layout set")); + break; + } + + case LFUN_PARAGRAPH_PARAMS: { + // Given data, an encoding of the ParagraphParameters as we'd + // find them in a LyX file, this function modifies the current paragraph, + // or currently selected paragraphs. + // NOTE: This function only modifies, and does not override, existing + // settings. + setParagraphs(cur, cmd.argument(), true); cur.message(_("Paragraph layout set")); break; } @@ -1869,7 +1896,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, break; case LFUN_INSET_DISSOLVE: - enable = !isMainText(*cur.bv().buffer()) && cur.inset().nargs() == 1; + enable = !isMainText(cur.bv().buffer()) && cur.inset().nargs() == 1; break; case LFUN_CHANGE_ACCEPT: @@ -1973,6 +2000,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_ACCENT_OGONEK: case LFUN_THESAURUS_ENTRY: case LFUN_PARAGRAPH_PARAMS_APPLY: + case LFUN_PARAGRAPH_PARAMS: case LFUN_ESCAPE: case LFUN_BUFFER_END: case LFUN_BUFFER_BEGIN: