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) {
DocumentClass::const_iterator lit = tc.begin();
DocumentClass::const_iterator len = tc.end();
for (; lit != len; ++lit) {
- if (lit->toclevel == toclevel + 1 &&
+ if (lit->toclevel == (mode == OutlineIn ?
+ toclevel + 1 : toclevel - 1) &&
start->layout().labeltype == lit->labeltype) {
start->setLayout(*lit);
break;
}
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;
- }
}
}
pit_type const pit_end = cur.selEnd().pit();
for (pit_type pit = cur.selBegin().pit(); pit <= pit_end; pit++) {
pars_[pit].insertChar(0, '\t',
- bv->buffer().params().trackChanges);
+ bv->buffer().params().track_changes);
// Update the selection pos to make sure the selection does not
// change as the inserted tab will increase the logical pos.
if (cur.realAnchor().pit() == pit)
}
case LFUN_TAB_DELETE: {
- bool const tc = bv->buffer().params().trackChanges;
+ bool const tc = bv->buffer().params().track_changes;
if (cur.selection()) {
// If there is a selection, a tab (if present) is removed from
// the beginning of each paragraph.
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 {
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...
}
}
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();
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;
case LFUN_MOUSE_DOUBLE:
if (cmd.button() == mouse_button::button1) {
- selectWord(cur, WHOLE_WORD_STRICT);
+ selectWord(cur, WHOLE_WORD);
bv->cursor() = cur;
}
break;
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;
&& 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();
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;