X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=4c99c15774707dfe432fed950f1eae836d5185d4;hb=ecdeffb52b1dad2f56e0e4210d0a040e807e2caf;hp=9fc8d6f8cc7bdc1dd74cc7dc13a79a65674b398b;hpb=2c613d5686e0a391a92e8e2c4a93b784e2e891e5;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index 9fc8d6f8cc..4c99c15774 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -345,8 +345,6 @@ static void outline(OutlineOp mode, Cursor & cur) ParagraphList::iterator finish = start; ParagraphList::iterator const end = pars.end(); - DocumentClass const & tc = buf.params().documentClass(); - int const thistoclevel = buf.text().getTocLevel(distance(bgn, start)); int toclevel; @@ -409,18 +407,25 @@ static void outline(OutlineOp mode, Cursor & cur) cur.pit() = newpit - len; break; } - case OutlineIn: { + case OutlineIn: + case OutlineOut: { pit_type const len = distance(start, finish); buf.undo().recordUndo(cur, ATOMIC_UNDO, pit, pit + len - 1); for (; start != finish; ++start) { toclevel = buf.text().getTocLevel(distance(bgn, start)); if (toclevel == Layout::NOT_IN_TOC) continue; + + DocumentClass const & tc = buf.params().documentClass(); DocumentClass::const_iterator lit = tc.begin(); DocumentClass::const_iterator len = tc.end(); + int const newtoclevel = + (mode == OutlineIn ? toclevel + 1 : toclevel - 1); + LabelType const oldlabeltype = start->layout().labeltype; + for (; lit != len; ++lit) { - if (lit->toclevel == toclevel + 1 && - start->layout().labeltype == lit->labeltype) { + if (lit->toclevel == newtoclevel && + lit->labeltype == oldlabeltype) { start->setLayout(*lit); break; } @@ -428,25 +433,6 @@ static void outline(OutlineOp mode, Cursor & cur) } break; } - case OutlineOut: { - pit_type const len = distance(start, finish); - buf.undo().recordUndo(cur, ATOMIC_UNDO, pit, pit + len - 1); - for (; start != finish; ++start) { - toclevel = buf.text().getTocLevel(distance(bgn, start)); - if (toclevel == Layout::NOT_IN_TOC) - continue; - DocumentClass::const_iterator lit = tc.begin(); - DocumentClass::const_iterator len = tc.end(); - for (; lit != len; ++lit) { - if (lit->toclevel == toclevel - 1 && - start->layout().labeltype == lit->labeltype) { - start->setLayout(*lit); - break; - } - } - } - break; - } } } @@ -616,18 +602,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.screenUpdateFlags(Update::FitCursor); break; - case LFUN_INSET_SELECT_ALL: - if (cur.depth() == 1 || !cur.selection() || !cur.selBegin().at_begin() - || !cur.selEnd().at_end()) { - needsUpdate |= cur.selHandle(false); - needsUpdate |= cursorTop(cur); - needsUpdate |= cur.selHandle(true); - needsUpdate |= cursorBottom(cur); - } else - cur.undispatched(); - cur.screenUpdateFlags(Update::FitCursor); - break; - case LFUN_CHAR_FORWARD: case LFUN_CHAR_FORWARD_SELECT: //LYXERR0(" LFUN_CHAR_FORWARD[SEL]:\n" << cur); @@ -1071,15 +1045,20 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cap::replaceSelection(cur); pit_type pit = cur.pit(); Paragraph const & par = pars_[pit]; - Paragraph const & prevpar = pit > 0 ? pars_[pit - 1] : par; - if (pit > 0 && cur.pos() == par.beginOfBody() + pit_type prev = pit; + if (pit > 0) { + if (!pars_[pit - 1].layout().isEnvironment()) + prev = depthHook(pit, par.getDepth()); + else if (pars_[pit - 1].getDepth() >= par.getDepth()) + prev = pit - 1; + } + if (prev < pit && cur.pos() == par.beginOfBody() && !par.isEnvSeparator(cur.pos()) - && ((prevpar.getDepth() > par.getDepth() - && !par.layout().isEnvironment()) - || (prevpar.layout() != par.layout() - && !par.layout().isCommand() - && prevpar.layout().isEnvironment()))) { - if (par.layout().isEnvironment()) { + && !par.layout().isCommand() + && pars_[prev].layout() != par.layout() + && pars_[prev].layout().isEnvironment()) { + if (par.layout().isEnvironment() + && pars_[prev].getDepth() == par.getDepth()) { docstring const layout = par.layout().name(); DocumentClass const & tc = bv->buffer().params().documentClass(); lyx::dispatch(FuncRequest(LFUN_LAYOUT, tc.plainLayout().name())); @@ -1550,7 +1529,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_MOUSE_DOUBLE: if (cmd.button() == mouse_button::button1) { - selectWord(cur, WHOLE_WORD_STRICT); + selectWord(cur, WHOLE_WORD); bv->cursor() = cur; } break; @@ -2403,6 +2382,33 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) needsUpdate = true; break; + case LFUN_SERVER_GET_STATISTICS: + { + DocIterator from, to; + if (cur.selection()) { + from = cur.selectionBegin(); + to = cur.selectionEnd(); + } else { + from = doc_iterator_begin(cur.buffer()); + to = doc_iterator_end(cur.buffer()); + } + + cur.buffer()->updateStatistics(from, to); + string const arg0 = cmd.getArg(0); + if (arg0 == "words") { + cur.message(convert(cur.buffer()->wordCount())); + } else if (arg0 == "chars") { + cur.message(convert(cur.buffer()->charCount(false))); + } else if (arg0 == "chars-space") { + cur.message(convert(cur.buffer()->charCount(true))); + } else { + cur.message(convert(cur.buffer()->wordCount()) + " " + + convert(cur.buffer()->charCount(false)) + " " + + convert(cur.buffer()->charCount(true))); + } + } + break; + default: LYXERR(Debug::ACTION, "Command " << cmd << " not DISPATCHED by Text"); cur.undispatched(); @@ -2626,11 +2632,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_CAPTION_INSERT: { code = CAPTION_CODE; string arg = cmd.getArg(0); - bool varia = arg != "LongTableNoNumber"; - if (cur.depth() > 0) { - if (&cur[cur.depth() - 1].inset()) - varia = cur[cur.depth() - 1].inset().allowsCaptionVariation(arg); - } + bool varia = arg != "LongTableNoNumber" + && cur.inset().allowsCaptionVariation(arg); // not allowed in description items, // and in specific insets enable = !inDescriptionItem(cur) @@ -3103,7 +3106,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_INSET_END: case LFUN_INSET_BEGIN_SELECT: case LFUN_INSET_END_SELECT: - case LFUN_INSET_SELECT_ALL: case LFUN_PARAGRAPH_UP: case LFUN_PARAGRAPH_DOWN: case LFUN_LINE_BEGIN: @@ -3121,6 +3123,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_UNICODE_INSERT: case LFUN_THESAURUS_ENTRY: case LFUN_ESCAPE: + case LFUN_SERVER_GET_STATISTICS: // these are handled in our dispatch() enable = true; break;