X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=bfb392c63e2227ba34f276b3f44c9885c51b9aac;hb=90f7007a2e6c78ffd031e4636ff909ab1bc2ddec;hp=5260053657a6886699cd31a424844e6636654c55;hpb=2e69c66195544ee06e2b286f84fdfb6a2515a36d;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index 5260053657..bfb392c63e 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -295,6 +295,8 @@ static bool doInsertInset(Cursor & cur, Text * text, // Merge multiple paragraphs -- hack while (cur.lastpit() > 0) mergeParagraph(bparams, cur.text()->paragraphs(), 0); + if (cmd.action() == LFUN_FLEX_INSERT) + return true; Cursor old = cur; cur.leaveInset(*inset); if (cmd.action() == LFUN_PREVIEW_INSERT @@ -344,7 +346,7 @@ static void outline(OutlineOp mode, Cursor & cur) DocumentClass const & tc = buf.params().documentClass(); - int const thistoclevel = start->layout().toclevel; + int const thistoclevel = buf.text().getTocLevel(distance(bgn, start)); int toclevel; // Move out (down) from this section header @@ -353,7 +355,7 @@ static void outline(OutlineOp mode, Cursor & cur) // Seek the one (on same level) below for (; finish != end; ++finish) { - toclevel = finish->layout().toclevel; + toclevel = buf.text().getTocLevel(distance(bgn, finish)); if (toclevel != Layout::NOT_IN_TOC && toclevel <= thistoclevel) break; } @@ -370,7 +372,7 @@ static void outline(OutlineOp mode, Cursor & cur) // Search previous same-level header above do { --dest; - toclevel = dest->layout().toclevel; + toclevel = buf.text().getTocLevel(distance(bgn, dest)); } while(dest != bgn && (toclevel == Layout::NOT_IN_TOC || toclevel > thistoclevel)); @@ -393,7 +395,7 @@ static void outline(OutlineOp mode, Cursor & cur) 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; + toclevel = buf.text().getTocLevel(distance(bgn, dest)); if (toclevel != Layout::NOT_IN_TOC && toclevel <= thistoclevel) break; @@ -410,7 +412,7 @@ static void outline(OutlineOp mode, Cursor & cur) pit_type const len = distance(start, finish); buf.undo().recordUndo(cur, ATOMIC_UNDO, pit, pit + len - 1); for (; start != finish; ++start) { - toclevel = start->layout().toclevel; + toclevel = buf.text().getTocLevel(distance(bgn, start)); if (toclevel == Layout::NOT_IN_TOC) continue; DocumentClass::const_iterator lit = tc.begin(); @@ -429,7 +431,7 @@ static void outline(OutlineOp mode, Cursor & cur) pit_type const len = distance(start, finish); buf.undo().recordUndo(cur, ATOMIC_UNDO, pit, pit + len - 1); for (; start != finish; ++start) { - toclevel = start->layout().toclevel; + toclevel = buf.text().getTocLevel(distance(bgn, start)); if (toclevel == Layout::NOT_IN_TOC) continue; DocumentClass::const_iterator lit = tc.begin(); @@ -798,7 +800,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) ParagraphList::iterator finish = start; ParagraphList::iterator end = pars.end(); - int const thistoclevel = start->layout().toclevel; + int const thistoclevel = buf.text().getTocLevel(distance(bgn, start)); if (thistoclevel == Layout::NOT_IN_TOC) break; @@ -812,7 +814,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // Seek the one (on same level) below for (; finish != end; ++finish, ++cur.pit()) { - int const toclevel = finish->layout().toclevel; + int const toclevel = buf.text().getTocLevel(distance(bgn, finish)); if (toclevel != Layout::NOT_IN_TOC && toclevel <= thistoclevel) break; } @@ -1372,6 +1374,32 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) if (change_layout) setLayout(cur, layout); + Layout::LaTeXArgMap args = tclass[layout].args(); + Layout::LaTeXArgMap::const_iterator lait = args.begin(); + Layout::LaTeXArgMap::const_iterator const laend = args.end(); + for (; lait != laend; ++lait) { + Layout::latexarg arg = (*lait).second; + if (arg.autoinsert) { + FuncRequest cmd(LFUN_ARGUMENT_INSERT, (*lait).first); + lyx::dispatch(cmd); + } + } + + break; + } + + case LFUN_ENVIRONMENT_SPLIT: { + Paragraph const & para = cur.paragraph(); + docstring const layout = para.layout().name(); + if (cur.pos() > 0) + lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK)); + bool const morecont = cur.lastpos() > cur.pos(); + lyx::dispatch(FuncRequest(LFUN_LAYOUT, "Separator")); + lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse")); + if (morecont) + lyx::dispatch(FuncRequest(LFUN_DOWN)); + lyx::dispatch(FuncRequest(LFUN_LAYOUT, layout)); + break; } @@ -1685,7 +1713,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CAPTION_INSERT: case LFUN_FOOTNOTE_INSERT: case LFUN_NOTE_INSERT: - case LFUN_FLEX_INSERT: case LFUN_BOX_INSERT: case LFUN_BRANCH_INSERT: case LFUN_PHANTOM_INSERT: @@ -1706,6 +1733,37 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.forceBufferUpdate(); break; + case LFUN_FLEX_INSERT: { + // Open the inset, and move the current selection + // inside it. + bool const sel = cur.selection(); + doInsertInset(cur, this, cmd, true, true); + // Insert auto-insert arguments + bool autoargs = false; + Layout::LaTeXArgMap args = cur.inset().getLayout().latexargs(); + Layout::LaTeXArgMap::const_iterator lait = args.begin(); + Layout::LaTeXArgMap::const_iterator const laend = args.end(); + for (; lait != laend; ++lait) { + Layout::latexarg arg = (*lait).second; + if (arg.autoinsert) { + // The cursor might have been invalidated by the replaceSelection. + cur.buffer()->changed(true); + FuncRequest cmd(LFUN_ARGUMENT_INSERT, (*lait).first); + lyx::dispatch(cmd); + autoargs = true; + } + } + if (!autoargs) { + if (sel) + cur.leaveInset(cur.inset()); + cur.posForward(); + } + // Some insets are numbered, others are shown in the outline pane so + // let's update the labels and the toc backend. + cur.forceBufferUpdate(); + break; + } + case LFUN_TABULAR_INSERT: // if there were no arguments, just open the dialog if (doInsertInset(cur, this, cmd, false, true)) @@ -2321,6 +2379,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, FontInfo const & fontinfo = cur.real_current_font.fontInfo(); bool enable = true; + bool allow_in_passthru = false; InsetCode code = NO_CODE; switch (cmd.action()) { @@ -2469,11 +2528,21 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, } break; } - case LFUN_CAPTION_INSERT: + case LFUN_CAPTION_INSERT: { code = CAPTION_CODE; - // not allowed in description items - enable = !inDescriptionItem(cur); + bool varia = true; + if (cur.depth() > 0) { + if (&cur[cur.depth() - 1].inset() + && !cur[cur.depth() - 1].inset().allowsCaptionVariation()) + varia = false; + } + string arg = cmd.getArg(0); + // not allowed in description items, + // and in specific insets + enable = !inDescriptionItem(cur) + && (varia || arg.empty() || arg == "Standard"); break; + } case LFUN_NOTE_INSERT: code = NOTE_CODE; // in commands (sections etc.) and description items, @@ -2517,30 +2586,53 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, break; case LFUN_ARGUMENT_INSERT: { code = ARG_CODE; + allow_in_passthru = true; string const arg = cmd.getArg(0); if (arg.empty()) { enable = false; break; } Layout const & lay = cur.paragraph().layout(); - Layout::LaTeXArgMap args = lay.latexargs(); + Layout::LaTeXArgMap args = lay.args(); Layout::LaTeXArgMap::const_iterator const lait = - args.find(convert(arg)); + args.find(arg); if (lait != args.end()) { - InsetList::const_iterator it = cur.paragraph().insetList().begin(); - InsetList::const_iterator end = cur.paragraph().insetList().end(); - for (; it != end; ++it) { - if (it->inset->lyxCode() == ARG_CODE) { - InsetArgument const * ins = - static_cast(it->inset); - if (ins->name() == arg) { - // we have this already - enable = false; + enable = true; + pit_type pit = cur.pit(); + pit_type lastpit = cur.pit(); + if (lay.isEnvironment() && !prefixIs(arg, "item:")) { + // In a sequence of "merged" environment layouts, we only allow + // non-item arguments once. + lastpit = cur.lastpit(); + // get the first paragraph in sequence with this layout + depth_type const current_depth = cur.paragraph().params().depth(); + while (true) { + if (pit == 0) break; + Paragraph cpar = pars_[pit - 1]; + if (cpar.layout() == lay && cpar.params().depth() == current_depth) + --pit; + else + break; + } + } + for (; pit <= lastpit; ++pit) { + if (pars_[pit].layout() != lay) + break; + InsetList::const_iterator it = pars_[pit].insetList().begin(); + InsetList::const_iterator end = pars_[pit].insetList().end(); + for (; it != end; ++it) { + if (it->inset->lyxCode() == ARG_CODE) { + InsetArgument const * ins = + static_cast(it->inset); + if (ins->name() == arg) { + // we have this already + enable = false; + break; + } } } } - enable = true; } else enable = false; break; @@ -2743,7 +2835,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_OUTLINE_OUT: // FIXME: LyX is not ready for outlining within inset. enable = isMainText() - && cur.paragraph().layout().toclevel != Layout::NOT_IN_TOC; + && cur.buffer()->text().getTocLevel(cur.pit()) != Layout::NOT_IN_TOC; break; case LFUN_NEWLINE_INSERT: @@ -2796,7 +2888,17 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_LAYOUT: enable = !cur.inset().forcePlainLayout(); break; - + + case LFUN_ENVIRONMENT_SPLIT: { + if (cur.paragraph().layout().isEnvironment() + && cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))) { + enable = true; + break; + } + enable = false; + break; + } + case LFUN_LAYOUT_PARAGRAPH: case LFUN_PARAGRAPH_PARAMS: case LFUN_PARAGRAPH_PARAMS_APPLY: @@ -2913,7 +3015,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, if (code != NO_CODE && (cur.empty() || !cur.inset().insetAllowed(code) - || cur.paragraph().layout().pass_thru)) + || (cur.paragraph().layout().pass_thru && !allow_in_passthru))) enable = false; flag.setEnabled(enable);