}
+static void dragMove(Cursor & cur, int moveid, int movetoid)
+{
+ // Create pointers to buffers
+ Buffer & buf_move = *cur.buffer();
+ DocIterator dit_move = buf_move.getParFromID(moveid);
+ DocIterator dit_dest = buf_move.getParFromID(movetoid);
+
+ pit_type & pit_move = dit_move.pit();
+ pit_type & pit_dest = dit_dest.pit();
+ ParagraphList & pars = dit_move.text()->paragraphs();
+
+ // Create references to the paragraphs to be moved
+ ParagraphList::iterator const bgn = pars.begin();
+ ParagraphList::iterator dest_start = boost::next(bgn, pit_dest);
+
+ // The first paragraph of the area to be copied:
+ ParagraphList::iterator start = boost::next(bgn, pit_move);
+ // The final paragraph of area to be copied:
+ ParagraphList::iterator finish = start;
+ ParagraphList::iterator const end = pars.end();
+
+ // Move out (down) from this section header
+ if (finish != end)
+ ++finish;
+
+ // Seek the one (on same level) below
+ int const thistoclevel = start->layout().toclevel;
+ for (; finish != end; ++finish) {
+ int const toclevel = finish->layout().toclevel;
+ if (toclevel != Layout::NOT_IN_TOC
+ && toclevel <= thistoclevel)
+ break;
+ }
+
+ if (start == pars.begin() || start == dest_start)
+ // Nothing to move
+ return;
+
+ pars.insert(dest_start, start, finish);
+ pars.erase(start, finish);
+
+ // 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_move.inset().setBuffer(buf_move);
+}
+
+
/// the type of outline operation
enum OutlineOp {
OutlineUp, // Move this header with text down
// Move out (down) from this section header
if (finish != end)
++finish;
+
// Seek the one (on same level) below
for (; finish != end; ++finish) {
toclevel = finish->layout().toclevel;
// Do we need to set insets' buffer_ members, because we copied
// some stuff? We'll assume we do and reset it otherwise.
- bool setBuffers = true;
+ bool set_buffers = true;
switch (mode) {
case OutlineUp: {
}
}
}
- setBuffers = false;
+ set_buffers = false;
break;
}
case OutlineOut: {
}
}
}
- setBuffers = false;
+ set_buffers = false;
break;
}
}
- if (setBuffers)
+ if (set_buffers)
// FIXME This only really needs doing for the newly introduced
// paragraphs. Something like:
// pit_type const numpars = distance(start, finish);
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;
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;
dispatch(cur, fr);
break;
}
-
+
case LFUN_NOMENCL_PRINT:
case LFUN_TOC_INSERT:
case LFUN_LINE_INSERT:
cur.buffer()->updateLabels();
needsUpdate = true;
break;
+
+ case LFUN_OUTLINE_DRAGMOVE: {
+ int const move_id = convert<int>(cmd.getArg(0));
+ int const move_to_id = convert<int>(cmd.getArg(1));
+ dragMove(cur, move_id, move_to_id);
+ setCursor(cur, cur.pit(), 0);
+ cur.buffer()->updateLabels();
+ needsUpdate = true;
+ break;
+ }
default:
LYXERR(Debug::ACTION, "Command " << cmd << " not DISPATCHED by Text");
break;
}
+ if (lyxrc.spellcheck_continuously && cur.inTexted())
+ // Take this opportunity to spellcheck current word.
+ cur.paragraph().isMisspelled(cur.pos());
+
needsUpdate |= (cur.pos() != cur.lastpos()) && cur.selection();
// FIXME: The cursor flag is reset two lines below
code = INDEX_PRINT_CODE;
else if (cmd.argument() == "nomenclature")
code = NOMENCL_CODE;
+ else if (cmd.argument() == "nomencl_print")
+ code = NOMENCL_PRINT_CODE;
else if (cmd.argument() == "label")
code = LABEL_CODE;
else if (cmd.argument() == "note")
case LFUN_OUTLINE_DOWN:
case LFUN_OUTLINE_IN:
case LFUN_OUTLINE_OUT:
+ case LFUN_OUTLINE_DRAGMOVE:
// FIXME: LyX is not ready for outlining within inset.
enable = isMainText(cur.bv().buffer())
&& cur.paragraph().layout().toclevel != Layout::NOT_IN_TOC;