- case LFUN_RIGHTSEL:
- moveRight(bv, false);
- selection_end = actpos;
- bv->updateInset(this, false);
- break;
- case LFUN_RIGHT:
- result= DISPATCH_RESULT(moveRight(bv));
- if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- } else {
- selection_start = selection_end = actpos;
- }
- break;
- case LFUN_LEFTSEL:
- moveLeft(bv, false);
- selection_end = actpos;
- bv->updateInset(this, false);
- break;
- case LFUN_LEFT:
- result= DISPATCH_RESULT(moveLeft(bv));
- if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- } else {
- selection_start = selection_end = actpos;
- }
- break;
- case LFUN_DOWNSEL:
- moveDown(bv, false);
- selection_end = actpos;
- bv->updateInset(this, false);
- break;
- case LFUN_DOWN:
- result= DISPATCH_RESULT(moveDown(bv));
- if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- } else {
- selection_start = selection_end = actpos;
- }
- break;
- case LFUN_UPSEL:
- moveUp(bv, false);
- selection_end = actpos;
- bv->updateInset(this, false);
- break;
- case LFUN_UP:
- result= DISPATCH_RESULT(moveUp(bv));
- if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- } else {
- selection_start = selection_end = actpos;
- }
- break;
- case LFUN_BACKSPACE:
- if (!actpos || par->IsNewline(actpos-1)) {
- if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- }
- break;
- }
- moveLeft(bv);
- case LFUN_DELETE:
- if (Delete()) { // we need update
- selection_start = selection_end = actpos;
- computeTextRows(bv->getPainter());
- bv->updateInset(this, true);
- } else if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- }
- break;
- case LFUN_HOME:
- for(; actpos > rows[actrow].pos; --actpos)
- cx -= SingleWidth(bv->getPainter(), par, actpos);
- cx -= SingleWidth(bv->getPainter(), par, actpos);
- if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- } else {
- selection_start = selection_end = actpos;
- }
- break;
- case LFUN_END:
- for(; actpos < rows[actrow + 1].pos; ++actpos)
- cx += SingleWidth(bv->getPainter(), par, actpos);
- if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- } else {
- selection_start = selection_end = actpos;
- }
- break;
- case LFUN_MATH_MODE: // Open or create a math inset
- InsertInset(bv, new InsetFormula);
- if (hasSelection()) {
- selection_start = selection_end = actpos;
- bv->updateInset(this, false);
- } else {
- selection_start = selection_end = actpos;
- }
- return DISPATCHED;
- default:
- result = UNDISPATCHED;
- break;
+ case LFUN_RIGHTSEL:
+ bv->text->FinishUndo();
+ moveRight(bv, false);
+ selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ break;
+ case LFUN_RIGHT:
+ bv->text->FinishUndo();
+ result = moveRight(bv);
+ if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ } else {
+ selection_start_cursor = selection_end_cursor = cursor;
+ }
+ break;
+ case LFUN_LEFTSEL:
+ bv->text->FinishUndo();
+ moveLeft(bv, false);
+ selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ break;
+ case LFUN_LEFT:
+ bv->text->FinishUndo();
+ result= moveLeft(bv);
+ if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ } else {
+ selection_start_cursor = selection_end_cursor = cursor;
+ }
+ break;
+ case LFUN_DOWNSEL:
+ bv->text->FinishUndo();
+ moveDown(bv);
+ selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ break;
+ case LFUN_DOWN:
+ bv->text->FinishUndo();
+ result = moveDown(bv);
+ if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ } else {
+ selection_start_cursor = selection_end_cursor = cursor;
+ }
+ break;
+ case LFUN_UPSEL:
+ bv->text->FinishUndo();
+ moveUp(bv);
+ selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ break;
+ case LFUN_UP:
+ bv->text->FinishUndo();
+ result = moveUp(bv);
+ if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ } else {
+ selection_start_cursor = selection_end_cursor = cursor;
+ }
+ break;
+ case LFUN_BACKSPACE:
+ if (!cursor.pos) {
+ if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ }
+ break;
+ }
+ moveLeft(bv);
+ case LFUN_DELETE:
+ {
+ bv->text->SetUndo(Undo::DELETE,
+ bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->previous,
+ bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->next);
+ bool ret = true;
+ if (hasSelection()) {
+ LyXParagraph::size_type i = selection_start_cursor.pos;
+ for (; i < selection_end_cursor.pos; ++i) {
+ par->Erase(selection_start_cursor.pos);
+ }
+ } else
+ ret = Delete();
+ if (ret) { // we need update
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, true);
+ } else if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ }
+ }
+ resetPos(bv->painter());
+ break;
+ case LFUN_CUT:
+ bv->text->SetUndo(Undo::DELETE,
+ bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->previous,
+ bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->next);
+
+ if (cutSelection()) {
+ // we need update
+ cursor = selection_end_cursor = selection_start_cursor;
+ UpdateLocal(bv, true);
+ } else if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ }
+ resetPos(bv->painter());
+ break;
+ case LFUN_COPY:
+ bv->text->FinishUndo();
+ if (copySelection()) {
+ // we need update
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, true);
+ } else if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ }
+ break;
+ case LFUN_PASTE:
+ {
+ bv->text->SetUndo(Undo::INSERT,
+ bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->previous,
+ bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->next);
+ if (pasteSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, true);
+ }
+ }
+ resetPos(bv->painter());
+ break;
+ case LFUN_HOME:
+ bv->text->FinishUndo();
+ for(; cursor.pos > rows[actrow].pos; --cursor.pos)
+ cursor.x -= SingleWidth(bv->painter(), par, cursor.pos);
+ cursor.x -= SingleWidth(bv->painter(), par, cursor.pos);
+ if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ } else {
+ selection_start_cursor = selection_end_cursor = cursor;
+ }
+ resetPos(bv->painter());
+ break;
+ case LFUN_END:
+ {
+ bv->text->FinishUndo();
+ int checkpos = (int)rows[actrow + 1].pos;
+ if ((actrow + 2) < (int)rows.size())
+ --checkpos;
+ for(; cursor.pos < checkpos; ++cursor.pos)
+ cursor.x += SingleWidth(bv->painter(), par, cursor.pos);
+ if (hasSelection()) {
+ selection_start_cursor = selection_end_cursor = cursor;
+ UpdateLocal(bv, false);
+ } else {
+ selection_start_cursor = selection_end_cursor = cursor;
+ }
+ }
+ resetPos(bv->painter());
+ break;
+ case LFUN_MATH_MODE:
+ InsertInset(bv, new InsetFormula);
+ return DISPATCHED;
+ case LFUN_INSET_ERT:
+ InsertInset(bv, new InsetERT(buffer));
+ return DISPATCHED;
+ case LFUN_BREAKPARAGRAPH:
+ case LFUN_BREAKLINE:
+ if (!autoBreakRows)
+ return DISPATCHED;
+ bv->text->SetUndo(Undo::INSERT,
+ bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->previous,
+ bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->next);
+ par->InsertChar(cursor.pos,LyXParagraph::META_NEWLINE);
+ SetCharFont(cursor.pos,current_font);
+ UpdateLocal(bv, true);
+ ++cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
+ resetPos(bv->painter());
+ break;
+ case LFUN_LAYOUT:
+ {
+ // Derive layout number from given argument (string)
+ // and current buffer's textclass (number). */
+ LyXTextClassList::ClassList::size_type tclass =
+ buffer->params.textclass;
+ std::pair <bool, LyXTextClass::size_type> layout =
+ textclasslist.NumberOfLayout(tclass, arg);
+
+ // If the entry is obsolete, use the new one instead.
+ if (layout.first) {
+ string obs = textclasslist.Style(tclass,layout.second).
+ obsoleted_by();
+ if (!obs.empty())
+ layout = textclasslist.NumberOfLayout(tclass, obs);
+ }
+
+ // see if we found the layout number:
+ if (!layout.first) {
+ string msg = string(N_("Layout ")) + arg + N_(" not known");
+
+ bv->owner()->getMiniBuffer()->Set(msg);
+ break;
+ }
+
+ if (current_layout != layout.second) {
+ bv->text->SetLayout(cursor, selection_start_cursor,
+ selection_end_cursor, layout.second);
+ bv->owner()->getToolbar()->combox->select(cursor.par->GetLayout()+1);
+ UpdateLocal(bv, true);
+ }
+ }
+ break;
+ default:
+ result = UNDISPATCHED;
+ break;