X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=4c99c15774707dfe432fed950f1eae836d5185d4;hb=ecdeffb52b1dad2f56e0e4210d0a040e807e2caf;hp=f1c3d668b6e98ef4a454c5a2c996c32cac7402e4;hpb=0a6ff99f28686066675848f3410f77c0947bc357;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index f1c3d668b6..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); @@ -1021,11 +995,20 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CHAR_DELETE_FORWARD: if (!cur.selection()) { + bool was_separator = cur.paragraph().isEnvSeparator(cur.pos()); if (cur.pos() == cur.paragraph().size()) // Par boundary, force full-screen update singleParUpdate = false; needsUpdate |= erase(cur); cur.resetAnchor(); + if (was_separator && cur.pos() == cur.paragraph().size() + && (!cur.paragraph().layout().isEnvironment() + || cur.paragraph().size() > 0)) { + // Force full-screen update + singleParUpdate = false; + needsUpdate |= erase(cur); + cur.resetAnchor(); + } // It is possible to make it a lot faster still // just comment out the line below... } else { @@ -1038,11 +1021,17 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CHAR_DELETE_BACKWARD: if (!cur.selection()) { if (bv->getIntl().getTransManager().backspace()) { + bool par_boundary = cur.pos() == 0; // Par boundary, full-screen update - if (cur.pos() == 0) + if (par_boundary) singleParUpdate = false; needsUpdate |= backspace(cur); cur.resetAnchor(); + if (par_boundary && cur.pos() > 0 + && cur.paragraph().isEnvSeparator(cur.pos() - 1)) { + needsUpdate |= backspace(cur); + cur.resetAnchor(); + } // It is possible to make it a lot faster still // just comment out the line below... } @@ -1052,11 +1041,42 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } break; - case LFUN_PARAGRAPH_BREAK: + case LFUN_PARAGRAPH_BREAK: { cap::replaceSelection(cur); - breakParagraph(cur, cmd.argument() == "inverse"); + pit_type pit = cur.pit(); + Paragraph const & par = pars_[pit]; + 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()) + && !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())); + lyx::dispatch(FuncRequest(LFUN_SEPARATOR_INSERT, "parbreak")); + lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse")); + lyx::dispatch(FuncRequest(LFUN_LAYOUT, layout)); + } else { + lyx::dispatch(FuncRequest(LFUN_SEPARATOR_INSERT, "parbreak")); + breakParagraph(cur); + } + Font const f(inherit_font, cur.current_font.language()); + pars_[cur.pit() - 1].resetFonts(f); + } else { + breakParagraph(cur, cmd.argument() == "inverse"); + } cur.resetAnchor(); break; + } case LFUN_INSET_INSERT: { cur.recordUndo(); @@ -1404,15 +1424,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) while (cur.paragraph().params().depth() > split_depth) lyx::dispatch(FuncRequest(LFUN_DEPTH_DECREMENT)); } - bool const morecont = cur.lastpos() > cur.pos(); - // FIXME This hardcoding is bad - docstring const sep = - cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator")) - ? from_ascii("Separator") : from_ascii("--Separator--"); - lyx::dispatch(FuncRequest(LFUN_LAYOUT, sep)); + DocumentClass const & tc = bv->buffer().params().documentClass(); + lyx::dispatch(FuncRequest(LFUN_LAYOUT, tc.plainLayout().name())); + lyx::dispatch(FuncRequest(LFUN_SEPARATOR_INSERT, "plain")); lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse")); - if (morecont) - lyx::dispatch(FuncRequest(LFUN_DOWN)); lyx::dispatch(FuncRequest(LFUN_LAYOUT, layout)); break; @@ -1514,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; @@ -1903,6 +1918,16 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.posForward(); break; + case LFUN_SEPARATOR_INSERT: { + doInsertInset(cur, this, cmd, false, false); + cur.posForward(); + // remove a following space + Paragraph & par = cur.paragraph(); + if (cur.pos() != cur.lastpos() && par.isLineSeparator(cur.pos())) + par.eraseChar(cur.pos(), cur.buffer()->params().track_changes); + break; + } + case LFUN_DEPTH_DECREMENT: changeDepth(cur, DEC_DEPTH); break; @@ -2357,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(); @@ -2580,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) @@ -2906,6 +2955,11 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, && cur.pos() > cur.paragraph().beginOfBody(); break; + case LFUN_SEPARATOR_INSERT: + // Always enabled for now + enable = true; + break; + case LFUN_TAB_INSERT: case LFUN_TAB_DELETE: enable = cur.paragraph().isPassThru(); @@ -2953,12 +3007,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, break; case LFUN_ENVIRONMENT_SPLIT: { - // FIXME This hardcoding is bad - if (!cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator")) - && !cur.buffer()->params().documentClass().hasLayout(from_ascii("--Separator--"))) { - enable = false; - break; - } if (cmd.argument() == "outer") { // check if we have an environment in our nesting hierarchy bool res = false; @@ -3058,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: @@ -3076,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;