Buffer & buf = *cur.buffer();
pit_type & pit = cur.pit();
ParagraphList & pars = buf.text().paragraphs();
- ParagraphList::iterator bgn = pars.begin();
+ ParagraphList::iterator const bgn = pars.begin();
// The first paragraph of the area to be copied:
ParagraphList::iterator start = boost::next(bgn, pit);
// The final paragraph of area to be copied:
ParagraphList::iterator finish = start;
- ParagraphList::iterator end = pars.end();
+ ParagraphList::iterator const end = pars.end();
DocumentClass const & tc = buf.params().documentClass();
break;
}
+ // Do we need to set insets' buffer_ members, because we copied
+ // some stuff? We'll assume we do and reset it otherwise.
+ bool set_buffers = true;
+
switch (mode) {
case OutlineUp: {
if (start == pars.begin())
start = boost::next(pars.begin(), deletepit);
pit = newpit;
pars.erase(start, finish);
- return;
+ break;
}
case OutlineDown: {
if (finish == end)
start = boost::next(bgn, pit);
pit = newpit - len;
pars.erase(start, finish);
- return;
+ break;
}
case OutlineIn: {
pit_type const len = distance(start, finish);
}
}
}
- return;
+ set_buffers = false;
+ break;
}
case OutlineOut: {
pit_type const len = distance(start, finish);
}
}
}
- return;
+ set_buffers = false;
+ break;
}
}
+ if (set_buffers)
+ // FIXME This only really needs doing for the newly introduced
+ // paragraphs. Something like:
+ // pit_type const numpars = distance(start, finish);
+ // start = boost::next(bgn, pit);
+ // finish = boost::next(start, numpars);
+ // for (; start != finish; ++start)
+ // start->setBuffer(buf);
+ // But while this seems to work, it is kind of fragile.
+ buf.inset().setBuffer(buf);
}
LYXERR(Debug::ACTION, "Text::dispatch: cmd: " << cmd);
BufferView * bv = &cur.bv();
- TextMetrics & tm = bv->textMetrics(this);
- if (!tm.contains(cur.pit())) {
+ TextMetrics * tm = &bv->textMetrics(this);
+ if (!tm->contains(cur.pit())) {
lyx::dispatch(FuncRequest(LFUN_SCREEN_SHOW_CURSOR));
- tm = bv->textMetrics(this);
+ tm = &bv->textMetrics(this);
}
// FIXME: We use the update flag to indicates wether a singlePar or a
if (cur.selection())
cutSelection(cur, true, false);
else
- tm.deleteLineForward(cur);
+ tm->deleteLineForward(cur);
finishChange(cur, false);
break;
&& cur.boundary() == oldBoundary) {
cur.undispatched();
cmd = FuncRequest(LFUN_FINISHED_FORWARD);
+
+ // we will probably be moving out the inset, so we should execute
+ // the depm-mechanism, but only when the cursor has a place to
+ // go outside this inset, i.e. in a slice above.
+ if (cur.depth() > 1 && cur.pos() == cur.lastpos()
+ && cur.pit() == cur.lastpit()) {
+ // The cursor hasn't changed yet. To give the
+ // DEPM the possibility of doing something we must
+ // provide it with two different cursors.
+ Cursor dummy = cur;
+ dummy.pos() = dummy.pit() = 0;
+ cur.bv().checkDepm(dummy, cur);
+ }
}
break;
&& cur.boundary() == oldBoundary) {
cur.undispatched();
cmd = FuncRequest(LFUN_FINISHED_BACKWARD);
+
+ // we will probably be moving out the inset, so we should execute
+ // the depm-mechanism, but only when the cursor has a place to
+ // go outside this inset, i.e. in a slice above.
+ if (cur.depth() > 1 && cur.pos() == 0 && cur.pit() == 0) {
+ // The cursor hasn't changed yet. To give the
+ // DEPM the possibility of doing something we must
+ // provide it with two different cursors.
+ Cursor dummy = cur;
+ dummy.pos() = cur.lastpos();
+ dummy.pit() = cur.lastpit();
+ cur.bv().checkDepm(dummy, cur);
+ }
}
break;
case LFUN_LINE_BEGIN:
case LFUN_LINE_BEGIN_SELECT:
needsUpdate |= cur.selHandle(cmd.action == LFUN_LINE_BEGIN_SELECT);
- needsUpdate |= tm.cursorHome(cur);
+ needsUpdate |= tm->cursorHome(cur);
break;
case LFUN_LINE_END:
case LFUN_LINE_END_SELECT:
needsUpdate |= cur.selHandle(cmd.action == LFUN_LINE_END_SELECT);
- needsUpdate |= tm.cursorEnd(cur);
+ needsUpdate |= tm->cursorEnd(cur);
break;
case LFUN_SECTION_SELECT: {
case LFUN_SERVER_GET_XY:
cur.message(from_utf8(
- convert<string>(tm.cursorX(cur.top(), cur.boundary()))
- + ' ' + convert<string>(tm.cursorY(cur.top(), cur.boundary()))));
+ convert<string>(tm->cursorX(cur.top(), cur.boundary()))
+ + ' ' + convert<string>(tm->cursorY(cur.top(), cur.boundary()))));
break;
case LFUN_SERVER_SET_XY: {
lyxerr << "SETXY: Could not parse coordinates in '"
<< to_utf8(cmd.argument()) << endl;
else
- tm.setCursorFromCoordinates(cur, x, y);
+ tm->setCursorFromCoordinates(cur, x, y);
break;
}
case LFUN_MOUSE_TRIPLE:
if (cmd.button() == mouse_button::button1) {
- tm.cursorHome(cur);
+ tm->cursorHome(cur);
cur.resetAnchor();
- tm.cursorEnd(cur);
+ tm->cursorEnd(cur);
cur.setSelection();
bv->cursor() = cur;
}
int const wh = bv->workHeight();
int const y = max(0, min(wh - 1, cmd.y));
- tm.setCursorFromCoordinates(cur, cmd.x, y);
+ tm->setCursorFromCoordinates(cur, cmd.x, y);
cur.setTargetX(cmd.x);
if (cmd.y >= wh)
lyx::dispatch(FuncRequest(LFUN_DOWN_SELECT));
}
if (!inset)
break;
+ cur.recordUndo();
insertInset(cur, inset);
cur.posForward();
break;
case LFUN_DIALOG_SHOW_NEW_INSET:
if (cmd.argument() == "bibitem")
code = BIBITEM_CODE;
- else if (cmd.argument() == "bibtex")
+ else if (cmd.argument() == "bibtex") {
code = BIBTEX_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
+ }
else if (cmd.argument() == "box")
code = BOX_CODE;
else if (cmd.argument() == "branch")
break;
case LFUN_FLOAT_LIST_INSERT:
code = FLOAT_LIST_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
break;
case LFUN_CAPTION_INSERT:
code = CAPTION_CODE;
break;
case LFUN_INDEX_PRINT:
code = INDEX_PRINT_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
break;
case LFUN_NOMENCL_INSERT:
if (cur.selIsMultiCell() || cur.selIsMultiLine()) {
break;
case LFUN_NOMENCL_PRINT:
code = NOMENCL_PRINT_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
break;
case LFUN_TOC_INSERT:
code = TOC_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
break;
case LFUN_HYPERLINK_INSERT:
if (cur.selIsMultiCell() || cur.selIsMultiLine()) {