X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext3.C;h=a468a7289665a3590980354f8cc5dc346177fa62;hb=eead5ba43d0ddf06544ad1b40063981d3788c635;hp=eae7919996ef97f7220243d76495f2a385cc294e;hpb=bc56bb9ffadbdf457153547851986cf867d22aa1;p=lyx.git diff --git a/src/text3.C b/src/text3.C index eae7919996..a468a72896 100644 --- a/src/text3.C +++ b/src/text3.C @@ -16,38 +16,48 @@ #include "BufferView.h" #include "funcrequest.h" #include "lyxrc.h" +#include "Lsstream.h" #include "debug.h" #include "bufferparams.h" #include "buffer.h" +#include "bufferview_funcs.h" #include "ParagraphParameters.h" #include "gettext.h" #include "factory.h" #include "intl.h" #include "box.h" #include "language.h" +#include "support/tostr.h" #include "support/lstrings.h" +#include "support/LAssert.h" #include "frontends/LyXView.h" #include "frontends/screen.h" #include "frontends/Dialogs.h" #include "insets/insetspecialchar.h" #include "insets/insettext.h" -#include "insets/insetbib.h" #include "insets/insetquotes.h" #include "insets/insetcommand.h" +#include "insets/insetnewline.h" #include "undo_funcs.h" +#include "text_funcs.h" +#include "Lsstream.h" #include #include +using namespace lyx::support; +using namespace bv_funcs; + using std::endl; using std::find; using std::vector; +using lyx::pos_type; extern string current_layout; extern int bibitemMaxWidth(BufferView *, LyXFont const &); // the selection possible is needed, that only motion events are -// used, where the bottom press event was on the drawing area too +// used, where the bottom press event was on the drawing area too bool selection_possible = false; @@ -58,22 +68,16 @@ namespace { LyXText * lt = bv->getLyXText(); if (selecting || lt->selection.mark()) { - lt->setSelection(bv); - if (lt->bv_owner) - bv->toggleToggle(); + lt->setSelection(); + if (lt->isInInset()) + bv->updateInset(lt->inset_owner); else - bv->updateInset(lt->inset_owner, false); + bv->repaint(); } - if (lt->bv_owner) { - //if (fitcur) - // bv->update(lt, BufferView::SELECT|BufferView::FITCUR); - //else - bv->update(lt, BufferView::SELECT|BufferView::FITCUR); - bv->showCursor(); - } else if (bv->text->status() != LyXText::UNCHANGED) { - bv->theLockingInset()->hideInsetCursor(bv); - bv->update(bv->text, BufferView::SELECT|BufferView::FITCUR); - bv->showCursor(); + if (!lt->isInInset()) { + bv->update(lt, BufferView::SELECT); + } else if (bv->text->needRefresh()) { + bv->update(BufferView::SELECT); } if (!lt->selection.set()) @@ -93,43 +97,44 @@ namespace { // check if the given co-ordinates are inside an inset at the // given cursor, if one exists. If so, the inset is returned, // and the co-ordinates are made relative. Otherwise, 0 is returned. - Inset * checkInset(BufferView * bv, LyXText const & text, +InsetOld * checkInset(BufferView * /*bv*/, LyXText & text, LyXCursor const & cur, int & x, int & y) { lyx::pos_type const pos = cur.pos(); - Paragraph /*const*/ & par = *cur.par(); + ParagraphList::iterator par = cur.par(); - if (pos >= par.size() || !par.isInset(pos)) + if (pos >= par->size() || !par->isInset(pos)) return 0; - Inset /*const*/ * inset = par.getInset(pos); + InsetOld /*const*/ * inset = par->getInset(pos); - if (!isEditableInset(inset)) + if (!isEditableInset(inset)) return 0; // get inset dimensions - lyx::Assert(par.getInset(pos)); + Assert(par->getInset(pos)); - LyXFont const & font = text.getFont(bv->buffer(), &par, pos); + LyXFont const & font = text.getFont(par, pos); - int const width = inset->width(bv, font); + int const width = inset->width(); int const inset_x = font.isVisibleRightToLeft() ? (cur.ix() - width) : cur.ix(); Box b( inset_x + inset->scroll(), inset_x + width, - cur.iy() - inset->ascent(bv, font), - cur.iy() + inset->descent(bv, font) + cur.iy() - inset->ascent(), + cur.iy() + inset->descent() ); if (!b.contained(x, y)) { - lyxerr[Debug::GUI] << "Missed inset at x,y " << x << "," << y - << " box " << b << endl; + lyxerr[Debug::GUI] << "Missed inset at x,y " + << x << ',' << y + << " box " << b << endl; return 0; } - text.setCursor(bv, &par, pos, true); + text.setCursor(par, pos, true); x -= b.x1; // The origin of an inset is on the baseline @@ -141,14 +146,14 @@ namespace { } // anon namespace -Inset * LyXText::checkInsetHit(BufferView * bv, int & x, int & y) const +InsetOld * LyXText::checkInsetHit(int & x, int & y) { - int y_tmp = y + first_y; + int y_tmp = y + top_y(); LyXCursor cur; - setCursorFromCoordinates(bv, cur, x, y_tmp); + setCursorFromCoordinates(cur, x, y_tmp); - Inset * inset = checkInset(bv, *this, cur, x, y_tmp); + InsetOld * inset = checkInset(bv(), *this, cur, x, y_tmp); if (inset) { y = y_tmp; return inset; @@ -159,318 +164,346 @@ Inset * LyXText::checkInsetHit(BufferView * bv, int & x, int & y) const return 0; // move back one - setCursor(bv, cur, cur.par(), cur.pos() - 1, true); + setCursor(cur, cur.par(), cur.pos() - 1, true); - inset = checkInset(bv, *this, cur, x, y_tmp); + inset = checkInset(bv(), *this, cur, x, y_tmp); if (inset) y = y_tmp; return inset; } -bool LyXText::gotoNextInset(BufferView * bv, - vector const & codes, string const & contents) const +bool LyXText::gotoNextInset(vector const & codes, + string const & contents) { - LyXCursor res = cursor; - Inset * inset; + ParagraphList::iterator end = ownerParagraphs().end(); + ParagraphList::iterator pit = cursor.par(); + pos_type pos = cursor.pos(); + + InsetOld * inset; do { - if (res.pos() < res.par()->size() - 1) { - res.pos(res.pos() + 1); + if (pos + 1 < pit->size()) { + ++pos; } else { - res.par(res.par()->next()); - res.pos(0); + ++pit; + pos = 0; } - } while (res.par() && - !(res.par()->isInset(res.pos()) - && (inset = res.par()->getInset(res.pos())) != 0 - && find(codes.begin(), codes.end(), inset->lyxCode()) - != codes.end() - && (contents.empty() || - static_cast( - res.par()->getInset(res.pos()))->getContents() - == contents))); - - if (res.par()) { - setCursor(bv, res.par(), res.pos(), false); + } while (pit != end && + !(pit->isInset(pos) && + (inset = pit->getInset(pos)) != 0 && + find(codes.begin(), codes.end(), inset->lyxCode()) != codes.end() && + (contents.empty() || + static_cast(pit->getInset(pos))->getContents() + == contents))); + + if (pit != end) { + setCursor(pit, pos, false); return true; } return false; } -void LyXText::gotoInset(BufferView * bv, vector const & codes, - bool same_content) +void LyXText::gotoInset(vector const & codes, + bool same_content) { - bv->hideCursor(); - bv->beforeChange(this); - update(bv, false); + bv()->beforeChange(this); + update(); string contents; - if (same_content && cursor.par()->isInset(cursor.pos())) { - Inset const * inset = cursor.par()->getInset(cursor.pos()); + if (same_content && cursor.pos() < cursor.par()->size() + && cursor.par()->isInset(cursor.pos())) { + InsetOld const * inset = cursor.par()->getInset(cursor.pos()); if (find(codes.begin(), codes.end(), inset->lyxCode()) != codes.end()) contents = static_cast(inset)->getContents(); } - if (!gotoNextInset(bv, codes, contents)) { - if (cursor.pos() || cursor.par() != ownerParagraph()) { + if (!gotoNextInset(codes, contents)) { + if (cursor.pos() || cursor.par() != ownerParagraphs().begin()) { LyXCursor tmp = cursor; - cursor.par(ownerParagraph()); + cursor.par(ownerParagraphs().begin()); cursor.pos(0); - if (!gotoNextInset(bv, codes, contents)) { + if (!gotoNextInset(codes, contents)) { cursor = tmp; - bv->owner()->message(_("No more insets")); + bv()->owner()->message(_("No more insets")); } } else { - bv->owner()->message(_("No more insets")); + bv()->owner()->message(_("No more insets")); } } - update(bv, false); + update(); selection.cursor = cursor; } -void LyXText::gotoInset(BufferView * bv, Inset::Code code, bool same_content) +void LyXText::gotoInset(InsetOld::Code code, bool same_content) { - gotoInset(bv, vector(1, code), same_content); + gotoInset(vector(1, code), same_content); } -void LyXText::cursorPrevious(BufferView * bv) +void LyXText::cursorPrevious() { - if (!cursor.row()->previous()) { - if (first_y > 0) { - int new_y = bv->text->first_y - bv->workHeight(); - bv->screen().draw(bv->text, bv, new_y < 0 ? 0 : new_y); - bv->updateScrollbar(); - } + int y = top_y(); + + if (cursorRow() == rows().begin()) { + if (y > 0) + bv()->updateScrollbar(); return; } - int y = first_y; - Row * cursorrow = cursor.row(); + RowList::iterator cursorrow = cursorRow(); - setCursorFromCoordinates(bv, cursor.x_fix(), y); + setCursorFromCoordinates(cursor.x_fix(), y); finishUndo(); int new_y; - if (cursorrow == bv->text->cursor.row()) { - // we have a row which is higher than the workarea so we leave the - // cursor on the start of the row and move only the draw up as soon - // as we move the cursor or do something while inside the row (it may - // span several workarea-heights) we'll move to the top again, but this - // is better than just jump down and only display part of the row. - new_y = bv->text->first_y - bv->workHeight(); + if (cursorrow == bv()->text->cursorRow()) { + // we have a row which is taller than the workarea. The + // simplest solution is to move to the previous row instead. + cursorUp(true); + return; + // This is what we used to do, so we wouldn't skip right past + // tall rows, but it's not working right now. } else { if (inset_owner) { - new_y = bv->text->cursor.iy() - + bv->theLockingInset()->insetInInsetY() + y - + cursor.row()->height() - - bv->workHeight() + 1; + new_y = bv()->text->cursor.iy() + + bv()->theLockingInset()->insetInInsetY() + y + + cursorRow()->height() + - bv()->workHeight() + 1; } else { new_y = cursor.y() - - cursor.row()->baseline() - + cursor.row()->height() - - bv->workHeight() + 1; + - cursorRow()->baseline() + + cursorRow()->height() + - bv()->workHeight() + 1; } } - bv->screen().draw(bv->text, bv, new_y < 0 ? 0 : new_y); - if (cursor.row()->previous()) { + //bv()->screen().draw(bv()->text, bv(), new_y < 0 ? 0 : new_y); + if (cursorRow() != rows().begin()) { LyXCursor cur; - setCursor(bv, cur, cursor.row()->previous()->par(), - cursor.row()->previous()->pos(), false); - if (cur.y() > first_y) { - cursorUp(bv, true); + setCursor(cur, boost::prior(cursorRow())->par(), + boost::prior(cursorRow())->pos(), false); + if (cur.y() > top_y()) { + cursorUp(true); } } - bv->updateScrollbar(); + bv()->updateScrollbar(); } -void LyXText::cursorNext(BufferView * bv) +void LyXText::cursorNext() { - if (!cursor.row()->next()) { - int y = cursor.y() - cursor.row()->baseline() + - cursor.row()->height(); - if (y > int(first_y + bv->workHeight())) { - bv->screen().draw(bv->text, bv, - bv->text->first_y + bv->workHeight()); - bv->updateScrollbar(); + int topy = top_y(); + + if (boost::next(cursorRow()) == rows().end()) { + int y = cursor.y() - cursorRow()->baseline() + + cursorRow()->height(); + if (y > topy + bv()->workHeight()) { + //bv()->screen().draw(bv()->text, bv(), bv()->text->top_y() + bv()->workHeight()); + bv()->updateScrollbar(); } return; } - int y = first_y + bv->workHeight(); - if (inset_owner && !first_y) { - y -= (bv->text->cursor.iy() - - bv->text->first_y - + bv->theLockingInset()->insetInInsetY()); + int y = topy + bv()->workHeight(); + if (inset_owner && !topy) { + y -= (bv()->text->cursor.iy() + - bv()->text->top_y() + + bv()->theLockingInset()->insetInInsetY()); } getRowNearY(y); - Row * cursorrow = cursor.row(); - setCursorFromCoordinates(bv, cursor.x_fix(), y); + RowList::iterator cursorrow = cursorRow(); + setCursorFromCoordinates(cursor.x_fix(), y); // + bv->workHeight()); finishUndo(); int new_y; - if (cursorrow == bv->text->cursor.row()) { - // we have a row which is higher than the workarea so we leave the - // cursor on the start of the row and move only the draw down as soon - // as we move the cursor or do something while inside the row (it may - // span several workarea-heights) we'll move to the top again, but this - // is better than just jump down and only display part of the row. - new_y = bv->text->first_y + bv->workHeight(); + if (cursorrow == bv()->text->cursorRow()) { + // we have a row which is taller than the workarea. The + // simplest solution is to move to the next row instead. + cursorDown(true); + return; + // This is what we used to do, so we wouldn't skip right past + // tall rows, but it's not working right now. +#if 0 + new_y = bv->text->top_y() + bv->workHeight(); +#endif } else { if (inset_owner) { - new_y = bv->text->cursor.iy() - + bv->theLockingInset()->insetInInsetY() - + y - cursor.row()->baseline(); + new_y = bv()->text->cursor.iy() + + bv()->theLockingInset()->insetInInsetY() + + y - cursorRow()->baseline(); } else { - new_y = cursor.y() - cursor.row()->baseline(); + new_y = cursor.y() - cursorRow()->baseline(); } } - bv->screen().draw(bv->text, bv, new_y); - if (cursor.row()->next()) { + //bv()->screen().draw(bv()->text, bv(), new_y); + + RowList::iterator next_row = boost::next(cursorRow()); + if (next_row != rows().end()) { LyXCursor cur; - setCursor(bv, cur, cursor.row()->next()->par(), - cursor.row()->next()->pos(), false); - if (cur.y() < int(first_y + bv->workHeight())) { - cursorDown(bv, true); + setCursor(cur, next_row->par(), next_row->pos(), false); + if (cur.y() < top_y() + bv()->workHeight()) { + cursorDown(true); } } - bv->updateScrollbar(); + bv()->updateScrollbar(); } -void LyXText::update(BufferView * bv, bool changed) +void LyXText::update() { - BufferView::UpdateCodes c = BufferView::SELECT | BufferView::FITCUR; - if (changed) - bv->update(this, c | BufferView::CHANGE); - else - bv->update(this, c); + bv()->update(this, BufferView::SELECT); } +namespace { void specialChar(LyXText * lt, BufferView * bv, InsetSpecialChar::Kind kind) { - bv->hideCursor(); - lt->update(bv); + lt->update(); InsetSpecialChar * new_inset = new InsetSpecialChar(kind); + replaceSelection(lt); if (!bv->insertInset(new_inset)) delete new_inset; else - bv->updateInset(new_inset, true); + bv->updateInset(new_inset); } -Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) +void doInsertInset(LyXText * lt, FuncRequest const & cmd, + bool edit, bool pastesel) +{ + InsetOld * inset = createInset(cmd); + BufferView * bv = cmd.view(); + + if (inset) { + bool gotsel = false; + if (lt->selection.set()) { + bv->owner()->dispatch(FuncRequest(LFUN_CUT)); + gotsel = true; + } + if (bv->insertInset(inset)) { + if (edit) { + FuncRequest cmd(bv, LFUN_INSET_EDIT, "left"); + inset->localDispatch(cmd); + } + if (gotsel && pastesel) + bv->owner()->dispatch(FuncRequest(LFUN_PASTE)); + } + else + delete inset; + } +} + +} + +InsetOld::RESULT LyXText::dispatch(FuncRequest const & cmd) { lyxerr[Debug::ACTION] << "LyXFunc::dispatch: action[" << cmd.action - <<"] arg[" << cmd.argument << "]" << endl; + <<"] arg[" << cmd.argument << ']' << endl; BufferView * bv = cmd.view(); switch (cmd.action) { case LFUN_APPENDIX: { - Paragraph * par = cursor.par(); - bool start = !par->params().startOfAppendix(); + ParagraphList::iterator pit = cursor.par(); + bool start = !pit->params().startOfAppendix(); // ensure that we have only one start_of_appendix in this document - Paragraph * tmp = ownerParagraph(); - for (; tmp; tmp = tmp->next()) - tmp->params().startOfAppendix(false); + ParagraphList::iterator tmp = ownerParagraphs().begin(); + ParagraphList::iterator end = ownerParagraphs().end(); + + for (; tmp != end; ++tmp) { + if (tmp->params().startOfAppendix()) { + recordUndo(bv, Undo::ATOMIC, tmp); + tmp->params().startOfAppendix(false); + int tmpy; + setHeightOfRow(getRow(tmp, 0, tmpy)); + break; + } + } - par->params().startOfAppendix(start); + recordUndo(bv, Undo::ATOMIC, pit); + pit->params().startOfAppendix(start); // we can set the refreshing parameters now - status(cmd.view(), LyXText::NEED_MORE_REFRESH); - refresh_y = 0; - refresh_row = 0; // not needed for full update - updateCounters(cmd.view()); - setCursor(cmd.view(), cursor.par(), cursor.pos()); - update(bv); + updateCounters(); + redoHeightOfParagraph(); + postPaint(); + setCursor(cursor.par(), cursor.pos()); + update(); break; } case LFUN_DELETE_WORD_FORWARD: bv->beforeChange(this); - update(bv, false); - deleteWordForward(bv); - update(bv); + update(); + deleteWordForward(); + update(); finishChange(bv); break; case LFUN_DELETE_WORD_BACKWARD: bv->beforeChange(this); - update(bv, false); - deleteWordBackward(bv); - update(bv, true); + update(); + deleteWordBackward(); + update(); finishChange(bv); break; case LFUN_DELETE_LINE_FORWARD: bv->beforeChange(this); - update(bv, false); - deleteLineForward(bv); - update(bv); - finishChange(bv); - break; - - case LFUN_SHIFT_TAB: - case LFUN_TAB: - if (!selection.mark()) - bv->beforeChange(this); - update(bv, false); - cursorTab(bv); + update(); + deleteLineForward(); + update(); finishChange(bv); break; case LFUN_WORDRIGHT: if (!selection.mark()) bv->beforeChange(this); - update(bv, false); + update(); if (cursor.par()->isRightToLeftPar(bv->buffer()->params)) - cursorLeftOneWord(bv); + cursorLeftOneWord(); else - cursorRightOneWord(bv); + cursorRightOneWord(); finishChange(bv); break; case LFUN_WORDLEFT: if (!selection.mark()) bv->beforeChange(this); - update(bv, false); + update(); if (cursor.par()->isRightToLeftPar(bv->buffer()->params)) - cursorRightOneWord(bv); + cursorRightOneWord(); else - cursorLeftOneWord(bv); + cursorLeftOneWord(); finishChange(bv); break; case LFUN_BEGINNINGBUF: if (!selection.mark()) bv->beforeChange(this); - update(bv, false); - cursorTop(bv); + update(); + cursorTop(); finishChange(bv); break; case LFUN_ENDBUF: if (selection.mark()) bv->beforeChange(this); - update(bv, false); - cursorBottom(bv); + update(); + cursorBottom(); finishChange(bv); break; case LFUN_RIGHTSEL: - update(bv, false); + update(); if (cursor.par()->isRightToLeftPar(bv->buffer()->params)) cursorLeft(bv); else @@ -479,7 +512,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) break; case LFUN_LEFTSEL: - update(bv, false); + update(); if (cursor.par()->isRightToLeftPar(bv->buffer()->params)) cursorRight(bv); else @@ -488,88 +521,101 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) break; case LFUN_UPSEL: - update(bv, false); - cursorUp(bv, true); + update(); + cursorUp(true); finishChange(bv, true); break; case LFUN_DOWNSEL: - update(bv, false); - cursorDown(bv, true); + update(); + cursorDown(true); finishChange(bv, true); break; case LFUN_UP_PARAGRAPHSEL: - update(bv, false); - cursorUpParagraph(bv); + update(); + cursorUpParagraph(); finishChange(bv, true); break; case LFUN_DOWN_PARAGRAPHSEL: - update(bv, false); - cursorDownParagraph(bv); + update(); + cursorDownParagraph(); finishChange(bv, true); break; case LFUN_PRIORSEL: - update(bv, false); - cursorPrevious(bv); + update(); + cursorPrevious(); finishChange(bv, true); break; case LFUN_NEXTSEL: - update(bv, false); - cursorNext(bv); + update(); + cursorNext(); finishChange(bv, true); break; case LFUN_HOMESEL: - update(bv, false); - cursorHome(bv); + update(); + cursorHome(); finishChange(bv, true); break; case LFUN_ENDSEL: - update(bv, false); - cursorEnd(bv); + update(); + cursorEnd(); finishChange(bv, true); break; case LFUN_WORDRIGHTSEL: - update(bv, false); + update(); if (cursor.par()->isRightToLeftPar(bv->buffer()->params)) - cursorLeftOneWord(bv); + cursorLeftOneWord(); else - cursorRightOneWord(bv); + cursorRightOneWord(); finishChange(bv, true); break; case LFUN_WORDLEFTSEL: - update(bv, false); + update(); if (cursor.par()->isRightToLeftPar(bv->buffer()->params)) - cursorRightOneWord(bv); + cursorRightOneWord(); else - cursorLeftOneWord(bv); + cursorLeftOneWord(); + finishChange(bv, true); + break; + + case LFUN_WORDSEL: { + update(); + LyXCursor cur1 = cursor; + LyXCursor cur2; + ::getWord(cur1, cur2, lyx::WHOLE_WORD, ownerParagraphs()); + setCursor(cur1.par(), cur1.pos()); + bv->beforeChange(this); + setCursor(cur2.par(), cur2.pos()); finishChange(bv, true); break; + } case LFUN_RIGHT: { bool is_rtl = cursor.par()->isRightToLeftPar(bv->buffer()->params); if (!selection.mark()) bv->beforeChange(this); - update(bv); + update(); if (is_rtl) - cursorLeft(bv, false); + cursorLeft(false); if (cursor.pos() < cursor.par()->size() && cursor.par()->isInset(cursor.pos()) && isHighlyEditableInset(cursor.par()->getInset(cursor.pos()))) { - Inset * tmpinset = cursor.par()->getInset(cursor.pos()); + InsetOld * tmpinset = cursor.par()->getInset(cursor.pos()); cmd.message(tmpinset->editMessage()); - tmpinset->edit(bv, !is_rtl); + FuncRequest cmd1(bv, LFUN_INSET_EDIT, is_rtl ? "right" : "left"); + tmpinset->localDispatch(cmd1); break; } if (!is_rtl) - cursorRight(bv, false); + cursorRight(false); finishChange(bv); break; } @@ -580,21 +626,22 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) bool const is_rtl = cursor.par()->isRightToLeftPar(bv->buffer()->params); if (!selection.mark()) bv->beforeChange(this); - update(bv); + update(); LyXCursor const cur = cursor; if (!is_rtl) - cursorLeft(bv, false); + cursorLeft(false); if ((is_rtl || cur != cursor) && // only if really moved! cursor.pos() < cursor.par()->size() && cursor.par()->isInset(cursor.pos()) && isHighlyEditableInset(cursor.par()->getInset(cursor.pos()))) { - Inset * tmpinset = cursor.par()->getInset(cursor.pos()); + InsetOld * tmpinset = cursor.par()->getInset(cursor.pos()); cmd.message(tmpinset->editMessage()); - tmpinset->edit(bv, is_rtl); + FuncRequest cmd1(bv, LFUN_INSET_EDIT, is_rtl ? "left" : "right"); + tmpinset->localDispatch(cmd1); break; } if (is_rtl) - cursorRight(bv, false); + cursorRight(false); finishChange(bv); break; } @@ -603,7 +650,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (!selection.mark()) bv->beforeChange(this); bv->update(this, BufferView::UPDATE); - cursorUp(bv); + cursorUp(false); finishChange(bv); break; @@ -611,7 +658,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (!selection.mark()) bv->beforeChange(this); bv->update(this, BufferView::UPDATE); - cursorDown(bv); + cursorDown(false); finishChange(bv); break; @@ -619,7 +666,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (!selection.mark()) bv->beforeChange(this); bv->update(this, BufferView::UPDATE); - cursorUpParagraph(bv); + cursorUpParagraph(); finishChange(bv); break; @@ -627,7 +674,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (!selection.mark()) bv->beforeChange(this); bv->update(this, BufferView::UPDATE); - cursorDownParagraph(bv); + cursorDownParagraph(); finishChange(bv, false); break; @@ -635,58 +682,60 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (!selection.mark()) bv->beforeChange(this); bv->update(this, BufferView::UPDATE); - cursorPrevious(bv); + cursorPrevious(); finishChange(bv, false); - // was: - // finishUndo(); - // moveCursorUpdate(bv, false, false); - // owner_->view_state_changed(); break; case LFUN_NEXT: if (!selection.mark()) bv->beforeChange(this); bv->update(this, BufferView::UPDATE); - cursorNext(bv); + cursorNext(); finishChange(bv, false); break; case LFUN_HOME: if (!selection.mark()) bv->beforeChange(this); - update(bv); - cursorHome(bv); + update(); + cursorHome(); finishChange(bv, false); break; case LFUN_END: if (!selection.mark()) bv->beforeChange(this); - update(bv); - cursorEnd(bv); + update(); + cursorEnd(); finishChange(bv, false); break; - case LFUN_BREAKLINE: - bv->beforeChange(this); - insertChar(bv, Paragraph::META_NEWLINE); - update(bv, true); - setCursor(bv, cursor.par(), cursor.pos()); + case LFUN_BREAKLINE: { + lyx::pos_type body = cursor.par()->beginningOfBody(); + + // Not allowed by LaTeX (labels or empty par) + if (cursor.pos() <= body) + break; + + replaceSelection(bv->getLyXText()); + insertInset(new InsetNewline); + update(); + setCursor(cursor.par(), cursor.pos()); moveCursorUpdate(bv, false); break; + } case LFUN_DELETE: if (!selection.set()) { - Delete(bv); + Delete(); selection.cursor = cursor; - update(bv); + update(); // It is possible to make it a lot faster still // just comment out the line below... - bv->showCursor(); } else { - update(bv, false); - cutSelection(bv, true); - update(bv); + update(); + cutSelection(true, false); + update(); } moveCursorUpdate(bv, false); bv->owner()->view_state_changed(); @@ -703,7 +752,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (cur.pos() == 0 && !(cur.par()->params().spaceTop() == VSpace (VSpace::NONE))) { - setParagraph(bv, + setParagraph( cur.par()->params().lineTop(), cur.par()->params().lineBottom(), cur.par()->params().pagebreakTop(), @@ -714,38 +763,37 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) cur.par()->params().align(), cur.par()->params().labelWidthString(), 0); cursorLeft(bv); - update(bv); + update(); } else { cursorLeft(bv); - Delete(bv); + Delete(); selection.cursor = cursor; } } else { - Delete(bv); + Delete(); selection.cursor = cursor; } } else { - update(bv, false); - cutSelection(bv, true); + update(); + cutSelection(true, false); } - update(bv); + update(); break; case LFUN_BACKSPACE: if (!selection.set()) { if (bv->owner()->getIntl().getTransManager().backspace()) { - backspace(bv); + backspace(); selection.cursor = cursor; - update(bv); + update(); // It is possible to make it a lot faster still // just comment out the line below... - bv->showCursor(); } } else { - update(bv, false); - cutSelection(bv, true); - update(bv); + update(); + cutSelection(true, false); + update(); } bv->owner()->view_state_changed(); bv->switchKeyMap(); @@ -758,7 +806,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (cur.pos() == 0 && !(cur.par()->params().spaceTop() == VSpace (VSpace::NONE))) { - setParagraph(bv, + setParagraph( cur.par()->params().lineTop(), cur.par()->params().lineBottom(), cur.par()->params().pagebreakTop(), @@ -768,29 +816,29 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) cur.par()->params().align(), cur.par()->params().labelWidthString(), 0); } else { - backspace(bv); + backspace(); selection.cursor = cur; } } else { - update(bv, false); - cutSelection(bv, true); + update(); + cutSelection(true, false); } - update(bv); + update(); break; case LFUN_BREAKPARAGRAPH: - bv->beforeChange(this); - breakParagraph(bv, 0); - update(bv); + replaceSelection(bv->getLyXText()); + breakParagraph(bv->buffer()->paragraphs, 0); + update(); selection.cursor = cursor; bv->switchKeyMap(); bv->owner()->view_state_changed(); break; case LFUN_BREAKPARAGRAPHKEEPLAYOUT: - bv->beforeChange(this); - breakParagraph(bv, 1); - update(bv); + replaceSelection(bv->getLyXText()); + breakParagraph(bv->buffer()->paragraphs, 1); + update(); selection.cursor = cursor; bv->switchKeyMap(); bv->owner()->view_state_changed(); @@ -801,10 +849,10 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) // indentation and add a "defskip" at the top. // Otherwise, do the same as LFUN_BREAKPARAGRAPH. LyXCursor cur = cursor; - bv->beforeChange(this); + replaceSelection(bv->getLyXText()); if (cur.pos() == 0) { if (cur.par()->params().spaceTop() == VSpace(VSpace::NONE)) { - setParagraph(bv, + setParagraph( cur.par()->params().lineTop(), cur.par()->params().lineBottom(), cur.par()->params().pagebreakTop(), @@ -813,14 +861,12 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) cur.par()->params().spacing(), cur.par()->params().align(), cur.par()->params().labelWidthString(), 1); - //update(bv); } } else { - breakParagraph(bv, 0); - //update(bv); + breakParagraph(bv->buffer()->paragraphs, 0); } - update(bv); + update(); selection.cursor = cur; bv->switchKeyMap(); bv->owner()->view_state_changed(); @@ -828,13 +874,13 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) } case LFUN_PARAGRAPH_SPACING: { - Paragraph * par = cursor.par(); - Spacing::Space cur_spacing = par->params().spacing().getSpace(); + ParagraphList::iterator pit = cursor.par(); + Spacing::Space cur_spacing = pit->params().spacing().getSpace(); float cur_value = 1.0; if (cur_spacing == Spacing::Other) - cur_value = par->params().spacing().getValue(); + cur_value = pit->params().spacing().getValue(); - istringstream is(cmd.argument.c_str()); + istringstream is(STRCONV(cmd.argument)); string tmp; is >> tmp; Spacing::Space new_spacing = cur_spacing; @@ -862,28 +908,32 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) << cmd.argument << endl; } if (cur_spacing != new_spacing || cur_value != new_value) { - par->params().spacing(Spacing(new_spacing, new_value)); - redoParagraph(bv); - update(bv); + pit->params().spacing(Spacing(new_spacing, new_value)); + redoParagraph(); + update(); } break; } + case LFUN_INSET_SETTINGS: + Assert(bv->theLockingInset()); + bv->theLockingInset()->getLockingInset()->showInsetDialog(bv); + break; + case LFUN_INSET_TOGGLE: - bv->hideCursor(); bv->beforeChange(this); - update(bv, false); - toggleInset(bv); - update(bv, false); + update(); + toggleInset(); + update(); bv->switchKeyMap(); break; - case LFUN_PROTECTEDSPACE: + case LFUN_SPACE_INSERT: if (cursor.par()->layout()->free_spacing) { - insertChar(bv, ' '); - update(bv); + insertChar(' '); + update(); } else { - specialChar(this, bv, InsetSpecialChar::PROTECTED_SEPARATOR); + doInsertInset(this, cmd, false, false); } moveCursorUpdate(bv, false); break; @@ -900,13 +950,6 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) specialChar(this, bv, InsetSpecialChar::LDOTS); break; - case LFUN_HFILL: - bv->hideCursor(); - update(bv, false); - insertChar(bv, Paragraph::META_HFILL); - update(bv); - break; - case LFUN_END_OF_SENTENCE: specialChar(this, bv, InsetSpecialChar::END_OF_SENTENCE); break; @@ -917,7 +960,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_MARK_OFF: bv->beforeChange(this); - update(bv, false); + update(); selection.cursor = cursor; cmd.message(N_("Mark off")); break; @@ -925,7 +968,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_MARK_ON: bv->beforeChange(this); selection.mark(true); - update(bv, false); + update(); selection.cursor = cursor; cmd.message(N_("Mark on")); break; @@ -933,88 +976,92 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_SETMARK: bv->beforeChange(this); if (selection.mark()) { - update(bv); + update(); cmd.message(N_("Mark removed")); } else { selection.mark(true); - update(bv); + update(); cmd.message(N_("Mark set")); } selection.cursor = cursor; break; case LFUN_UPCASE_WORD: - update(bv, false); - changeCase(bv, LyXText::text_uppercase); + update(); + changeCase(LyXText::text_uppercase); if (inset_owner) - bv->updateInset(inset_owner, true); - update(bv); + bv->updateInset(inset_owner); + update(); break; case LFUN_LOWCASE_WORD: - update(bv, false); - changeCase(bv, LyXText::text_lowercase); + update(); + changeCase(LyXText::text_lowercase); if (inset_owner) - bv->updateInset(inset_owner, true); - update(bv); + bv->updateInset(inset_owner); + update(); break; case LFUN_CAPITALIZE_WORD: - update(bv, false); - changeCase(bv, LyXText::text_capitalization); + update(); + changeCase(LyXText::text_capitalization); if (inset_owner) - bv->updateInset(inset_owner, true); - update(bv); + bv->updateInset(inset_owner); + update(); break; case LFUN_TRANSPOSE_CHARS: - update(bv, false); - transposeChars(*bv); + update(); + recordUndo(bv, Undo::ATOMIC, cursor.par()); + if (transposeChars(cursor)) + checkParagraph(cursor.par(), cursor.pos()); if (inset_owner) - bv->updateInset(inset_owner, true); - update(bv); + bv->updateInset(inset_owner); + update(); break; - case LFUN_PASTE: + case LFUN_PASTE: { cmd.message(_("Paste")); - bv->hideCursor(); - // clear the selection - bv->toggleSelection(); - clearSelection(); - update(bv, false); - pasteSelection(bv); + replaceSelection(bv->getLyXText()); + size_t sel_index = 0; + string const & arg = cmd.argument; + if (isStrUnsignedInt(arg)) { + size_t const paste_arg = strToUnsignedInt(arg); +#warning FIXME Check if the arg is in the domain of available selections. + sel_index = paste_arg; + } + pasteSelection(sel_index); clearSelection(); // bug 393 - update(bv, false); - update(bv); + update(); bv->switchKeyMap(); break; + } case LFUN_CUT: - bv->hideCursor(); - update(bv, false); - cutSelection(bv, true); - update(bv); + update(); + cutSelection(true, true); + update(); cmd.message(_("Cut")); break; case LFUN_COPY: - copySelection(bv); + copySelection(); cmd.message(_("Copy")); break; case LFUN_BEGINNINGBUFSEL: if (inset_owner) - return Inset::UNDISPATCHED; - update(bv, false); - cursorTop(bv); + return UNDISPATCHED; + update(); + cursorTop(); finishChange(bv, true); break; case LFUN_ENDBUFSEL: if (inset_owner) - return Inset::UNDISPATCHED; - update(bv, false); - cursorBottom(bv); + return UNDISPATCHED; + update(); + cursorBottom(); finishChange(bv, true); break; @@ -1025,13 +1072,13 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_SETXY: { int x = 0; int y = 0; - istringstream is(cmd.argument.c_str()); + istringstream is(STRCONV(cmd.argument)); is >> x >> y; if (!is) lyxerr << "SETXY: Could not parse coordinates in '" << cmd.argument << std::endl; - else - setCursorFromCoordinates(bv, x, y); + else + setCursorFromCoordinates(x, y); break; } @@ -1082,25 +1129,27 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) } bool change_layout = (current_layout != layout); + if (!change_layout && selection.set() && selection.start.par() != selection.end.par()) { - Paragraph * spar = selection.start.par(); - Paragraph * epar = selection.end.par()->next(); - while (spar != epar) { - if (spar->layout()->name() != current_layout) { + ParagraphList::iterator spit = selection.start.par(); + ParagraphList::iterator epit = boost::next(selection.end.par()); + while (spit != epit) { + if (spit->layout()->name() != current_layout) { change_layout = true; break; } + ++spit; } } + if (change_layout) { - bv->hideCursor(); current_layout = layout; - update(bv, false); - setLayout(bv, layout); + update(); + setLayout(layout); bv->owner()->setLayout(layout); - update(bv); + update(); bv->switchKeyMap(); } break; @@ -1109,55 +1158,54 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_PASTESELECTION: { if (!bv->buffer()) break; - bv->hideCursor(); // this was originally a beforeChange(bv->text), i.e // the outermost LyXText! bv->beforeChange(this); string const clip = bv->getClipboard(); if (!clip.empty()) { if (cmd.argument == "paragraph") - insertStringAsParagraphs(bv, clip); + insertStringAsParagraphs(clip); else - insertStringAsLines(bv, clip); + insertStringAsLines(clip); clearSelection(); - update(bv); + update(); } break; } case LFUN_GOTOERROR: - gotoInset(bv, Inset::ERROR_CODE, false); + gotoInset(InsetOld::ERROR_CODE, false); break; case LFUN_GOTONOTE: - gotoInset(bv, Inset::NOTE_CODE, false); + gotoInset(InsetOld::NOTE_CODE, false); break; case LFUN_REFERENCE_GOTO: { - vector tmp; - tmp.push_back(Inset::LABEL_CODE); - tmp.push_back(Inset::REF_CODE); - gotoInset(bv, tmp, true); + vector tmp; + tmp.push_back(InsetOld::LABEL_CODE); + tmp.push_back(InsetOld::REF_CODE); + gotoInset(tmp, true); break; } case LFUN_QUOTE: { - Paragraph const * par = cursor.par(); + replaceSelection(bv->getLyXText()); + ParagraphList::iterator pit = cursor.par(); lyx::pos_type pos = cursor.pos(); char c; if (!pos) c = ' '; - else if (par->isInset(pos - 1) && par->getInset(pos - 1)->isSpace()) + else if (pit->isInset(pos - 1) && pit->getInset(pos - 1)->isSpace()) c = ' '; else - c = par->getChar(pos - 1); + c = pit->getChar(pos - 1); - bv->hideCursor(); - LyXLayout_ptr const & style = par->layout(); + LyXLayout_ptr const & style = pit->layout(); if (style->pass_thru || - par->getFontSettings(bv->buffer()->params, + pit->getFontSettings(bv->buffer()->params, pos).language()->lang() == "hebrew" || (!bv->insertInset(new InsetQuotes(c, bv->buffer()->params)))) bv->owner()->dispatch(FuncRequest(LFUN_SELFINSERT, "\"")); @@ -1165,6 +1213,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) } case LFUN_DATE_INSERT: { + replaceSelection(bv->getLyXText()); time_t now_time_t = time(NULL); struct tm * now_tm = localtime(&now_time_t); setlocale(LC_TIME, ""); @@ -1178,8 +1227,8 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) ::strftime(datetmp, 32, arg.c_str(), now_tm); for (int i = 0; i < datetmp_len; i++) { - insertChar(bv, datetmp[i]); - update(bv, true); + insertChar(datetmp[i]); + update(); } selection.cursor = cursor; moveCursorUpdate(bv, false); @@ -1189,20 +1238,19 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_MOUSE_TRIPLE: if (!bv->buffer()) break; - if (bv_owner && bv->theLockingInset()) + if (!isInInset() && bv->theLockingInset()) break; if (cmd.button() == mouse_button::button1) { - if (bv_owner) { - bv->screen().hideCursor(); + if (!isInInset()) { bv->screen().toggleSelection(this, bv); } - cursorHome(bv); + cursorHome(); selection.cursor = cursor; - cursorEnd(bv); - setSelection(bv); - if (bv_owner) + cursorEnd(); + setSelection(); + if (!isInInset()) bv->screen().toggleSelection(this, bv, false); - update(bv, false); + update(); bv->haveSelection(selection.set()); } break; @@ -1210,18 +1258,17 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_MOUSE_DOUBLE: if (!bv->buffer()) break; - if (bv_owner && bv->theLockingInset()) + if (!isInInset() && bv->theLockingInset()) break; if (cmd.button() == mouse_button::button1) { - if (bv_owner) { - bv->screen().hideCursor(); + if (!isInInset()) { bv->screen().toggleSelection(this, bv); - selectWord(bv, LyXText::WHOLE_WORD_STRICT); + selectWord(lyx::WHOLE_WORD_STRICT); bv->screen().toggleSelection(this, bv, false); } else { - selectWord(bv, LyXText::WHOLE_WORD_STRICT); + selectWord(lyx::WHOLE_WORD_STRICT); } - update(bv, false); + update(); bv->haveSelection(selection.set()); } break; @@ -1237,17 +1284,16 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) // Check for inset locking if (bv->theLockingInset()) { - Inset * tli = bv->theLockingInset(); + InsetOld * tli = bv->theLockingInset(); LyXCursor cursor = bv->text->cursor; - LyXFont font = bv->text->getFont(bv->buffer(), - cursor.par(), cursor.pos()); - int width = tli->width(bv, font); + LyXFont font = bv->text->getFont(cursor.par(), cursor.pos()); + int width = tli->width(); int inset_x = font.isVisibleRightToLeft() ? cursor.ix() - width : cursor.ix(); int start_x = inset_x + tli->scroll(); FuncRequest cmd1 = cmd; cmd1.x = cmd.x - start_x; - cmd1.y = cmd.y - cursor.iy() + bv->text->first_y; + cmd1.y = cmd.y - cursor.iy() + bv->text->top_y(); tli->localDispatch(cmd1); break; } @@ -1261,33 +1307,31 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) break; } - bv->screen().hideCursor(); - - Row * cursorrow = bv->text->cursor.row(); - bv->text->setCursorFromCoordinates(bv, cmd.x, cmd.y + bv->text->first_y); + RowList::iterator cursorrow = bv->text->cursorRow(); + bv->text->setCursorFromCoordinates(cmd.x, cmd.y + bv->text->top_y()); #if 0 // sorry for this but I have a strange error that the y value jumps at // a certain point. This seems like an error in my xforms library or // in some other local environment, but I would like to leave this here // for the moment until I can remove this (Jug 20020418) if (y_before < bv->text->cursor.y()) - lyxerr << y_before << ":" << bv->text->cursor.y() << endl; + lyxerr << y_before << ':' + << bv->text->cursor.y() << endl; #endif // This is to allow jumping over large insets - if (cursorrow == bv->text->cursor.row()) { - if (cmd.y >= int(bv->workHeight())) - bv->text->cursorDown(bv, false); + if (cursorrow == bv->text->cursorRow()) { + if (cmd.y >= bv->workHeight()) + bv->text->cursorDown(false); else if (cmd.y < 0) - bv->text->cursorUp(bv, false); + bv->text->cursorUp(false); } // Maybe an empty line was deleted if (!bv->text->selection.set()) - bv->update(bv->text, BufferView::UPDATE); - bv->text->setSelection(bv); - bv->screen().toggleToggle(bv->text, bv); + bv->update(BufferView::UPDATE); + bv->text->setSelection(); + bv->repaint(); bv->fitCursor(); - bv->showCursor(); break; } @@ -1312,7 +1356,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) int x = cmd.x; int y = cmd.y; - Inset * inset_hit = bv->text->checkInsetHit(bv, x, y); + InsetOld * inset_hit = bv->text->checkInsetHit(x, y); // Middle button press pastes if we have a selection // We do this here as if the selection was inside an inset @@ -1324,7 +1368,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) paste_internally = true; } - int const screen_first = bv->text->first_y; + int const screen_first = bv->text->top_y(); if (bv->theLockingInset()) { // We are in inset locking mode @@ -1341,12 +1385,11 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (!inset_hit) selection_possible = true; - bv->screen().hideCursor(); // Clear the selection bv->screen().toggleSelection(bv->text, bv); bv->text->clearSelection(); - bv->text->fullRebreak(bv); + bv->text->partialRebreak(); bv->update(); bv->updateScrollbar(); @@ -1355,11 +1398,8 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) // Highly editable inset, like math UpdatableInset * inset = static_cast(inset_hit); selection_possible = false; - bv->owner()->updateLayoutChoice(); bv->owner()->message(inset->editMessage()); - //inset->edit(bv, x, y, cmd.button()); // We just have to lock the inset before calling a PressEvent on it! - // we don't need the edit() call here! (Jug20020329) if (!bv->lockInset(inset)) lyxerr[Debug::INSETS] << "Cannot lock inset" << endl; FuncRequest cmd1(bv, LFUN_MOUSE_PRESS, x, y, cmd.button()); @@ -1375,12 +1415,11 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) } if (!inset_hit) // otherwise it was already set in checkInsetHit(...) - bv->text->setCursorFromCoordinates(bv, x, y + screen_first); + bv->text->setCursorFromCoordinates(x, y + screen_first); finishUndo(); bv->text->selection.cursor = bv->text->cursor; bv->text->cursor.x_fix(bv->text->cursor.x()); - bv->owner()->updateLayoutChoice(); if (bv->fitCursor()) selection_possible = false; @@ -1402,7 +1441,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) // do nothing if we used the mouse wheel if (!bv->buffer()) break; - + if (cmd.button() == mouse_button::button4 || cmd.button() == mouse_button::button5) break; @@ -1412,7 +1451,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) // inset, inset_hit is 0, and inset_x == x, inset_y == y. int x = cmd.x; int y = cmd.y; - Inset * inset_hit = bv->text->checkInsetHit(bv, x, y); + InsetOld * inset_hit = bv->text->checkInsetHit(x, y); if (bv->theLockingInset()) { // We are in inset locking mode. @@ -1472,42 +1511,15 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) // (Joacim) // ...or maybe the SetCursorParUndo() // below isn't necessary at all anylonger? - if (inset_hit->lyxCode() == Inset::REF_CODE) - setCursorParUndo(bv); + if (inset_hit->lyxCode() == InsetOld::REF_CODE) + recordUndo(bv, Undo::ATOMIC); bv->owner()->message(inset_hit->editMessage()); - if (isHighlyEditableInset(inset_hit)) { - // Highly editable inset, like math - UpdatableInset * inset = (UpdatableInset *) inset_hit; - FuncRequest cmd1(bv, LFUN_MOUSE_RELEASE, x, y, cmd.button()); - inset->localDispatch(cmd1); - } else { - FuncRequest cmd1(bv, LFUN_MOUSE_RELEASE, x, y, cmd.button()); - inset_hit->localDispatch(cmd1); - // IMO this is a grosshack! Inset's should be changed so that - // they call the actions they have to do with the insetButtonRel. - // function and not in the edit(). This should be changed - // (Jug 20020329) -#ifdef WITH_WARNINGS -#warning Please remove donot call inset->edit() here (Jug 20020812) -#endif - inset_hit->edit(bv, x, y, cmd.button()); - } - break; + FuncRequest cmd1(bv, LFUN_MOUSE_RELEASE, x, y, cmd.button()); + inset_hit->localDispatch(cmd1); } - // Maybe we want to edit a bibitem ale970302 - if (bv->text->cursor.par()->bibkey) { - bool const is_rtl = - bv->text->cursor.par()->isRightToLeftPar(bv->buffer()->params); - int const width = - bibitemMaxWidth(bv, bv->buffer()->params.getLyXTextClass().defaultfont()); - if ((is_rtl && x > bv->text->workWidth(bv)-20-width) || - (!is_rtl && x < 20 + width)) { - bv->text->cursor.par()->bibkey->edit(bv, 0, 0, mouse_button::none); - } - } break; } @@ -1523,8 +1535,8 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) if (lyxrc.auto_region_delete) { if (selection.set()) { - cutSelection(bv, false, false); - update(bv); + cutSelection(false, false); + update(); } bv->haveSelection(false); } @@ -1538,7 +1550,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) bv->owner()->getIntl().getTransManager(). TranslateAndInsert(*cit, this); - update(bv); + update(); selection.cursor = cursor; moveCursorUpdate(bv, false); @@ -1551,13 +1563,15 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_HTMLURL: { InsetCommandParams p("htmlurl"); - bv->owner()->getDialogs().createUrl(p.getAsString()); + string const data = InsetCommandMailer::params2string("url", p); + bv->owner()->getDialogs().show("url", data, 0); break; } case LFUN_URL: { InsetCommandParams p("url"); - bv->owner()->getDialogs().createUrl(p.getAsString()); + string const data = InsetCommandMailer::params2string("url", p); + bv->owner()->getDialogs().show("url", data, 0); break; } @@ -1565,12 +1579,11 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) #if 0 case LFUN_INSET_LIST: case LFUN_INSET_THEOREM: + case LFUN_INSET_CAPTION: #endif case LFUN_INSERT_NOTE: - case LFUN_INSERT_URL: - case LFUN_INSET_CAPTION: + case LFUN_INSERT_BIBITEM: case LFUN_INSET_ERT: - case LFUN_INSET_EXTERNAL: case LFUN_INSET_FLOAT: case LFUN_INSET_FOOTNOTE: case LFUN_INSET_MARGINAL: @@ -1579,33 +1592,27 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) case LFUN_INSET_WIDE_FLOAT: case LFUN_INSET_WRAP: case LFUN_TABULAR_INSERT: + case LFUN_ENVIRONMENT_INSERT: + // Open the inset, and move the current selection + // inside it. + doInsertInset(this, cmd, true, true); + break; + case LFUN_INDEX_INSERT: - case LFUN_INDEX_PRINT: - case LFUN_PARENTINSERT: - case LFUN_TOC_INSERT: - { - Inset * inset = createInset(cmd); - if (inset) { - bool gotsel = false; - if (selection.set()) { - cutSelection(bv, true, false); - gotsel = true; - } - if (bv->insertInset(inset)) { - inset->edit(bv); - if (gotsel) - bv->owner()->dispatch(FuncRequest(LFUN_PASTESELECTION)); - } - else - delete inset; - } + // Just open the inset + doInsertInset(this, cmd, true, false); break; - } + case LFUN_INDEX_PRINT: + case LFUN_TOC_INSERT: + case LFUN_HFILL: + // do nothing fancy + doInsertInset(this, cmd, false, false); + break; default: - return Inset::UNDISPATCHED; + return UNDISPATCHED; } - return Inset::DISPATCHED; + return DISPATCHED; }