X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView_pimpl.C;h=3b70e8d7046dab59d4eb32a9ac73c7d1cbeb29cc;hb=313252eb8bafdba6d934786fd89c988902a0b4d7;hp=a94ef0dedbee284155ad63833cab03feba1d1597;hpb=42a1e2ea5a05435f9b07c6274b966e2ae13d4615;p=lyx.git diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index a94ef0dedb..3b70e8d704 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -16,8 +16,6 @@ #include "lyxrow.h" #include "LyXView.h" #include "commandtags.h" -#include "lyxfunc.h" -#include "minibuffer.h" #include "font.h" #include "bufferview_funcs.h" #include "TextCache.h" @@ -42,6 +40,7 @@ #include "insets/insetref.h" #include "insets/insetparent.h" #include "insets/insetindex.h" +#include "insets/insetinfo.h" #include "insets/insetinclude.h" #include "insets/insetcite.h" #include "insets/insetert.h" @@ -55,21 +54,21 @@ #include "insets/insettabular.h" #include "insets/insettheorem.h" #include "insets/insetcaption.h" +#include "insets/insetfloatlist.h" +#include "insets/insetspecialchar.h" #include "mathed/formulamacro.h" +#include "gettext.h" + extern LyXTextClass::size_type current_layout; -extern void math_insert_symbol(BufferView *, string const &); -extern bool math_insert_greek(BufferView *, char); extern int greek_kb_flag; -#ifdef SIGC_CXX_NAMESPACES -using SigC::slot; -#endif - +using std::vector; using std::find_if; using std::pair; using std::endl; using std::make_pair; using std::min; +using SigC::slot; /* the selection possible is needed, that only motion events are * used, where the bottom press event was on the drawing area too */ @@ -78,19 +77,21 @@ bool selection_possible = false; extern BufferList bufferlist; extern char ascii_type; +extern bool math_insert_greek(BufferView *, char); extern void sigchldhandler(pid_t pid, int * status); extern int bibitemMaxWidth(BufferView *, LyXFont const &); +namespace { + const unsigned int saved_positions_num = 20; -static inline +inline void waitForX() { XSync(fl_get_display(), 0); } -static void SetXtermCursor(Window win) { static Cursor cursor; @@ -104,12 +105,15 @@ void SetXtermCursor(Window win) XFlush(fl_get_display()); } +} // anon namespace + BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o, int xpos, int ypos, int width, int height) : bv_(b), owner_(o), buffer_(0), current_scrollbar_value(0), cursor_timeout(400), - workarea_(xpos, ypos, width, height), using_xterm_cursor(false) + workarea_(xpos, ypos, width, height), using_xterm_cursor(false), + inset_slept(false) { // Setup the signals workarea_.scrollCB.connect(slot(this, &BufferView::Pimpl::scrollCB)); @@ -133,14 +137,10 @@ BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o, workarea_.workAreaKeyPress .connect(slot(this, &BufferView::Pimpl::workAreaKeyPress)); - //screen_ = 0; - cursor_timeout.timeout.connect(slot(this, &BufferView::Pimpl::cursorToggle)); - //current_scrollbar_value = 0; cursor_timeout.start(); workarea_.setFocus(); - //using_xterm_cursor = false; saved_positions.resize(saved_positions_num); } @@ -156,7 +156,7 @@ void BufferView::Pimpl::buffer(Buffer * b) lyxerr[Debug::INFO] << "Setting buffer in BufferView (" << b << ")" << endl; if (buffer_) { - bv_->insetSleep(); + insetSleep(); buffer_->delUser(bv_); // Put the old text into the TextCache, but @@ -178,8 +178,6 @@ void BufferView::Pimpl::buffer(Buffer * b) // Nuke old image // screen is always deleted when the buffer is changed. screen_.reset(0); - //delete screen_; - //screen_ = 0; // If we are closing the buffer, use the first buffer as current if (!buffer_) { @@ -204,7 +202,7 @@ void BufferView::Pimpl::buffer(Buffer * b) // require bv_->text. owner_->getDialogs()->updateBufferDependent(true); redraw(); - bv_->insetWakeup(); + insetWakeup(); } else { lyxerr[Debug::INFO] << " No Buffer!" << endl; owner_->updateMenubar(); @@ -222,7 +220,7 @@ void BufferView::Pimpl::buffer(Buffer * b) } // should update layoutchoice even if we don't have a buffer. owner_->updateLayoutChoice(); - owner_->getMiniBuffer()->Init(); + owner_->updateWindowTitle(); } @@ -251,9 +249,9 @@ void BufferView::Pimpl::redraw() bool BufferView::Pimpl::fitCursor(LyXText * text) { - Assert(screen_.get()); + lyx::Assert(screen_.get()); - bool ret = screen_->FitCursor(text, bv_); + bool const ret = screen_->FitCursor(text, bv_); if (ret) updateScrollbar(); return ret; @@ -287,17 +285,17 @@ int BufferView::Pimpl::resizeCurrentBuffer() ProhibitInput(bv_); - owner_->getMiniBuffer()->Set(_("Formatting document...")); + owner_->message(_("Formatting document...")); if (bv_->text) { par = bv_->text->cursor.par(); pos = bv_->text->cursor.pos(); - selstartpar = bv_->text->sel_start_cursor.par(); - selstartpos = bv_->text->sel_start_cursor.pos(); - selendpar = bv_->text->sel_end_cursor.par(); - selendpos = bv_->text->sel_end_cursor.pos(); - selection = bv_->text->selection; - mark_set = bv_->text->mark_set; + selstartpar = bv_->text->selection.start.par(); + selstartpos = bv_->text->selection.start.pos(); + selendpar = bv_->text->selection.end.par(); + selendpos = bv_->text->selection.end.pos(); + selection = bv_->text->selection.set(); + mark_set = bv_->text->selection.mark(); the_locking_inset = bv_->text->the_locking_inset; delete bv_->text; bv_->text = new LyXText(bv_); @@ -321,20 +319,20 @@ int BufferView::Pimpl::resizeCurrentBuffer() updateScreen(); if (par) { - bv_->text->selection = true; + bv_->text->selection.set(true); /* at this point just to avoid the Delete-Empty-Paragraph * Mechanism when setting the cursor */ - bv_->text->mark_set = mark_set; + bv_->text->selection.mark(mark_set); if (selection) { bv_->text->SetCursor(bv_, selstartpar, selstartpos); - bv_->text->sel_cursor = bv_->text->cursor; + bv_->text->selection.cursor = bv_->text->cursor; bv_->text->SetCursor(bv_, selendpar, selendpos); bv_->text->SetSelection(bv_); bv_->text->SetCursor(bv_, par, pos); } else { bv_->text->SetCursor(bv_, par, pos); - bv_->text->sel_cursor = bv_->text->cursor; - bv_->text->selection = false; + bv_->text->selection.cursor = bv_->text->cursor; + bv_->text->selection.set(false); } // remake the inset locking bv_->text->the_locking_inset = the_locking_inset; @@ -344,11 +342,12 @@ int BufferView::Pimpl::resizeCurrentBuffer() // this will scroll the screen such that the cursor becomes visible updateScrollbar(); redraw(); - owner_->getMiniBuffer()->Init(); - bv_->setState(); + + setState(); AllowInput(bv_); - owner_->getDialogs()->hideSplash(); + /// get rid of the splash screen if it's not gone already + owner_->getDialogs()->destroySplash(); return 0; } @@ -358,8 +357,6 @@ void BufferView::Pimpl::updateScreen() { // Regenerate the screen. screen_.reset(new LyXScreen(workarea_)); - //delete screen_; - //screen_ = new LyXScreen(workarea_); } @@ -369,58 +366,41 @@ void BufferView::Pimpl::updateScrollbar() * maximum must be the working area height. No scrolling will * be possible */ - if (!buffer_) { + if (!bv_->text) { workarea_.setScrollbar(0, 1.0); return; } - - static unsigned long max2 = 0; - static unsigned long height2 = 0; - - unsigned long cbth = 0; - long cbsf = 0; - if (bv_->text) { - cbth = bv_->text->height; - cbsf = bv_->text->first; - } + static unsigned long text_height; + static unsigned long work_height; + unsigned long const tmp_text_height = bv_->text->height; + long const tmp_scrollbar_value = bv_->text->first; + // check if anything has changed. - if (max2 == cbth && - height2 == workarea_.height() && - current_scrollbar_value == cbsf) + if (text_height == tmp_text_height + && work_height == workarea_.height() + && current_scrollbar_value == tmp_scrollbar_value) return; // no - max2 = cbth; - height2 = workarea_.height(); - current_scrollbar_value = cbsf; - if (cbth <= height2) { // text is smaller than screen - workarea_.setScrollbar(0, 1.0); // right? + // update values + text_height = tmp_text_height; + work_height = workarea_.height(); + current_scrollbar_value = tmp_scrollbar_value; + + long const height_diff = text_height - work_height; + + if (height_diff <= 0) { + workarea_.setScrollbar(0, 1.0); return; } - long maximum_height = workarea_.height() * 3 / 4 + cbth; - long value = cbsf; - - // set the scrollbar - double hfloat = workarea_.height(); - double maxfloat = maximum_height; - - float slider_size = 0.0; - int slider_value = value; - - workarea_.setScrollbarBounds(0, bv_->text->height - workarea_.height()); + + workarea_.setScrollbarBounds(0, height_diff); double const lineh = bv_->text->DefaultHeight(); workarea_.setScrollbarIncrements(lineh); - if (maxfloat > 0.0) { - if ((hfloat / maxfloat) * float(height2) < 3) - slider_size = 3.0/float(height2); - else - slider_size = hfloat / maxfloat; - } else - slider_size = hfloat; - - workarea_.setScrollbar(slider_value, slider_size / workarea_.height()); + double const slider_size = 1.0 / double(height_diff) ; + workarea_.setScrollbar(current_scrollbar_value, slider_size); } @@ -493,7 +473,7 @@ int BufferView::Pimpl::scrollDown(long time) double value = workarea_.getScrollbarValue(); pair p = workarea_.getScrollbarBounds(); - double max = p.second; + double const max = p.second; if (value == max) return 0; @@ -533,7 +513,7 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) // Check for inset locking if (bv_->theLockingInset()) { LyXCursor cursor = bv_->text->cursor; - LyXFont font = bv_->text->GetFont(bv_->buffer(), + LyXFont font = bv_->text->GetFont(buffer_, cursor.par(), cursor.pos()); int width = bv_->theLockingInset()->width(bv_, font); int inset_x = font.isVisibleRightToLeft() @@ -547,8 +527,9 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) return; } - /* The test for not selection possible is needed, that only motion events are - * used, where the bottom press event was on the drawing area too */ + /* The test for not selection possible is needed, that only motion + events are used, where the bottom press event was on + the drawing area too */ if (!selection_possible) return; @@ -556,7 +537,7 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) bv_->text->SetCursorFromCoordinates(bv_, x, y + bv_->text->first); - if (!bv_->text->selection) + if (!bv_->text->selection.set()) update(bv_->text, BufferView::UPDATE); // Maybe an empty line was deleted bv_->text->SetSelection(bv_); @@ -570,9 +551,6 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos, unsigned int button) { - last_click_x = -1; - last_click_y = -1; - if (!buffer_ || !screen_.get()) return; Inset * inset_hit = checkInsetHit(bv_->text, xpos, ypos, button); @@ -614,7 +592,7 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos, // Middle button press pastes if we have a selection bool paste_internally = false; if (button == 2 - && bv_->text->selection) { + && bv_->text->selection.set()) { owner_->getLyXFunc()->Dispatch(LFUN_COPY); paste_internally = true; } @@ -633,7 +611,7 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos, UpdatableInset * inset = static_cast(inset_hit); selection_possible = false; owner_->updateLayoutChoice(); - owner_->getMiniBuffer()->Set(inset->EditMessage()); + owner_->message(inset->EditMessage()); inset->InsetButtonPress(bv_, xpos, ypos, button); inset->Edit(bv_, xpos, ypos, button); return; @@ -648,7 +626,7 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos, if (!inset_hit) // otherwise it was already set in checkInsetHit(...) bv_->text->SetCursorFromCoordinates(bv_, xpos, ypos + screen_first); bv_->text->FinishUndo(); - bv_->text->sel_cursor = bv_->text->cursor; + bv_->text->selection.cursor = bv_->text->cursor; bv_->text->cursor.x_fix(bv_->text->cursor.x()); owner_->updateLayoutChoice(); @@ -713,7 +691,7 @@ void BufferView::Pimpl::tripleClick(int /*x*/, int /*y*/, unsigned int button) screen_->HideCursor(); screen_->ToggleSelection(text, bv_); text->CursorHome(bv_); - text->sel_cursor = text->cursor; + text->selection.cursor = text->cursor; text->CursorEnd(bv_); text->SetSelection(bv_); screen_->ToggleSelection(text, bv_, false); @@ -765,9 +743,10 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, selection_possible = false; - if (button >= 2) return; + if (button == 2) + return; - bv_->setState(); + setState(); owner_->showState(); // Did we hit an editable inset? @@ -791,10 +770,11 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, // ...or maybe the SetCursorParUndo() // below isn't necessary at all anylonger? if (inset_hit->LyxCode() == Inset::REF_CODE) { - bv_->text->SetCursorParUndo(bv_->buffer()); + bv_->text->SetCursorParUndo(buffer_); } - owner_->getMiniBuffer()->Set(inset_hit->EditMessage()); + owner_->message(inset_hit->EditMessage()); + if (inset_hit->Editable()==Inset::HIGHLY_EDITABLE) { // Highly editable inset, like math UpdatableInset *inset = (UpdatableInset *)inset_hit; @@ -806,73 +786,6 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, return; } -#ifndef NEW_INSETS - // check whether we want to open a float - if (bv_->text) { - bool hit = false; - char c = ' '; - if (bv_->text->cursor.pos() < - bv_->text->cursor.par()->Last()) { - c = bv_->text->cursor.par()-> - GetChar(bv_->text->cursor.pos()); - } - if(!bv_->text->selection) - if (c == LyXParagraph::META_FOOTNOTE - || c == LyXParagraph::META_MARGIN - || c == LyXParagraph::META_FIG - || c == LyXParagraph::META_TAB - || c == LyXParagraph::META_WIDE_FIG - || c == LyXParagraph::META_WIDE_TAB - || c == LyXParagraph::META_ALGORITHM){ - hit = true; - } else - if (bv_->text->cursor.pos() - 1 >= 0) { - c = bv_->text->cursor.par()-> - GetChar(bv_->text->cursor.pos() - 1); - if (c == LyXParagraph::META_FOOTNOTE - || c == LyXParagraph::META_MARGIN - || c == LyXParagraph::META_FIG - || c == LyXParagraph::META_TAB - || c == LyXParagraph::META_WIDE_FIG - || c == LyXParagraph::META_WIDE_TAB - || c == LyXParagraph::META_ALGORITHM){ - // We are one step too far to the right - bv_->text->CursorLeft(bv_); - hit = true; - } - } - if (hit == true) { - bv_->toggleFloat(); - selection_possible = false; - return; - } - } - // Do we want to close a float? (click on the float-label) - if (bv_->text->cursor.row()->par()->footnoteflag == - LyXParagraph::OPEN_FOOTNOTE - && bv_->text->cursor.row()->previous() && - bv_->text->cursor.row()->previous()->par()-> - footnoteflag != LyXParagraph::OPEN_FOOTNOTE){ - LyXFont font(LyXFont::ALL_SANE); - font.setSize(LyXFont::SIZE_FOOTNOTE); - - int box_x = 20; // LYX_PAPER_MARGIN; - box_x += lyxfont::width(" wide-tab ", font); - - unsigned int screen_first = bv_->text->first; - - if (x < box_x - && y + screen_first > bv_->text->cursor.y() - - bv_->text->cursor.row()->baseline() - && y + screen_first < bv_->text->cursor.y() - - bv_->text->cursor.row()->baseline() - + lyxfont::maxAscent(font) * 1.2 + lyxfont::maxDescent(font) * 1.2) { - bv_->toggleFloat(); - selection_possible = false; - return; - } - } -#else // check whether we want to open a float if (bv_->text) { bool hit = false; @@ -891,7 +804,7 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, return; } } -#endif + // Maybe we want to edit a bibitem ale970302 if (bv_->text->cursor.par()->bibkey && x < 20 + bibitemMaxWidth(bv_, textclasslist. @@ -919,30 +832,28 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, LyXCursor cursor; text->SetCursorFromCoordinates(bv_, cursor, x, y_tmp); + text->SetCursor(bv_, cursor, cursor.par(),cursor.pos(),true); + -#ifndef NEW_INSETS - if (cursor.pos() < cursor.par()->Last() -#else if (cursor.pos() < cursor.par()->size() -#endif && cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET && cursor.par()->GetInset(cursor.pos()) && cursor.par()->GetInset(cursor.pos())->Editable()) { // Check whether the inset really was hit Inset * tmpinset = cursor.par()->GetInset(cursor.pos()); - LyXFont font = text->GetFont(bv_->buffer(), + LyXFont font = text->GetFont(buffer_, cursor.par(), cursor.pos()); - int width = tmpinset->width(bv_, font); - int inset_x = font.isVisibleRightToLeft() + int const width = tmpinset->width(bv_, font); + int const inset_x = font.isVisibleRightToLeft() ? cursor.x() - width : cursor.x(); - int start_x = inset_x + tmpinset->scroll(); - int end_x = inset_x + width; + int const start_x = inset_x + tmpinset->scroll(); + int const end_x = inset_x + width; if (x > start_x && x < end_x && y_tmp > cursor.y() - tmpinset->ascent(bv_, font) && y_tmp < cursor.y() + tmpinset->descent(bv_, font)) { - text->SetCursor(bv_, cursor.par(),cursor.pos(),true); + text->SetCursor(bv_, cursor.par(),cursor.pos(), true); x = x - start_x; // The origin of an inset is on the baseline y = y_tmp - (text->cursor.y()); @@ -955,13 +866,13 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, (cursor.par()->GetInset(cursor.pos() - 1)) && (cursor.par()->GetInset(cursor.pos() - 1)->Editable())) { Inset * tmpinset = cursor.par()->GetInset(cursor.pos()-1); - LyXFont font = text->GetFont(bv_->buffer(), cursor.par(), + LyXFont font = text->GetFont(buffer_, cursor.par(), cursor.pos()-1); - int width = tmpinset->width(bv_, font); - int inset_x = font.isVisibleRightToLeft() + int const width = tmpinset->width(bv_, font); + int const inset_x = font.isVisibleRightToLeft() ? cursor.x() : cursor.x() - width; - int start_x = inset_x + tmpinset->scroll(); - int end_x = inset_x + width; + int const start_x = inset_x + tmpinset->scroll(); + int const end_x = inset_x + width; if (x > start_x && x < end_x && y_tmp > cursor.y() - tmpinset->ascent(bv_, font) @@ -969,7 +880,8 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, #if 0 if (move_cursor && (tmpinset != bv_->theLockingInset())) #endif - text->SetCursor(bv_, cursor.par(),cursor.pos()-1,true); + text->SetCursor(bv_, cursor.par(), + cursor.pos() - 1, true); x = x - start_x; // The origin of an inset is on the baseline y = y_tmp - (text->cursor.y()); @@ -982,11 +894,11 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, void BufferView::Pimpl::workAreaExpose() { - static int work_area_width = 0; - static unsigned int work_area_height = 0; + static int work_area_width; + static unsigned int work_area_height; - bool widthChange = workarea_.workWidth() != work_area_width; - bool heightChange = workarea_.height() != work_area_height; + bool const widthChange = workarea_.workWidth() != work_area_width; + bool const heightChange = workarea_.height() != work_area_height; // update from work area work_area_width = workarea_.workWidth(); @@ -1015,9 +927,6 @@ void BufferView::Pimpl::workAreaExpose() // The main window size has changed, repaint most stuff redraw(); - // ...including the minibuffer - owner_->getMiniBuffer()->Init(); - } else if (screen_.get()) screen_->Redraw(bv_->text, bv_); } else { @@ -1079,15 +988,15 @@ void BufferView::Pimpl::update(LyXText * text, BufferView::UpdateCodes f) { owner_->updateLayoutChoice(); - if (!text->selection && (f & SELECT)) { - text->sel_cursor = text->cursor; + if (!text->selection.set() && (f & SELECT)) { + text->selection.cursor = text->cursor; } text->FullRebreak(bv_); if (text->inset_owner) { text->inset_owner->SetUpdateStatus(bv_, InsetText::NONE); - bv_->updateInset(text->inset_owner, true); + updateInset(text->inset_owner, true); } else update(); @@ -1096,12 +1005,7 @@ void BufferView::Pimpl::update(LyXText * text, BufferView::UpdateCodes f) } if ((f & CHANGE)) { - if (buffer_->isLyxClean()) { - buffer_->markDirty(); - owner_->getMiniBuffer()->setTimer(4); - } else { - buffer_->markDirty(); - } + buffer_->markDirty(); } } @@ -1117,7 +1021,7 @@ void BufferView::Pimpl::cursorToggle() } int status = 1; - int pid = waitpid(static_cast(0), &status, WNOHANG); + int const pid = waitpid(static_cast(0), &status, WNOHANG); if (pid == -1) // error find out what is wrong ; // ignore it for now. else if (pid > 0) @@ -1212,8 +1116,10 @@ void BufferView::Pimpl::savePosition(unsigned int i) saved_positions[i] = Position(buffer_->fileName(), bv_->text->cursor.par()->id(), bv_->text->cursor.pos()); - if (i > 0) - owner_->getMiniBuffer()->Set(_("Saved bookmark ") + tostr(i)); + if (i > 0) { + string const str = _("Saved bookmark") + ' ' + tostr(i); + owner_->message(str); + } } @@ -1222,7 +1128,7 @@ void BufferView::Pimpl::restorePosition(unsigned int i) if (i >= saved_positions_num) return; - string fname = saved_positions[i].filename; + string const fname = saved_positions[i].filename; beforeChange(bv_->text); @@ -1237,16 +1143,14 @@ void BufferView::Pimpl::restorePosition(unsigned int i) if (!par) return; -#ifndef NEW_INSETS - bv_->text->SetCursor(bv_, par, - min(par->Last(), saved_positions[i].par_pos)); -#else bv_->text->SetCursor(bv_, par, min(par->size(), saved_positions[i].par_pos)); -#endif + update(bv_->text, BufferView::SELECT|BufferView::FITCUR); - if (i > 0) - owner_->getMiniBuffer()->Set(_("Moved to bookmark ") + tostr(i)); + if (i > 0) { + string const str = _("Moved to bookmark") + ' ' + tostr(i); + owner_->message(str); + } } @@ -1267,10 +1171,10 @@ void BufferView::Pimpl::setState() LyXText * text = bv_->getLyXText(); if (text->real_current_font.isRightToLeft() && text->real_current_font.latex() != LyXFont::ON) { - if (owner_->getIntl()->primarykeymap) + if (owner_->getIntl()->keymap == Intl::PRIMARY) owner_->getIntl()->KeyMapSec(); } else { - if (!owner_->getIntl()->primarykeymap) + if (owner_->getIntl()->keymap == Intl::SECONDARY) owner_->getIntl()->KeyMapPrim(); } } @@ -1278,19 +1182,19 @@ void BufferView::Pimpl::setState() void BufferView::Pimpl::insetSleep() { - if (bv_->theLockingInset() && !bv_->inset_slept) { + if (bv_->theLockingInset() && !inset_slept) { bv_->theLockingInset()->GetCursorPos(bv_, bv_->slx, bv_->sly); bv_->theLockingInset()->InsetUnlock(bv_); - bv_->inset_slept = true; + inset_slept = true; } } void BufferView::Pimpl::insetWakeup() { - if (bv_->theLockingInset() && bv_->inset_slept) { + if (bv_->theLockingInset() && inset_slept) { bv_->theLockingInset()->Edit(bv_, bv_->slx, bv_->sly, 0); - bv_->inset_slept = false; + inset_slept = false; } } @@ -1298,11 +1202,11 @@ void BufferView::Pimpl::insetWakeup() void BufferView::Pimpl::insetUnlock() { if (bv_->theLockingInset()) { - if (!bv_->inset_slept) + if (!inset_slept) bv_->theLockingInset()->InsetUnlock(bv_); bv_->theLockingInset(0); bv_->text->FinishUndo(); - bv_->inset_slept = false; + inset_slept = false; } } @@ -1402,35 +1306,36 @@ void BufferView::Pimpl::stuffClipboard(string const & stuff) const * Dispatch functions for actions which can be valid for BufferView->text * and/or InsetText->text!!! */ -static LyXText * TEXT(BufferView * bv) { return bv->getLyXText(); } + inline void BufferView::Pimpl::moveCursorUpdate(bool selecting) { - if (selecting || TEXT(bv_)->mark_set) { - TEXT(bv_)->SetSelection(bv_); - if (TEXT(bv_)->bv_owner) - bv_->toggleToggle(); + LyXText * lt = bv_->getLyXText(); + + if (selecting || lt->selection.mark()) { + lt->SetSelection(bv_); + if (lt->bv_owner) + toggleToggle(); } - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); + update(lt, BufferView::SELECT|BufferView::FITCUR); showCursor(); /* ---> Everytime the cursor is moved, show the current font state. */ // should this too me moved out of this func? //owner->showState(); - bv_->setState(); + setState(); } Inset * BufferView::Pimpl::getInsetByCode(Inset::Code code) { - LyXCursor cursor = TEXT(bv_)->cursor; + LyXCursor cursor = bv_->getLyXText()->cursor; Buffer::inset_iterator it = find_if(Buffer::inset_iterator( cursor.par(), cursor.pos()), buffer_->inset_iterator_end(), - compare_memfun(&Inset::LyxCode, code) - ); + lyx::compare_memfun(&Inset::LyxCode, code)); return it != buffer_->inset_iterator_end() ? (*it) : 0; } @@ -1450,12 +1355,17 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen) initpath = trypath; } - FileDialog fileDlg(bv_->owner(), _("Select LyX document to insert"), + FileDialog fileDlg(bv_->owner(), + _("Select LyX document to insert"), LFUN_FILE_INSERT, - make_pair(string(_("Documents")), string(lyxrc.document_path)), - make_pair(string(_("Examples")), string(AddPath(system_lyxdir, "examples")))); - - FileDialog::Result result = fileDlg.Select(initpath, _("*.lyx| LyX Documents (*.lyx)")); + make_pair(string(_("Documents")), + string(lyxrc.document_path)), + make_pair(string(_("Examples")), + string(AddPath(system_lyxdir, "examples")))); + + FileDialog::Result result = + fileDlg.Select(initpath, + _("*.lyx| LyX Documents (*.lyx)")); if (result.first == FileDialog::Later) return; @@ -1464,7 +1374,7 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen) // check selected filename if (filename.empty()) { - owner_->getMiniBuffer()->Set(_("Canceled.")); + owner_->message(_("Canceled.")); return; } } @@ -1476,16 +1386,18 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen) filename += ".lyx"; // Inserts document - owner_->getMiniBuffer()->Set(_("Inserting document"), - MakeDisplayPath(filename), "..."); + string const s1 = _("Inserting document") + ' ' + + MakeDisplayPath(filename) + " ..."; + owner_->message(s1); bool const res = bv_->insertLyXFile(filename); if (res) { - owner_->getMiniBuffer()->Set(_("Document"), - MakeDisplayPath(filename), - _("inserted.")); + string const str = _("Document") + ' ' + + MakeDisplayPath(filename) + ' ' + _("inserted."); + owner_->message(str); } else { - owner_->getMiniBuffer()->Set(_("Could not insert document"), - MakeDisplayPath(filename)); + string const str = _("Could not insert document") + ' ' + + MakeDisplayPath(filename); + owner_->message(str); } } @@ -1495,30 +1407,24 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) switch (action) { // --- Misc ------------------------------------------- case LFUN_APPENDIX: + { if (available()) { - TEXT(bv_)->toggleAppendix(bv_); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + LyXText * lt = bv_->getLyXText(); + lt->toggleAppendix(bv_); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } - break; + } + break; case LFUN_TOC_INSERT: - case LFUN_LOA_INSERT: - case LFUN_LOF_INSERT: - case LFUN_LOT_INSERT: { InsetCommandParams p; - - if (action == LFUN_TOC_INSERT ) - p.setCmdName( "tableofcontents" ); - else if (action == LFUN_LOA_INSERT ) - p.setCmdName( "listofalgorithms" ); - else if (action == LFUN_LOF_INSERT ) - p.setCmdName( "listoffigures" ); - else - p.setCmdName( "listoftables" ); - - Inset * inset = new InsetTOC( p ); - if (!bv_->insertInset( inset, "Standard", true ) ) + p.setCmdName("tableofcontents"); + Inset * inset = new InsetTOC(p); + if (!insertInset(inset, "Standard")) delete inset; break; } @@ -1533,11 +1439,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_GRAPHICS: { Inset * new_inset = new InsetGraphics; - if (!bv_->insertInset(new_inset)) { + if (!insertInset(new_inset)) { delete new_inset; } else { // this is need because you don't use a inset->Edit() - bv_->updateInset(new_inset, true); + updateInset(new_inset, true); new_inset->Edit(bv_, 0, 0, 0); } break; @@ -1574,11 +1480,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) break; case LFUN_GOTOERROR: - bv_->gotoInset(Inset::ERROR_CODE, false); + gotoInset(Inset::ERROR_CODE, false); break; case LFUN_GOTONOTE: - bv_->gotoInset(Inset::IGNORE_CODE, false); + gotoInset(Inset::IGNORE_CODE, false); break; case LFUN_REFERENCE_GOTO: @@ -1586,40 +1492,40 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) vector tmp; tmp.push_back(Inset::LABEL_CODE); tmp.push_back(Inset::REF_CODE); - bv_->gotoInset(tmp, true); + gotoInset(tmp, true); break; } case LFUN_HYPHENATION: - bv_->hyphenationPoint(); + hyphenationPoint(); break; case LFUN_LDOTS: - bv_->ldots(); + ldots(); break; case LFUN_END_OF_SENTENCE: - bv_->endOfSentenceDot(); + endOfSentenceDot(); break; case LFUN_MENU_SEPARATOR: - bv_->menuSeparator(); + menuSeparator(); break; case LFUN_HFILL: - bv_->hfill(); + hfill(); break; case LFUN_DEPTH: - changeDepth(bv_, TEXT(bv_), 0); + changeDepth(bv_, bv_->getLyXText(), 0); break; case LFUN_DEPTH_MIN: - changeDepth(bv_, TEXT(bv_), -1); + changeDepth(bv_, bv_->getLyXText(), -1); break; case LFUN_DEPTH_PLUS: - changeDepth(bv_, TEXT(bv_), 1); + changeDepth(bv_, bv_->getLyXText(), 1); break; case LFUN_FREE: @@ -1676,14 +1582,18 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) } if (current_layout != layout.second) { + LyXText * lt = bv_->getLyXText(); hideCursor(); current_layout = layout.second; - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->SetLayout(bv_, layout.second); + update(lt, + BufferView::SELECT + | BufferView::FITCUR); + lt->SetLayout(bv_, layout.second); owner_->setLayout(layout.second); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); setState(); } } @@ -1745,30 +1655,69 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) break; case LFUN_UPCASE_WORD: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->ChangeWordCase(bv_, LyXText::text_uppercase); - if (TEXT(bv_)->inset_owner) - bv_->updateInset(TEXT(bv_)->inset_owner, true); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - break; + { + LyXText * lt = bv_->getLyXText(); + + update(lt, + BufferView::SELECT + | BufferView::FITCUR); + lt->ChangeWordCase(bv_, LyXText::text_uppercase); + if (lt->inset_owner) + updateInset(lt->inset_owner, true); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } + break; case LFUN_LOWCASE_WORD: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->ChangeWordCase(bv_, LyXText::text_lowercase); - if (TEXT(bv_)->inset_owner) - bv_->updateInset(TEXT(bv_)->inset_owner, true); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - break; + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->ChangeWordCase(bv_, LyXText::text_lowercase); + if (lt->inset_owner) + updateInset(lt->inset_owner, true); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } + break; case LFUN_CAPITALIZE_WORD: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->ChangeWordCase(bv_, - LyXText::text_capitalization); - if (TEXT(bv_)->inset_owner) - bv_->updateInset(TEXT(bv_)->inset_owner, true); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - break; + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->ChangeWordCase(bv_, + LyXText::text_capitalization); + if (lt->inset_owner) + updateInset(lt->inset_owner, true); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } + break; + + case LFUN_TRANSPOSE_CHARS: + { + LyXText * lt = bv_->getLyXText(); + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->TransposeChars(*bv_); + if (lt->inset_owner) + updateInset(lt->inset_owner, true); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } + break; + + case LFUN_INSERT_LABEL: MenuInsertLabel(bv_, argument); break; @@ -1782,10 +1731,10 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) p.setFromString(argument); InsetRef * inset = new InsetRef(p, *buffer_); - if (!bv_->insertInset(inset)) + if (!insertInset(inset)) delete inset; else - bv_->updateInset(inset, true); + updateInset(inset, true); } break; @@ -1822,37 +1771,35 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) // --- Cursor Movements ----------------------------- case LFUN_RIGHT: { - bool is_rtl = TEXT(bv_)->cursor.par()->isRightToLeftPar(buffer_->params); - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); + LyXText * lt = bv_->getLyXText(); + + bool is_rtl = lt->cursor.par()->isRightToLeftPar(buffer_->params); + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); if (is_rtl) - TEXT(bv_)->CursorLeft(bv_, false); -#ifndef NEW_INSETS - if (TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->Last() -#else - if (TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->size() -#endif - && TEXT(bv_)->cursor.par()->GetChar(TEXT(bv_)->cursor.pos()) + lt->CursorLeft(bv_, false); + if (lt->cursor.pos() < lt->cursor.par()->size() + && lt->cursor.par()->GetChar(lt->cursor.pos()) == LyXParagraph::META_INSET - && TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos()) - && TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos())->Editable() == Inset::HIGHLY_EDITABLE){ - Inset * tmpinset = TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos()); + && lt->cursor.par()->GetInset(lt->cursor.pos()) + && lt->cursor.par()->GetInset(lt->cursor.pos())->Editable() == Inset::HIGHLY_EDITABLE){ + Inset * tmpinset = lt->cursor.par()->GetInset(lt->cursor.pos()); owner_->getLyXFunc()->setMessage(tmpinset->EditMessage()); int y = 0; if (is_rtl) { - LyXFont font = - TEXT(bv_)->GetFont(buffer_, - TEXT(bv_)->cursor.par(), - TEXT(bv_)->cursor.pos()); + LyXFont const font = + lt->GetFont(buffer_, + lt->cursor.par(), + lt->cursor.pos()); y = tmpinset->descent(bv_,font); } tmpinset->Edit(bv_, 0, y, 0); break; } if (!is_rtl) - TEXT(bv_)->CursorRight(bv_, false); - TEXT(bv_)->FinishUndo(); + lt->CursorRight(bv_, false); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); } @@ -1862,30 +1809,27 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) { // This is soooo ugly. Isn`t it possible to make // it simpler? (Lgb) - bool is_rtl = TEXT(bv_)->cursor.par()->isRightToLeftPar(buffer_->params); - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - LyXCursor cur = TEXT(bv_)->cursor; + LyXText * lt = bv_->getLyXText(); + bool is_rtl = lt->cursor.par()->isRightToLeftPar(buffer_->params); + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); + LyXCursor const cur = lt->cursor; if (!is_rtl) - TEXT(bv_)->CursorLeft(bv_, false); - if ((is_rtl || cur != TEXT(bv_)->cursor) && // only if really moved! -#ifndef NEW_INSETS - TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->Last() && -#else - TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->size() && -#endif - (TEXT(bv_)->cursor.par()->GetChar(TEXT(bv_)->cursor.pos()) == + lt->CursorLeft(bv_, false); + if ((is_rtl || cur != lt->cursor) && // only if really moved! + lt->cursor.pos() < lt->cursor.par()->size() && + (lt->cursor.par()->GetChar(lt->cursor.pos()) == LyXParagraph::META_INSET) && - TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos()) && - (TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos())->Editable() + lt->cursor.par()->GetInset(lt->cursor.pos()) && + (lt->cursor.par()->GetInset(lt->cursor.pos())->Editable() == Inset::HIGHLY_EDITABLE)) { - Inset * tmpinset = TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos()); + Inset * tmpinset = lt->cursor.par()->GetInset(lt->cursor.pos()); owner_->getLyXFunc()->setMessage(tmpinset->EditMessage()); - LyXFont font = TEXT(bv_)->GetFont(buffer_, - TEXT(bv_)->cursor.par(), - TEXT(bv_)->cursor.pos()); + LyXFont const font = lt->GetFont(buffer_, + lt->cursor.par(), + lt->cursor.pos()); int y = is_rtl ? 0 : tmpinset->descent(bv_,font); tmpinset->Edit(bv_, @@ -1895,338 +1839,468 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) break; } if (is_rtl) - TEXT(bv_)->CursorRight(bv_, false); + lt->CursorRight(bv_, false); - TEXT(bv_)->FinishUndo(); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); } break; case LFUN_UP: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::UPDATE); - TEXT(bv_)->CursorUp(bv_); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::UPDATE); + lt->CursorUp(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_DOWN: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::UPDATE); - TEXT(bv_)->CursorDown(bv_); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::UPDATE); + lt->CursorDown(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_UP_PARAGRAPH: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::UPDATE); - TEXT(bv_)->CursorUpParagraph(bv_); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::UPDATE); + lt->CursorUpParagraph(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_DOWN_PARAGRAPH: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::UPDATE); - TEXT(bv_)->CursorDownParagraph(bv_); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::UPDATE); + lt->CursorDownParagraph(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_PRIOR: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::UPDATE); - cursorPrevious(TEXT(bv_)); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::UPDATE); + cursorPrevious(lt); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_NEXT: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::UPDATE); - cursorNext(TEXT(bv_)); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::UPDATE); + cursorNext(lt); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_HOME: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorHome(bv_); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->CursorHome(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_END: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorEnd(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorEnd(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_SHIFT_TAB: case LFUN_TAB: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorTab(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorTab(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_WORDRIGHT: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - if (TEXT(bv_)->cursor.par()->isRightToLeftPar(buffer_->params)) - TEXT(bv_)->CursorLeftOneWord(bv_); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); + if (lt->cursor.par()->isRightToLeftPar(buffer_->params)) + lt->CursorLeftOneWord(bv_); else - TEXT(bv_)->CursorRightOneWord(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorRightOneWord(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_WORDLEFT: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - if (TEXT(bv_)->cursor.par()->isRightToLeftPar(buffer_->params)) - TEXT(bv_)->CursorRightOneWord(bv_); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); + if (lt->cursor.par()->isRightToLeftPar(buffer_->params)) + lt->CursorRightOneWord(bv_); else - TEXT(bv_)->CursorLeftOneWord(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorLeftOneWord(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_BEGINNINGBUF: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorTop(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorTop(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; + } + break; case LFUN_ENDBUF: - if (!TEXT(bv_)->mark_set) - beforeChange(TEXT(bv_)); - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.mark()) + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorBottom(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorBottom(bv_); + lt->FinishUndo(); moveCursorUpdate(false); owner_->showState(); - break; - + } + break; /* cursor selection ---------------------------- */ case LFUN_RIGHTSEL: - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); - if (TEXT(bv_)->cursor.par()->isRightToLeftPar(buffer_->params)) - TEXT(bv_)->CursorLeft(bv_); + if (lt->cursor.par()->isRightToLeftPar(buffer_->params)) + lt->CursorLeft(bv_); else - TEXT(bv_)->CursorRight(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorRight(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_LEFTSEL: - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); - if (TEXT(bv_)->cursor.par()->isRightToLeftPar(buffer_->params)) - TEXT(bv_)->CursorRight(bv_); + if (lt->cursor.par()->isRightToLeftPar(buffer_->params)) + lt->CursorRight(bv_); else - TEXT(bv_)->CursorLeft(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorLeft(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_UPSEL: - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorUp(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorUp(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_DOWNSEL: - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorDown(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorDown(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_UP_PARAGRAPHSEL: - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorUpParagraph(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorUpParagraph(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_DOWN_PARAGRAPHSEL: - update(TEXT(bv_), + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorDownParagraph(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorDownParagraph(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_PRIORSEL: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - cursorPrevious(TEXT(bv_)); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + cursorPrevious(lt); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_NEXTSEL: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - cursorNext(TEXT(bv_)); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + cursorNext(lt); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_HOMESEL: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorHome(bv_); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->CursorHome(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_ENDSEL: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorEnd(bv_); - TEXT(bv_)->FinishUndo(); + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->CursorEnd(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_WORDRIGHTSEL: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - if (TEXT(bv_)->cursor.par()->isRightToLeftPar(buffer_->params)) - TEXT(bv_)->CursorLeftOneWord(bv_); + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + if (lt->cursor.par()->isRightToLeftPar(buffer_->params)) + lt->CursorLeftOneWord(bv_); else - TEXT(bv_)->CursorRightOneWord(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorRightOneWord(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_WORDLEFTSEL: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - if (TEXT(bv_)->cursor.par()->isRightToLeftPar(buffer_->params)) - TEXT(bv_)->CursorRightOneWord(bv_); + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + if (lt->cursor.par()->isRightToLeftPar(buffer_->params)) + lt->CursorRightOneWord(bv_); else - TEXT(bv_)->CursorLeftOneWord(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorLeftOneWord(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_BEGINNINGBUFSEL: - if (TEXT(bv_)->inset_owner) + { + LyXText * lt = bv_->getLyXText(); + + if (lt->inset_owner) break; - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorTop(bv_); - TEXT(bv_)->FinishUndo(); + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->CursorTop(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; case LFUN_ENDBUFSEL: - if (TEXT(bv_)->inset_owner) + { + LyXText * lt = bv_->getLyXText(); + + if (lt->inset_owner) break; - update(TEXT(bv_), + update(lt, BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->CursorBottom(bv_); - TEXT(bv_)->FinishUndo(); + lt->CursorBottom(bv_); + lt->FinishUndo(); moveCursorUpdate(true); owner_->showState(); - break; + } + break; // --- text changing commands ------------------------ case LFUN_BREAKLINE: - beforeChange(TEXT(bv_)); - TEXT(bv_)->InsertChar(bv_, LyXParagraph::META_NEWLINE); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + { + LyXText * lt = bv_->getLyXText(); + + beforeChange(lt); + lt->InsertChar(bv_, LyXParagraph::META_NEWLINE); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); moveCursorUpdate(false); - break; + } + break; case LFUN_PROTECTEDSPACE: { - LyXLayout const & style = - textclasslist.Style(buffer_->params.textclass, - TEXT(bv_)->cursor.par()->GetLayout()); + LyXText * lt = bv_->getLyXText(); + + LyXLayout const & style = textclasslist + .Style(buffer_->params.textclass, + lt->cursor.par()->GetLayout()); if (style.free_spacing) { - TEXT(bv_)->InsertChar(bv_, ' '); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + lt->InsertChar(bv_, ' '); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } else { - bv_->protectedBlank(TEXT(bv_)); + protectedBlank(lt); } moveCursorUpdate(false); } break; case LFUN_SETMARK: - if (TEXT(bv_)->mark_set) { - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); + { + LyXText * lt = bv_->getLyXText(); + + if (lt->selection.mark()) { + beforeChange(lt); + update(lt, + BufferView::SELECT + | BufferView::FITCUR); owner_->getLyXFunc()->setMessage(N_("Mark removed")); } else { - beforeChange(TEXT(bv_)); - TEXT(bv_)->mark_set = 1; - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); + beforeChange(lt); + lt->selection.mark(true); + update(lt, + BufferView::SELECT + | BufferView::FITCUR); owner_->getLyXFunc()->setMessage(N_("Mark set")); } - TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor; - break; + lt->selection.cursor = lt->cursor; + } + break; case LFUN_DELETE: - if (!TEXT(bv_)->selection) { - TEXT(bv_)->Delete(bv_); - TEXT(bv_)->sel_cursor = - TEXT(bv_)->cursor; - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.set()) { + lt->Delete(bv_); + lt->selection.cursor = lt->cursor; + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); // It is possible to make it a lot faster still // just comment out the line below... showCursor(); @@ -2236,26 +2310,25 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) moveCursorUpdate(false); owner_->showState(); setState(); - break; + } + break; case LFUN_DELETE_SKIP: { + LyXText * lt = bv_->getLyXText(); + // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP. - LyXCursor cursor = TEXT(bv_)->cursor; + LyXCursor cursor = lt->cursor; - if (!TEXT(bv_)->selection) { -#ifndef NEW_INSETS - if (cursor.pos() == cursor.par()->Last()) { -#else + if (!lt->selection.set()) { if (cursor.pos() == cursor.par()->size()) { -#endif - TEXT(bv_)->CursorRight(bv_); - cursor = TEXT(bv_)->cursor; + lt->CursorRight(bv_); + cursor = lt->cursor; if (cursor.pos() == 0 && !(cursor.par()->params.spaceTop() == VSpace (VSpace::NONE))) { - TEXT(bv_)->SetParagraph + lt->SetParagraph (bv_, cursor.par()->params.lineTop(), cursor.par()->params.lineBottom(), @@ -2265,23 +2338,27 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) cursor.par()->params.spaceBottom(), cursor.par()->params.align(), cursor.par()->params.labelWidthString(), 0); - TEXT(bv_)->CursorLeft(bv_); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + lt->CursorLeft(bv_); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } else { - TEXT(bv_)->CursorLeft(bv_); - TEXT(bv_)->Delete(bv_); - TEXT(bv_)->sel_cursor = - TEXT(bv_)->cursor; - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + lt->CursorLeft(bv_); + lt->Delete(bv_); + lt->selection.cursor = lt->cursor; + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } } else { - TEXT(bv_)->Delete(bv_); - TEXT(bv_)->sel_cursor = - TEXT(bv_)->cursor; - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + lt->Delete(bv_); + lt->selection.cursor = lt->cursor; + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } } else { bv_->cut(); @@ -2291,56 +2368,81 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) /* -------> Delete word forward. */ case LFUN_DELETE_WORD_FORWARD: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->DeleteWordForward(bv_); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + update(bv_->getLyXText(), BufferView::SELECT|BufferView::FITCUR); + bv_->getLyXText()->DeleteWordForward(bv_); + update(bv_->getLyXText(), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); moveCursorUpdate(false); owner_->showState(); break; /* -------> Delete word backward. */ case LFUN_DELETE_WORD_BACKWARD: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->DeleteWordBackward(bv_); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->DeleteWordBackward(bv_); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); moveCursorUpdate(false); owner_->showState(); - break; + } + break; /* -------> Kill to end of line. */ case LFUN_DELETE_LINE_FORWARD: - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->DeleteLineForward(bv_); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + { + LyXText * lt = bv_->getLyXText(); + + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->DeleteLineForward(bv_); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); moveCursorUpdate(false); - break; + } + break; /* -------> Set mark off. */ case LFUN_MARK_OFF: - beforeChange(TEXT(bv_)); - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor; + { + LyXText * lt = bv_->getLyXText(); + + beforeChange(lt); + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->selection.cursor = lt->cursor; owner_->getLyXFunc()->setMessage(N_("Mark off")); - break; + } + break; /* -------> Set mark on. */ case LFUN_MARK_ON: - beforeChange(TEXT(bv_)); - TEXT(bv_)->mark_set = 1; - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); - TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor; + { + LyXText * lt = bv_->getLyXText(); + + beforeChange(lt); + lt->selection.mark(true); + update(lt, BufferView::SELECT|BufferView::FITCUR); + lt->selection.cursor = lt->cursor; owner_->getLyXFunc()->setMessage(N_("Mark on")); - break; + } + break; case LFUN_BACKSPACE: { - if (!TEXT(bv_)->selection) { + LyXText * lt = bv_->getLyXText(); + + if (!lt->selection.set()) { if (owner_->getIntl()->getTrans().backspace()) { - TEXT(bv_)->Backspace(bv_); - TEXT(bv_)->sel_cursor = - TEXT(bv_)->cursor; - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + lt->Backspace(bv_); + lt->selection.cursor = lt->cursor; + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); // It is possible to make it a lot faster still // just comment out the line below... showCursor(); @@ -2356,14 +2458,15 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_BACKSPACE_SKIP: { // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP. + LyXText * lt = bv_->getLyXText(); - LyXCursor cursor = TEXT(bv_)->cursor; + LyXCursor cursor = lt->cursor; - if (!TEXT(bv_)->selection) { + if (!lt->selection.set()) { if (cursor.pos() == 0 && !(cursor.par()->params.spaceTop() == VSpace (VSpace::NONE))) { - TEXT(bv_)->SetParagraph + lt->SetParagraph (bv_, cursor.par()->params.lineTop(), cursor.par()->params.lineBottom(), @@ -2372,14 +2475,17 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) VSpace(VSpace::NONE), cursor.par()->params.spaceBottom(), cursor.par()->params.align(), cursor.par()->params.labelWidthString(), 0); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } else { - TEXT(bv_)->Backspace(bv_); - TEXT(bv_)->sel_cursor - = cursor; - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + lt->Backspace(bv_); + lt->selection.cursor = cursor; + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } } else bv_->cut(); @@ -2388,11 +2494,15 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_BREAKPARAGRAPH: { - beforeChange(TEXT(bv_)); - TEXT(bv_)->BreakParagraph(bv_, 0); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor; + LyXText * lt = bv_->getLyXText(); + + beforeChange(lt); + lt->BreakParagraph(bv_, 0); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + lt->selection.cursor = lt->cursor; setState(); owner_->showState(); break; @@ -2400,11 +2510,15 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_BREAKPARAGRAPHKEEPLAYOUT: { - beforeChange(TEXT(bv_)); - TEXT(bv_)->BreakParagraph(bv_, 1); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor; + LyXText * lt = bv_->getLyXText(); + + beforeChange(lt); + lt->BreakParagraph(bv_, 1); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + lt->selection.cursor = lt->cursor; setState(); owner_->showState(); break; @@ -2415,13 +2529,14 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) // When at the beginning of a paragraph, remove // indentation and add a "defskip" at the top. // Otherwise, do the same as LFUN_BREAKPARAGRAPH. + LyXText * lt = bv_->getLyXText(); - LyXCursor cursor = TEXT(bv_)->cursor; + LyXCursor cursor = lt->cursor; - beforeChange(TEXT(bv_)); + beforeChange(lt); if (cursor.pos() == 0) { if (cursor.par()->params.spaceTop() == VSpace(VSpace::NONE)) { - TEXT(bv_)->SetParagraph + lt->SetParagraph (bv_, cursor.par()->params.lineTop(), cursor.par()->params.lineBottom(), @@ -2434,13 +2549,15 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) } } else { - TEXT(bv_)->BreakParagraph(bv_, 0); + lt->BreakParagraph(bv_, 0); //update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - TEXT(bv_)->sel_cursor = cursor; + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + lt->selection.cursor = cursor; setState(); owner_->showState(); } @@ -2448,7 +2565,9 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_PARAGRAPH_SPACING: { - LyXParagraph * par = TEXT(bv_)->cursor.par(); + LyXText * lt = bv_->getLyXText(); + + LyXParagraph * par = lt->cursor.par(); Spacing::Space cur_spacing = par->params.spacing().getSpace(); float cur_value = 1.0; if (cur_spacing == Spacing::Other) { @@ -2485,18 +2604,17 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) } if (cur_spacing != new_spacing || cur_value != new_value) { par->params.spacing(Spacing(new_spacing, new_value)); - TEXT(bv_)->RedoParagraph(bv_); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + lt->RedoParagraph(bv_); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } } break; case LFUN_QUOTE: - beforeChange(TEXT(bv_)); - TEXT(bv_)->InsertChar(bv_, '\"'); // This " matches the single quote in the code - update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - moveCursorUpdate(false); + bv_->insertCorrectQuote(); break; case LFUN_HTMLURL: @@ -2510,24 +2628,24 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) owner_->getDialogs()->createUrl( p.getAsString() ); } break; - + case LFUN_INSERT_URL: { InsetCommandParams p; p.setFromString( argument ); InsetUrl * inset = new InsetUrl( p ); - if (!bv_->insertInset(inset)) + if (!insertInset(inset)) delete inset; else - bv_->updateInset( inset, true ); + updateInset( inset, true ); } break; - + case LFUN_INSET_TEXT: { InsetText * new_inset = new InsetText; - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2537,7 +2655,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_ERT: { InsetERT * new_inset = new InsetERT; - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2547,7 +2665,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_EXTERNAL: { InsetExternal * new_inset = new InsetExternal; - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2557,7 +2675,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_FOOTNOTE: { InsetFoot * new_inset = new InsetFoot; - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2567,7 +2685,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_MARGINAL: { InsetMarginal * new_inset = new InsetMarginal; - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2577,7 +2695,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_MINIPAGE: { InsetMinipage * new_inset = new InsetMinipage; - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2589,7 +2707,25 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) // check if the float type exist if (floatList.typeExist(argument)) { InsetFloat * new_inset = new InsetFloat(argument); - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) + new_inset->Edit(bv_, 0, 0, 0); + else + delete new_inset; + } else { + lyxerr << "Non-existant float type: " + << argument << endl; + } + + } + break; + + case LFUN_INSET_WIDE_FLOAT: + { + // check if the float type exist + if (floatList.typeExist(argument)) { + InsetFloat * new_inset = new InsetFloat(argument); + new_inset->wide(true); + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2604,7 +2740,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_LIST: { InsetList * new_inset = new InsetList; - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2614,7 +2750,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_THEOREM: { InsetTheorem * new_inset = new InsetTheorem; - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2632,7 +2768,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) new_inset->SetAutoBreakRows(true); new_inset->SetDrawFrame(0, InsetText::LOCKED); new_inset->SetFrameColor(0, LColor::footnoteframe); - if (bv_->insertInset(new_inset)) + if (insertInset(new_inset)) new_inset->Edit(bv_, 0, 0, 0); else delete new_inset; @@ -2642,14 +2778,15 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSET_TABULAR: { - int r = 2, c = 2; + int r = 2; + int c = 2; if (!argument.empty()) ::sscanf(argument.c_str(),"%d%d", &r, &c); InsetTabular * new_inset = new InsetTabular(*buffer_, r, c); - bool rtl = - TEXT(bv_)->real_current_font.isRightToLeft(); - if (!bv_->open_new_inset(new_inset, rtl)) + bool const rtl = + bv_->getLyXText()->real_current_font.isRightToLeft(); + if (!open_new_inset(new_inset, rtl)) delete new_inset; } break; @@ -2658,37 +2795,38 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_CHARATCURSOR: { - LyXParagraph::size_type pos = TEXT(bv_)->cursor.pos(); - if (pos < TEXT(bv_)->cursor.par()->size()) + LyXParagraph::size_type pos = bv_->getLyXText()->cursor.pos(); + if (pos < bv_->getLyXText()->cursor.par()->size()) owner_->getLyXFunc()->setMessage( - tostr(TEXT(bv_)->cursor.par()->GetChar(pos))); + tostr(bv_->getLyXText()->cursor.par()->GetChar(pos))); else owner_->getLyXFunc()->setMessage("EOF"); } break; case LFUN_GETXY: - owner_->getLyXFunc()->setMessage(tostr(TEXT(bv_)->cursor.x()) + owner_->getLyXFunc()->setMessage(tostr(bv_->getLyXText()->cursor.x()) + ' ' - + tostr(TEXT(bv_)->cursor.y())); + + tostr(bv_->getLyXText()->cursor.y())); break; case LFUN_SETXY: { +#warning Should check sscanf for errors (Lgb) int x; int y; ::sscanf(argument.c_str(), " %d %d", &x, &y); - TEXT(bv_)->SetCursorFromCoordinates(bv_, x, y); + bv_->getLyXText()->SetCursorFromCoordinates(bv_, x, y); } break; case LFUN_GETLAYOUT: - owner_->getLyXFunc()->setMessage(tostr(TEXT(bv_)->cursor.par()->layout)); + owner_->getLyXFunc()->setMessage(tostr(bv_->getLyXText()->cursor.par()->layout)); break; case LFUN_GETFONT: { - LyXFont & font = TEXT(bv_)->current_font; + LyXFont & font = bv_->getLyXText()->current_font; if (font.shape() == LyXFont::ITALIC_SHAPE) owner_->getLyXFunc()->setMessage("E"); else if (font.shape() == LyXFont::SMALLCAPS_SHAPE) @@ -2701,7 +2839,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_GETLATEX: { - LyXFont & font = TEXT(bv_)->current_font; + LyXFont & font = bv_->getLyXText()->current_font; if (font.latex() == LyXFont::ON) owner_->getLyXFunc()->setMessage("L"); else @@ -2728,7 +2866,18 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_HUNG_UMLAUT: case LFUN_CIRCLE: case LFUN_OGONEK: - owner_->getLyXFunc()->handleKeyFunc(action); + if (argument.empty()) { + // As always... + owner_->getLyXFunc()->handleKeyFunc(action); + } else { + owner_->getLyXFunc()->handleKeyFunc(action); + owner_->getIntl()->getTrans() + .TranslateAndInsert(argument[0], bv_->getLyXText()); + update(bv_->getLyXText(), + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } break; // --- insert characters ---------------------------------------- @@ -2737,8 +2886,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSERT_MATRIX: { if (available()) { - if (bv_->open_new_inset(new InsetFormula(false))) - { + if (open_new_inset(new InsetFormula(false))) { bv_->theLockingInset() ->LocalDispatch(bv_, action, argument); } @@ -2748,14 +2896,19 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSERT_MATH: { - math_insert_symbol(bv_, argument); + if (!available()) + break; + + InsetFormula * f = new InsetFormula(true); + open_new_inset(f); + f->LocalDispatch(bv_, LFUN_INSERT_MATH, argument); } break; case LFUN_MATH_DISPLAY: { if (available()) - bv_->open_new_inset(new InsetFormula(true)); + open_new_inset(new InsetFormula(true)); break; } @@ -2768,7 +2921,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) else { string const s1 = token(s, ' ', 1); int const na = s1.empty() ? 0 : lyx::atoi(s1); - bv_->open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na)); + open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na)); } } } @@ -2777,7 +2930,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_MATH_MODE: // Open or create a math inset { if (available()) - bv_->open_new_inset(new InsetFormula); + open_new_inset(new InsetFormula); owner_->getLyXFunc()->setMessage(N_("Math editor mode")); } break; @@ -2788,10 +2941,10 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) p.setFromString( argument ); InsetCitation * inset = new InsetCitation( p ); - if (!bv_->insertInset(inset)) + if (!insertInset(inset)) delete inset; else - bv_->updateInset( inset, true ); + updateInset( inset, true ); } break; @@ -2808,7 +2961,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) InsetCommandParams p( "BibTeX", db, bibstyle ); InsetBibtex * inset = new InsetBibtex(p); - if (bv_->insertInset(inset)) { + if (insertInset(inset)) { if (argument.empty()) inset->Edit(bv_, 0, 0, 0); } else @@ -2854,11 +3007,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) if (argument.empty()) { // Get the word immediately preceding the cursor LyXParagraph::size_type curpos = - TEXT(bv_)->cursor.pos() - 1; + bv_->getLyXText()->cursor.pos() - 1; string curstring; if (curpos >= 0 ) - curstring = TEXT(bv_) + curstring = bv_->getLyXText() ->cursor.par()->GetWord(curpos); p.setContents( curstring ); @@ -2876,10 +3029,10 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) p.setFromString(argument); InsetIndex * inset = new InsetIndex(p); - if (!bv_->insertInset(inset)) + if (!insertInset(inset)) delete inset; else - bv_->updateInset(inset, true); + updateInset(inset, true); } break; @@ -2887,20 +3040,20 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) { // Get word immediately preceding the cursor LyXParagraph::size_type curpos = - TEXT(bv_)->cursor.pos() - 1; + bv_->getLyXText()->cursor.pos() - 1; // Can't do that at the beginning of a paragraph if (curpos < 0) break; - string const curstring(TEXT(bv_) + string const curstring(bv_->getLyXText() ->cursor.par()->GetWord(curpos)); InsetCommandParams p("index", curstring); InsetIndex * inset = new InsetIndex(p); - if (!bv_->insertInset(inset)) + if (!insertInset(inset)) delete inset; else - bv_->updateInset(inset, true); + updateInset(inset, true); } break; @@ -2908,7 +3061,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) { InsetCommandParams p("printindex"); Inset * inset = new InsetPrintIndex(p); - if (!bv_->insertInset(inset, "Standard", true)) + if (!insertInset(inset, "Standard")) delete inset; } break; @@ -2918,54 +3071,96 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) lyxerr << "arg " << argument << endl; InsetCommandParams p( "lyxparent", argument ); Inset * inset = new InsetParent(p, *buffer_); - if (!bv_->insertInset(inset, "Standard", true)) + if (!insertInset(inset, "Standard")) delete inset; } + break; case LFUN_CHILD_INSERT: { - InsetCommandParams p; - p.setFromString(argument); + InsetInclude::Params p; + p.cparams.setFromString(argument); + p.masterFilename_ = buffer_->fileName(); - InsetInclude * inset = new InsetInclude(p, *buffer_); - if (!bv_->insertInset(inset)) + InsetInclude * inset = new InsetInclude(p); + if (!insertInset(inset)) delete inset; - else - bv_->updateInset(inset, true); + else { + updateInset(inset, true); + bv_->owner()->getDialogs()->showInclude(inset); + } } break; + case LFUN_FLOAT_LIST: + { + // We should check the argument for validity. (Lgb) + Inset * inset = new InsetFloatList(argument); + if (!insertInset(inset, "Standard")) + delete inset; + } + break; + case LFUN_INSERT_NOTE: - bv_->insertNote(); + insertNote(); break; case LFUN_SELFINSERT: { - LyXFont const old_font(TEXT(bv_)->real_current_font); - for (string::size_type i = 0; i < argument.length(); ++i) { - TEXT(bv_)->InsertChar(bv_, argument[i]); - // This needs to be in the loop, or else we - // won't break lines correctly. (Asger) - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + if (argument.empty()) break; + + /* Automatically delete the currently selected + * text and replace it with what is being + * typed in now. Depends on lyxrc settings + * "auto_region_delete", which defaults to + * true (on). */ + + LyXText * lt = bv_->getLyXText(); + + if (lyxrc.auto_region_delete) { + if (lt->selection.set()) { + lt->CutSelection(bv_, false); + bv_->update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } + } + + bv_->beforeChange(lt); + LyXFont const old_font(lt->real_current_font); + + string::const_iterator cit = argument.begin(); + string::const_iterator end = argument.end(); + for (; cit != end; ++cit) { + if (greek_kb_flag) { + if (!math_insert_greek(bv_, *cit)) + owner_->getIntl()->getTrans().TranslateAndInsert(*cit, lt); + } else + owner_->getIntl()->getTrans().TranslateAndInsert(*cit, lt); } - TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor; + + bv_->update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + + lt->selection.cursor = lt->cursor; moveCursorUpdate(false); - - // real_current_font.number can change so we need to + + // real_current_font.number can change so we need to // update the minibuffer - if (old_font != TEXT(bv_)->real_current_font) + if (old_font != lt->real_current_font) owner_->showState(); + //return string(); } break; case LFUN_DATE_INSERT: // jdblair: date-insert cmd { - struct tm * now_tm; - time_t now_time_t = time(NULL); - now_tm = localtime(&now_time_t); + struct tm * now_tm = localtime(&now_time_t); setlocale(LC_TIME, ""); string arg; if (!argument.empty()) @@ -2975,74 +3170,308 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) char datetmp[32]; int const datetmp_len = ::strftime(datetmp, 32, arg.c_str(), now_tm); + + LyXText * lt = bv_->getLyXText(); + for (int i = 0; i < datetmp_len; i++) { - TEXT(bv_)->InsertChar(bv_, datetmp[i]); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + lt->InsertChar(bv_, datetmp[i]); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); } - TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor; + lt->selection.cursor = lt->cursor; moveCursorUpdate(false); } break; case LFUN_UNKNOWN_ACTION: - { - if (!buffer_) { - owner_->getLyXFunc()->setErrorMessage(N_("No document open")); - break; + owner_->getLyXFunc()->setErrorMessage(N_("Unknow function!")); + break; + + default: + return false; + } // end of switch + + return true; +} + + +void BufferView::Pimpl::newline() +{ + if (available()) { + LyXText * lt = bv_->getLyXText(); + hideCursor(); + update(lt, + BufferView::SELECT + | BufferView::FITCUR); + lt->InsertChar(bv_, LyXParagraph::META_NEWLINE); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } +} + + +void BufferView::Pimpl::hfill() +{ + if (available()) { + LyXText * lt = bv_->getLyXText(); + hideCursor(); + update(lt, + BufferView::SELECT + | BufferView::FITCUR); + lt->InsertChar(bv_, LyXParagraph::META_HFILL); + update(lt, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } +} + + +void BufferView::Pimpl::protectedBlank(LyXText * lt) +{ + if (available()) { + hideCursor(); + update(lt, BufferView::SELECT|BufferView::FITCUR); + InsetSpecialChar * new_inset = + new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR); + if (!insertInset(new_inset)) + delete new_inset; + else + updateInset(new_inset, true); + } +} + + +void BufferView::Pimpl::menuSeparator() +{ + if (available()) { + LyXText * lt = bv_->getLyXText(); + + hideCursor(); + update(lt, BufferView::SELECT|BufferView::FITCUR); + InsetSpecialChar * new_inset = + new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR); + insertInset(new_inset); + } +} + + +void BufferView::Pimpl::endOfSentenceDot() +{ + if (available()) { + hideCursor(); + update(bv_->getLyXText(), BufferView::SELECT|BufferView::FITCUR); + InsetSpecialChar * new_inset = + new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE); + insertInset(new_inset); + } +} + + +void BufferView::Pimpl::ldots() +{ + if (available()) { + hideCursor(); + update(bv_->getLyXText(), BufferView::SELECT|BufferView::FITCUR); + InsetSpecialChar * new_inset = + new InsetSpecialChar(InsetSpecialChar::LDOTS); + insertInset(new_inset); + } +} + + +void BufferView::Pimpl::hyphenationPoint() +{ + if (available()) { + hideCursor(); + update(bv_->getLyXText(), BufferView::SELECT|BufferView::FITCUR); + InsetSpecialChar * new_inset = + new InsetSpecialChar(InsetSpecialChar::HYPHENATION); + insertInset(new_inset); + } +} + + +void BufferView::Pimpl::insertNote() +{ + InsetInfo * new_inset = new InsetInfo(); + insertInset(new_inset); + new_inset->Edit(bv_, 0, 0, 0); +} + + +// Open and lock an updatable inset +bool BufferView::Pimpl::open_new_inset(UpdatableInset * new_inset, bool behind) +{ + LyXText * lt = bv_->getLyXText(); + + beforeChange(lt); + lt->FinishUndo(); + if (!insertInset(new_inset)) { + delete new_inset; + return false; + } + if (behind) { + LyXFont & font = lt->real_current_font; + new_inset->Edit(bv_, new_inset->width(bv_, font), 0, 0); + } else + new_inset->Edit(bv_, 0, 0, 0); + return true; +} + + +bool BufferView::Pimpl::insertInset(Inset * inset, string const & lout) +{ + // if we are in a locking inset we should try to insert the + // inset there otherwise this is a illegal function now + if (bv_->theLockingInset()) { + if (bv_->theLockingInset()->InsertInsetAllowed(inset)) + return bv_->theLockingInset()->InsertInset(bv_, inset); + return false; + } + + // not quite sure if we want this... + bv_->text->SetCursorParUndo(buffer_); + bv_->text->FreezeUndo(); + + beforeChange(bv_->text); + if (!lout.empty()) { + update(bv_->text, BufferView::SELECT|BufferView::FITCUR); + bv_->text->BreakParagraph(bv_); + update(bv_->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + + if (bv_->text->cursor.par()->size()) { + bv_->text->CursorLeft(bv_); + + bv_->text->BreakParagraph(bv_); + update(bv_->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } - if (buffer_->isReadonly()) { - owner_->getLyXFunc()->setErrorMessage(N_("Document is read only")); - break; + pair lres = + textclasslist.NumberOfLayout(buffer_->params + .textclass, lout); + LyXTextClass::size_type lay; + if (lres.first != false) { + // layout found + lay = lres.second; + } else { + // layout not fount using default "Standard" (0) + lay = 0; } - if (!argument.empty()) { - /* Automatically delete the currently selected - * text and replace it with what is being - * typed in now. Depends on lyxrc settings - * "auto_region_delete", which defaults to - * true (on). */ - - if (lyxrc.auto_region_delete) { - if (TEXT(bv_)->selection){ - TEXT(bv_)->CutSelection(bv_, false); - update(TEXT(bv_), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + + bv_->text->SetLayout(bv_, lay); + + bv_->text->SetParagraph(bv_, 0, 0, + 0, 0, + VSpace(VSpace::NONE), VSpace(VSpace::NONE), + LYX_ALIGN_LAYOUT, + string(), + 0); + update(bv_->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + + bv_->text->current_font.setLatex(LyXFont::OFF); + } + + bv_->text->InsertInset(bv_, inset); + update(bv_->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + + bv_->text->UnFreezeUndo(); + return true; +} + + +void BufferView::Pimpl::updateInset(Inset * inset, bool mark_dirty) +{ + if (!inset) + return; + + // first check for locking insets + if (bv_->theLockingInset()) { + if (bv_->theLockingInset() == inset) { + if (bv_->text->UpdateInset(bv_, inset)) { + update(); + if (mark_dirty) { + buffer_->markDirty(); } + updateScrollbar(); + return; } - - beforeChange(TEXT(bv_)); - LyXFont const old_font(TEXT(bv_)->real_current_font); - for (string::size_type i = 0; - i < argument.length(); ++i) { - if (greek_kb_flag) { - if (!math_insert_greek(bv_, - argument[i])) - owner_->getIntl()->getTrans().TranslateAndInsert(argument[i], TEXT(bv_)); - } else - owner_->getIntl()->getTrans().TranslateAndInsert(argument[i], TEXT(bv_)); + } else if (bv_->theLockingInset()->UpdateInsetInInset(bv_, inset)) { + if (bv_->text->UpdateInset(bv_, + bv_->theLockingInset())) { + update(); + if (mark_dirty){ + buffer_->markDirty(); + } + updateScrollbar(); + return; } + } + } + + // then check the current buffer + if (available()) { + hideCursor(); + update(bv_->text, BufferView::UPDATE); + if (bv_->text->UpdateInset(bv_, inset)) { + if (mark_dirty) { + update(bv_->text, + BufferView::SELECT + | BufferView::FITCUR + | BufferView::CHANGE); + } else { + update(bv_->text, SELECT); + } + return; + } + } +} - update(TEXT(bv_),BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - - TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor; - moveCursorUpdate(false); - // real_current_font.number can change so we need to - // update the minibuffer - if (old_font != TEXT(bv_)->real_current_font) - owner_->showState(); +void BufferView::Pimpl::gotoInset(vector const & codes, + bool same_content) +{ + if (!available()) return; + + hideCursor(); + beforeChange(bv_->text); + update(bv_->text, BufferView::SELECT|BufferView::FITCUR); + + string contents; + if (same_content && + bv_->text->cursor.par()->GetChar(bv_->text->cursor.pos()) == LyXParagraph::META_INSET) { + Inset const * inset = bv_->text->cursor.par()->GetInset(bv_->text->cursor.pos()); + if (find(codes.begin(), codes.end(), inset->LyxCode()) + != codes.end()) + contents = + static_cast(inset)->getContents(); + } + + if (!bv_->text->GotoNextInset(bv_, codes, contents)) { + if (bv_->text->cursor.pos() + || bv_->text->cursor.par() != bv_->text->FirstParagraph()) { + LyXCursor tmp = bv_->text->cursor; + bv_->text->cursor.par(bv_->text->FirstParagraph()); + bv_->text->cursor.pos(0); + if (!bv_->text->GotoNextInset(bv_, codes, contents)) { + bv_->text->cursor = tmp; + bv_->owner()->message(_("No more insets")); + } } else { - // if we don't have an argument there was something - // strange going on so we just tell this to someone! - owner_->getLyXFunc()->setErrorMessage(N_("No argument givven")); + bv_->owner()->message(_("No more insets")); } - break; } - default: - return false; - } // end of switch + update(bv_->text, BufferView::SELECT|BufferView::FITCUR); + bv_->text->selection.cursor = bv_->text->cursor; +} - return true; + +void BufferView::Pimpl::gotoInset(Inset::Code code, bool same_content) +{ + gotoInset(vector(1, code), same_content); }