X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView_pimpl.C;h=22780d0629fd3504a3c8c589b45737a7e9b5e890;hb=ebfcf1c0e72288b7131607af0330500c8739cead;hp=792809ca8dae803e8fec768dae4d95cd49a886ae;hpb=c3ac97d9512d3b7b5d3c4e9e4959225a596c9d65;p=lyx.git diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index 792809ca8d..22780d0629 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -21,13 +21,20 @@ #include "TextCache.h" #include "bufferlist.h" #include "insets/insetbib.h" -#include "menus.h" #include "lyx_gui_misc.h" #include "lyxrc.h" #include "intl.h" #include "support/LAssert.h" +#include "frontends/Dialogs.h" + +#ifdef SIGC_CXX_NAMESPACES +using SigC::slot; +#endif + using std::pair; using std::endl; +using std::vector; +using std::make_pair; /* the selection possible is needed, that only motion events are * used, where the bottom press event was on the drawing area too */ @@ -36,12 +43,9 @@ bool selection_possible = false; extern BufferList bufferlist; extern char ascii_type; +extern "C" void TimerCB(FL_OBJECT *, long); extern void sigchldhandler(pid_t pid, int * status); -extern int bibitemMaxWidth(Painter &, LyXFont const &); -extern void FreeUpdateTimer(); - -extern "C" -void C_BufferView_CursorToggleCB(FL_OBJECT * ob, long buf); +extern int bibitemMaxWidth(BufferView *, LyXFont const &); static inline @@ -68,25 +72,45 @@ void SetXtermCursor(Window win) BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o, int xpos, int ypos, int width, int height) - : bv_(b), owner_(o) + : bv_(b), owner_(o), cursor_timeout(400) { buffer_ = 0; - workarea = new WorkArea(bv_, xpos, ypos, width, height); - screen = 0; - timer_cursor = 0; - create_view(); + workarea_ = new WorkArea(bv_, xpos, ypos, width, height); + // Setup the signals + workarea_->workAreaExpose + .connect(slot(this, &BufferView::Pimpl::workAreaExpose)); + workarea_->workAreaEnter + .connect(slot(this, &BufferView::Pimpl::enterView)); + workarea_->workAreaLeave + .connect(slot(this, &BufferView::Pimpl::leaveView)); + workarea_->workAreaButtonPress + .connect(slot(this, &BufferView::Pimpl::workAreaButtonPress)); + workarea_->workAreaButtonRelease + .connect(slot(this, + &BufferView::Pimpl::workAreaButtonRelease)); + workarea_->workAreaMotionNotify + .connect(slot(this, &BufferView::Pimpl::workAreaMotionNotify)); + workarea_->workAreaDoubleClick + .connect(slot(this, &BufferView::Pimpl::doubleClick)); + workarea_->workAreaTripleClick + .connect(slot(this, &BufferView::Pimpl::tripleClick)); + workarea_->workAreaKeyPress + .connect(slot(this, &BufferView::Pimpl::workAreaKeyPress)); + + screen_ = 0; + + cursor_timeout.timeout.connect(slot(this, + &BufferView::Pimpl::cursorToggle)); current_scrollbar_value = 0; - fl_set_timer(timer_cursor, 0.4); - workarea->setFocus(); - work_area_focus = true; - lyx_focus = false; + cursor_timeout.start(); + workarea_->setFocus(); using_xterm_cursor = false; } Painter & BufferView::Pimpl::painter() { - return workarea->getPainter(); + return workarea_->getPainter(); } @@ -101,8 +125,8 @@ void BufferView::Pimpl::buffer(Buffer * b) // Put the old text into the TextCache, but // only if the buffer is still loaded. // Also set the owner of the test to 0 - bv_->text->owner(0); - textcache.add(bv_->text); + // bv_->text->owner(0); + textcache.add(buffer_, workarea_->workWidth(), bv_->text); if (lyxerr.debugging()) textcache.show(lyxerr, "BufferView::buffer"); @@ -116,8 +140,8 @@ void BufferView::Pimpl::buffer(Buffer * b) // Nuke old image // screen is always deleted when the buffer is changed. - delete screen; - screen = 0; + delete screen_; + screen_ = 0; // If we are closing the buffer, use the first buffer as current if (!buffer_) { @@ -127,23 +151,25 @@ void BufferView::Pimpl::buffer(Buffer * b) if (buffer_) { lyxerr[Debug::INFO] << "Buffer addr: " << buffer_ << endl; buffer_->addUser(bv_); - owner_->getMenus()->showMenus(); // If we don't have a text object for this, we make one - if (bv_->text == 0) + if (bv_->text == 0) { resizeCurrentBuffer(); - else { + } else { updateScreen(); updateScrollbar(); } - screen->first = screen->TopCursorVisible(); + bv_->text->first = screen_->TopCursorVisible(bv_->text); + owner_->updateMenubar(); + owner_->updateToolbar(); redraw(); - updateAllVisibleBufferRelatedPopups(); + owner_->getDialogs()->updateBufferDependent(); bv_->insetWakeup(); } else { lyxerr[Debug::INFO] << " No Buffer!" << endl; - owner_->getMenus()->hideMenus(); + owner_->updateMenubar(); + owner_->updateToolbar(); updateScrollbar(); - workarea->redraw(); + workarea_->redraw(); // Also remove all remaining text's from the testcache. // (there should not be any!) (if there is any it is a @@ -158,10 +184,11 @@ void BufferView::Pimpl::buffer(Buffer * b) owner_->updateWindowTitle(); } + void BufferView::Pimpl::resize(int xpos, int ypos, int width, int height) { - workarea->resize(xpos, ypos, width, height); - update(3); + workarea_->resize(xpos, ypos, width, height); + update(SELECT); redraw(); } @@ -177,16 +204,17 @@ void BufferView::Pimpl::resize() void BufferView::Pimpl::redraw() { lyxerr[Debug::INFO] << "BufferView::redraw()" << endl; - workarea->redraw(); + workarea_->redraw(); } -bool BufferView::Pimpl::fitCursor() +bool BufferView::Pimpl::fitCursor(LyXText * text) { - Assert(screen); // it is a programming error to call fitCursor + Assert(screen_); // it is a programming error to call fitCursor // without a valid screen. - bool ret = screen->FitCursor(); - if (ret) updateScrollbar(); + bool ret = screen_->FitCursor(text); + if (ret) + updateScrollbar(); return ret; } @@ -219,31 +247,31 @@ int BufferView::Pimpl::resizeCurrentBuffer() owner_->getMiniBuffer()->Set(_("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; + 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; delete bv_->text; - bv_->text = new LyXText(bv_, workarea->workWidth(), buffer_); + bv_->text = new LyXText(bv_); } else { // See if we have a text in TextCache that fits // the new buffer_ with the correct width. - bv_->text = textcache.findFit(buffer_, workarea->workWidth()); + bv_->text = textcache.findFit(buffer_, workarea_->workWidth()); if (bv_->text) { if (lyxerr.debugging()) { lyxerr << "Found a LyXText that fits:\n"; - textcache.show(lyxerr, bv_->text); + textcache.show(lyxerr, make_pair(buffer_, make_pair(workarea_->workWidth(), bv_->text))); } // Set the owner of the newly found text - bv_->text->owner(bv_); + // bv_->text->owner(bv_); if (lyxerr.debugging()) textcache.show(lyxerr, "resizeCurrentBuffer"); } else { - bv_->text = new LyXText(bv_, workarea->workWidth(), buffer_); + bv_->text = new LyXText(bv_); } } updateScreen(); @@ -254,21 +282,20 @@ int BufferView::Pimpl::resizeCurrentBuffer() * Mechanism when setting the cursor */ bv_->text->mark_set = mark_set; if (selection) { - bv_->text->SetCursor(selstartpar, selstartpos); + bv_->text->SetCursor(bv_, selstartpar, selstartpos); bv_->text->sel_cursor = bv_->text->cursor; - bv_->text->SetCursor(selendpar, selendpos); + bv_->text->SetCursor(bv_, selendpar, selendpos); bv_->text->SetSelection(); - bv_->text->SetCursor(par, pos); + bv_->text->SetCursor(bv_, par, pos); } else { - bv_->text->SetCursor(par, pos); + bv_->text->SetCursor(bv_, par, pos); bv_->text->sel_cursor = bv_->text->cursor; bv_->text->selection = false; } } - screen->first = screen->TopCursorVisible(); /* this will scroll the - * screen such that the - * cursor becomes - * visible */ + bv_->text->first = screen_->TopCursorVisible(bv_->text); + buffer_->resizeInsets(bv_); + // this will scroll the screen such that the cursor becomes visible updateScrollbar(); redraw(); owner_->getMiniBuffer()->Init(); @@ -284,21 +311,21 @@ int BufferView::Pimpl::resizeCurrentBuffer() void BufferView::Pimpl::gotoError() { - if (!screen) + if (!screen_) return; - screen->HideCursor(); + screen_->HideCursor(); bv_->beforeChange(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); LyXCursor tmp; - if (!bv_->text->GotoNextError()) { - if (bv_->text->cursor.pos - || bv_->text->cursor.par != bv_->text->FirstParagraph()) { + if (!bv_->text->GotoNextError(bv_)) { + if (bv_->text->cursor.pos() + || bv_->text->cursor.par() != bv_->text->FirstParagraph()) { tmp = bv_->text->cursor; - bv_->text->cursor.par = bv_->text->FirstParagraph(); - bv_->text->cursor.pos = 0; - if (!bv_->text->GotoNextError()) { + bv_->text->cursor.par(bv_->text->FirstParagraph()); + bv_->text->cursor.pos(0); + if (!bv_->text->GotoNextError(bv_)) { bv_->text->cursor = tmp; owner_->getMiniBuffer() ->Set(_("No more errors")); @@ -309,7 +336,7 @@ void BufferView::Pimpl::gotoError() LyXBell(); } } - update(0); + update(BufferView::SELECT|BufferView::FITCUR); bv_->text->sel_cursor = bv_->text->cursor; } @@ -317,24 +344,8 @@ void BufferView::Pimpl::gotoError() void BufferView::Pimpl::updateScreen() { // Regenerate the screen. - delete screen; - screen = new LyXScreen(*workarea, bv_->text); -} - - -void BufferView::Pimpl::create_view() -{ - FL_OBJECT * obj; - - // - // TIMERS - // - - // timer_cursor - timer_cursor = obj = fl_add_timer(FL_HIDDEN_TIMER, - 0, 0, 0, 0, "Timer"); - fl_set_object_callback(obj, C_BufferView_CursorToggleCB, 0); - obj->u_vdata = bv_; + delete screen_; + screen_ = new LyXScreen(*workarea_); } @@ -345,7 +356,7 @@ void BufferView::Pimpl::updateScrollbar() * be possible */ if (!buffer_) { - workarea->setScrollbar(0, 1.0); + workarea_->setScrollbar(0, 1.0); return; } @@ -355,38 +366,38 @@ void BufferView::Pimpl::updateScrollbar() unsigned long cbth = 0; long cbsf = 0; - if (bv_->text) + if (bv_->text) { cbth = bv_->text->height; - if (screen) - cbsf = screen->first; + cbsf = bv_->text->first; + } // check if anything has changed. if (max2 == cbth && - height2 == workarea->height() && + height2 == workarea_->height() && current_scrollbar_value == cbsf) return; // no max2 = cbth; - height2 = workarea->height(); + height2 = workarea_->height(); current_scrollbar_value = cbsf; if (cbth <= height2) { // text is smaller than screen - workarea->setScrollbar(0, 1.0); // right? + workarea_->setScrollbar(0, 1.0); // right? return; } - long maximum_height = workarea->height() * 3 / 4 + cbth; + long maximum_height = workarea_->height() * 3 / 4 + cbth; long value = cbsf; // set the scrollbar - double hfloat = workarea->height(); + 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, bv_->text->height - workarea_->height()); double lineh = bv_->text->DefaultHeight(); - workarea->setScrollbarIncrements(lineh); + workarea_->setScrollbarIncrements(lineh); if (maxfloat > 0.0) { if ((hfloat / maxfloat) * float(height2) < 3) slider_size = 3.0/float(height2); @@ -395,7 +406,7 @@ void BufferView::Pimpl::updateScrollbar() } else slider_size = hfloat; - workarea->setScrollbar(slider_value, slider_size / workarea->height()); + workarea_->setScrollbar(slider_value, slider_size / workarea_->height()); } @@ -410,24 +421,25 @@ void BufferView::Pimpl::scrollCB(double value) if (current_scrollbar_value < 0) current_scrollbar_value = 0; - if (!screen) + if (!screen_) return; - screen->Draw(current_scrollbar_value); + screen_->Draw(bv_->text, current_scrollbar_value); if (cursor_follows_scrollbar) { LyXText * vbt = bv_->text; - unsigned int height = vbt->DefaultHeight(); + int height = vbt->DefaultHeight(); - if (vbt->cursor.y < screen->first + height) { - vbt->SetCursorFromCoordinates(0, - screen->first + + if (vbt->cursor.y() < (int)(bv_->text->first + height)) { + vbt->SetCursorFromCoordinates(bv_, 0, + bv_->text->first + height); - } else if (vbt->cursor.y > - screen->first + workarea->height() - height) { - vbt->SetCursorFromCoordinates(0, - screen->first + - workarea->height() - + } else if (vbt->cursor.y() > + (int)(bv_->text->first+workarea_->height()-height)) + { + vbt->SetCursorFromCoordinates(bv_, 0, + bv_->text->first + + workarea_->height() - height); } } @@ -438,17 +450,17 @@ void BufferView::Pimpl::scrollCB(double value) int BufferView::Pimpl::scrollUp(long time) { if (buffer_ == 0) return 0; - if (!screen) return 0; + if (!screen_) return 0; - double value = workarea->getScrollbarValue(); + double value = workarea_->getScrollbarValue(); if (value == 0) return 0; float add_value = (bv_->text->DefaultHeight() + float(time) * float(time) * 0.125); - if (add_value > workarea->height()) - add_value = float(workarea->height() - + if (add_value > workarea_->height()) + add_value = float(workarea_->height() - bv_->text->DefaultHeight()); value -= add_value; @@ -456,7 +468,7 @@ int BufferView::Pimpl::scrollUp(long time) if (value < 0) value = 0; - workarea->setScrollbarValue(value); + workarea_->setScrollbarValue(value); bv_->scrollCB(value); return 0; @@ -466,10 +478,10 @@ int BufferView::Pimpl::scrollUp(long time) int BufferView::Pimpl::scrollDown(long time) { if (buffer_ == 0) return 0; - if (!screen) return 0; + if (!screen_) return 0; - double value= workarea->getScrollbarValue(); - pair p = workarea->getScrollbarBounds(); + double value= workarea_->getScrollbarValue(); + pair p = workarea_->getScrollbarBounds(); double max = p.second; if (value == max) return 0; @@ -477,8 +489,8 @@ int BufferView::Pimpl::scrollDown(long time) float add_value = (bv_->text->DefaultHeight() + float(time) * float(time) * 0.125); - if (add_value > workarea->height()) - add_value = float(workarea->height() - + if (add_value > workarea_->height()) + add_value = float(workarea_->height() - bv_->text->DefaultHeight()); value += add_value; @@ -486,28 +498,35 @@ int BufferView::Pimpl::scrollDown(long time) if (value > max) value = max; - workarea->setScrollbarValue(value); + workarea_->setScrollbarValue(value); bv_->scrollCB(value); return 0; } -void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) +void BufferView::Pimpl::workAreaKeyPress(KeySym keysym, unsigned int state) { - if (buffer_ == 0 || !screen) return; + bv_->owner()->getLyXFunc()->processKeySym(keysym, state); +} + +void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) +{ // Only use motion with button 1 - if (!state & Button1MotionMask) - return; + if (!(state & Button1MotionMask)) + return; + + if (buffer_ == 0 || !screen_) return; // Check for inset locking - if (bv_->the_locking_inset) { + if (bv_->theLockingInset()) { LyXCursor cursor = bv_->text->cursor; - bv_->the_locking_inset-> + bv_->theLockingInset()-> InsetMotionNotify(bv_, - x - cursor.x, - y - cursor.y + screen->first, + x - cursor.x() - + bv_->theLockingInset()->scroll(), + y - cursor.y() + bv_->text->first, state); return; } @@ -515,17 +534,17 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) /* The selection possible is needed, that only motion events are * used, where the bottom press event was on the drawing area too */ if (selection_possible) { - screen->HideCursor(); + screen_->HideCursor(); - bv_->text->SetCursorFromCoordinates(x, y + screen->first); + bv_->text->SetCursorFromCoordinates(bv_, x, y + bv_->text->first); if (!bv_->text->selection) - update(-3); // Maybe an empty line was deleted + update(BufferView::UPDATE); // Maybe an empty line was deleted bv_->text->SetSelection(); - screen->ToggleToggle(); - fitCursor(); - screen->ShowCursor(); + screen_->ToggleToggle(bv_->text); + fitCursor(bv_->text); + screen_->ShowCursor(bv_->text); } return; } @@ -538,79 +557,43 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos, last_click_x = -1; last_click_y = -1; - if (buffer_ == 0 || !screen) return; + if (buffer_ == 0 || !screen_) return; - Inset * inset_hit = checkInsetHit(xpos, ypos, button); + Inset * inset_hit = checkInsetHit(bv_->text, xpos, ypos, button); // ok ok, this is a hack. if (button == 4 || button == 5) { switch (button) { case 4: - scrollUp(100); // This number is only temporary + scrollUp(lyxrc.wheel_jump); // default 100, set in lyxrc break; case 5: - scrollDown(100); + scrollDown(lyxrc.wheel_jump); break; } } - if (bv_->the_locking_inset) { + if (bv_->theLockingInset()) { // We are in inset locking mode /* Check whether the inset was hit. If not reset mode, otherwise give the event to the inset */ - if (inset_hit == bv_->the_locking_inset) { - bv_->the_locking_inset-> + if (inset_hit == bv_->theLockingInset()) { + bv_->theLockingInset()-> InsetButtonPress(bv_, xpos, ypos, button); return; } else { - bv_->unlockInset(bv_->the_locking_inset); + bv_->unlockInset(bv_->theLockingInset()); } } if (!inset_hit) selection_possible = true; - screen->HideCursor(); - - // Right button mouse click on a table - if (button == 3 && - (bv_->text->cursor.par->table || - bv_->text->MouseHitInTable(xpos, ypos + screen->first))) { - // Set the cursor to the press-position - bv_->text->SetCursorFromCoordinates(xpos, ypos + screen->first); - bool doit = true; - - // Only show the table popup if the hit is in - // the table, too - if (!bv_->text->HitInTable(bv_->text->cursor.row, xpos)) - doit = false; - - // Hit above or below the table? - if (doit) { - if (!bv_->text->selection) { - screen->ToggleSelection(); - bv_->text->ClearSelection(); - bv_->text->FullRebreak(); - screen->Update(); - updateScrollbar(); - } - // Popup table popup when on a table. - // This is obviously temporary, since we - // should be able to popup various - // context-sensitive-menus with the - // the right mouse. So this should be done more - // general in the future. Matthias. - selection_possible = false; - owner_->getLyXFunc() - ->Dispatch(LFUN_LAYOUT_TABLE, - "true"); - return; - } - } - - int screen_first = screen->first; + screen_->HideCursor(); + + int const screen_first = bv_->text->first; // Middle button press pastes if we have a selection bool paste_internally = false; @@ -621,10 +604,10 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos, } // Clear the selection - screen->ToggleSelection(); + screen_->ToggleSelection(bv_->text); bv_->text->ClearSelection(); - bv_->text->FullRebreak(); - screen->Update(); + bv_->text->FullRebreak(bv_); + screen_->Update(bv_->text); updateScrollbar(); // Single left click in math inset? @@ -647,13 +630,13 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos, } if (!inset_hit) // otherwise it was already set in checkInsetHit(...) - bv_->text->SetCursorFromCoordinates(xpos, ypos + screen_first); + bv_->text->SetCursorFromCoordinates(bv_, xpos, ypos + screen_first); bv_->text->FinishUndo(); bv_->text->sel_cursor = bv_->text->cursor; - bv_->text->cursor.x_fix = bv_->text->cursor.x; + bv_->text->cursor.x_fix(bv_->text->cursor.x()); owner_->updateLayoutChoice(); - if (fitCursor()) { + if (fitCursor(bv_->text)) { selection_possible = false; } @@ -675,34 +658,34 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos, void BufferView::Pimpl::doubleClick(int /*x*/, int /*y*/, unsigned int button) { // select a word - if (buffer_ && !bv_->the_locking_inset) { - if (screen && button == 1) { - screen->HideCursor(); - screen->ToggleSelection(); - bv_->text->SelectWord(); - screen->ToggleSelection(false); + if (buffer_ && !bv_->theLockingInset()) { + if (screen_ && button == 1) { + screen_->HideCursor(); + screen_->ToggleSelection(bv_->text); + bv_->text->SelectWord(bv_); + screen_->ToggleSelection(bv_->text, false); /* This will fit the cursor on the screen * if necessary */ - update(0); + update(BufferView::SELECT|BufferView::FITCUR); } - } + } } void BufferView::Pimpl::tripleClick(int /*x*/, int /*y*/, unsigned int button) { // select a line - if (buffer_ && screen && button == 1) { - screen->HideCursor(); - screen->ToggleSelection(); - bv_->text->CursorHome(); + if (buffer_ && screen_ && !bv_->theLockingInset() && (button == 1)) { + screen_->HideCursor(); + screen_->ToggleSelection(bv_->text); + bv_->text->CursorHome(bv_); bv_->text->sel_cursor = bv_->text->cursor; - bv_->text->CursorEnd(); + bv_->text->CursorEnd(bv_); bv_->text->SetSelection(); - screen->ToggleSelection(false); + screen_->ToggleSelection(bv_->text, false); /* This will fit the cursor on the screen * if necessary */ - update(0); + update(BufferView::SELECT|BufferView::FITCUR); } } @@ -710,7 +693,7 @@ void BufferView::Pimpl::tripleClick(int /*x*/, int /*y*/, unsigned int button) void BufferView::Pimpl::enterView() { if (active() && available()) { - SetXtermCursor(workarea->getWin()); + SetXtermCursor(workarea_->getWin()); using_xterm_cursor = true; } } @@ -719,7 +702,7 @@ void BufferView::Pimpl::enterView() void BufferView::Pimpl::leaveView() { if (using_xterm_cursor) { - XUndefineCursor(fl_display, workarea->getWin()); + XUndefineCursor(fl_display, workarea_->getWin()); using_xterm_cursor = false; } } @@ -728,41 +711,30 @@ void BufferView::Pimpl::leaveView() void BufferView::Pimpl::workAreaButtonRelease(int x, int y, unsigned int button) { - if (buffer_ == 0 || screen == 0) return; + if (buffer_ == 0 || screen_ == 0) return; // If we hit an inset, we have the inset coordinates in these // and inset_hit points to the inset. If we do not hit an // inset, inset_hit is 0, and inset_x == x, inset_y == y. - Inset * inset_hit = checkInsetHit(x, y, button); + Inset * inset_hit = checkInsetHit(bv_->text, x, y, button); - if (bv_->the_locking_inset) { + if (bv_->theLockingInset()) { // We are in inset locking mode. /* LyX does a kind of work-area grabbing for insets. Only a ButtonPress Event outside the inset will force a InsetUnlock. */ - bv_->the_locking_inset-> + bv_->theLockingInset()-> InsetButtonRelease(bv_, x, y, button); return; } selection_possible = false; - if (bv_->text->cursor.par->table) { - int cell = bv_->text-> - NumberOfCell(bv_->text->cursor.par, - bv_->text->cursor.pos); - if (bv_->text->cursor.par->table->IsContRow(cell) && - bv_->text->cursor.par->table-> - CellHasContRow(bv_->text->cursor.par->table-> - GetCellAbove(cell))<0) { - bv_->text->CursorUp(); - } - } if (button >= 2) return; bv_->setState(); - owner_->getMiniBuffer()->Set(CurrentState(bv_)); + owner_->showState(); // Did we hit an editable inset? if (inset_hit != 0) { @@ -785,7 +757,7 @@ 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_->text->SetCursorParUndo(bv_->buffer()); } owner_->getMiniBuffer()->Set(inset_hit->EditMessage()); @@ -804,11 +776,12 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, 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->cursor.pos() < + bv_->text->cursor.par()->Last()) { + c = bv_->text->cursor.par()-> + GetChar(bv_->text->cursor.pos()); } +#ifndef NEW_INSETS if (c == LyXParagraph::META_FOOTNOTE || c == LyXParagraph::META_MARGIN || c == LyXParagraph::META_FIG @@ -817,9 +790,12 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, || 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); + } else +#endif + if (bv_->text->cursor.pos() - 1 >= 0) { + c = bv_->text->cursor.par()-> + GetChar(bv_->text->cursor.pos() - 1); +#ifndef NEW_INSETS if (c == LyXParagraph::META_FOOTNOTE || c == LyXParagraph::META_MARGIN || c == LyXParagraph::META_FIG @@ -828,23 +804,26 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, || c == LyXParagraph::META_WIDE_TAB || c == LyXParagraph::META_ALGORITHM){ // We are one step too far to the right - bv_->text->CursorLeft(); + bv_->text->CursorLeft(bv_); hit = true; } +#endif } if (hit == true) { +#ifndef NEW_INSETS bv_->toggleFloat(); +#endif selection_possible = false; return; } } +#ifndef NEW_INSETS // Do we want to close a float? (click on the float-label) - if (bv_->text->cursor.row->par->footnoteflag == + if (bv_->text->cursor.row()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE - //&& text->cursor.pos == 0 - && bv_->text->cursor.row->previous && - bv_->text->cursor.row->previous->par-> + && 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); @@ -852,27 +831,27 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, int box_x = 20; // LYX_PAPER_MARGIN; box_x += lyxfont::width(" wide-tab ", font); - unsigned int screen_first = screen->first; + 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 + && 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; } } +#endif // Maybe we want to edit a bibitem ale970302 - if (bv_->text->cursor.par->bibkey && x < 20 + - bibitemMaxWidth(bv_->painter(), - textclasslist - .TextClass(buffer_-> - params.textclass).defaultfont())) { - bv_->text->cursor.par->bibkey->Edit(bv_, 0, 0, 0); + if (bv_->text->cursor.par()->bibkey && x < 20 + + bibitemMaxWidth(bv_, textclasslist. + TextClass(buffer_-> + params.textclass).defaultfont())) { + bv_->text->cursor.par()->bibkey->Edit(bv_, 0, 0, 0); } return; @@ -884,79 +863,79 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, * If hit, the coordinates are changed relative to the inset. * Otherwise coordinates are not changed, and false is returned. */ -Inset * BufferView::Pimpl::checkInsetHit(int & x, int & y, +Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, unsigned int /* button */) { - if (!screen) + if (!screen_) return 0; - unsigned int y_tmp = y + screen->first; + int y_tmp = y + text->first; LyXCursor cursor; - bv_->text->SetCursorFromCoordinates(cursor, x, y_tmp); -#if 0 // Are you planning to use this Jürgen? (Lgb) - bool move_cursor = ((cursor.par != bv_->text->cursor.par) || - (cursor.pos != bv_->text->cursor.pos)); -#endif - if (cursor.pos < cursor.par->Last() - && cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET - && cursor.par->GetInset(cursor.pos) - && cursor.par->GetInset(cursor.pos)->Editable()) { + text->SetCursorFromCoordinates(bv_, cursor, x, y_tmp); + + if (cursor.pos() < cursor.par()->Last() + && 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 = bv_->text->GetFont(cursor.par, cursor.pos); + Inset * tmpinset = cursor.par()->GetInset(cursor.pos()); + LyXFont font = text->GetFont(bv_->buffer(), + cursor.par(), cursor.pos()); bool is_rtl = font.isVisibleRightToLeft(); - int start_x, end_x; + int start_x; + int end_x; if (is_rtl) { - start_x = cursor.x - tmpinset->width(bv_->painter(), font); - end_x = cursor.x; + start_x = cursor.x() - tmpinset->width(bv_, font) + tmpinset->scroll(); + end_x = cursor.x() + tmpinset->scroll(); } else { - start_x = cursor.x; - end_x = cursor.x + tmpinset->width(bv_->painter(), font); + start_x = cursor.x() + tmpinset->scroll(); + end_x = cursor.x() + tmpinset->width(bv_, font) + tmpinset->scroll(); } if (x > start_x && x < end_x - && y_tmp > cursor.y - tmpinset->ascent(bv_->painter(), font) - && y_tmp < cursor.y + tmpinset->descent(bv_->painter(), font)) { -#if 0 - if (move_cursor && (tmpinset != bv_->the_locking_inset)) -#endif - bv_->text->SetCursor(cursor.par,cursor.pos,true); + && y_tmp > cursor.y() - tmpinset->ascent(bv_, font) + && y_tmp < cursor.y() + tmpinset->descent(bv_, font)) { + text->SetCursor(bv_, cursor.par(),cursor.pos(),true); x = x - start_x; // The origin of an inset is on the baseline - y = y_tmp - (bv_->text->cursor.y); + y = y_tmp - (text->cursor.y()); return tmpinset; } } - if ((cursor.pos - 1 >= 0) && - (cursor.par->GetChar(cursor.pos-1) == LyXParagraph::META_INSET) && - (cursor.par->GetInset(cursor.pos - 1)) && - (cursor.par->GetInset(cursor.pos - 1)->Editable())) { - Inset * tmpinset = cursor.par->GetInset(cursor.pos-1); - LyXFont font = bv_->text->GetFont(cursor.par, cursor.pos-1); + if ((cursor.pos() - 1 >= 0) && + (cursor.par()->GetChar(cursor.pos()-1) == LyXParagraph::META_INSET) && + (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(), + cursor.pos()-1); bool is_rtl = font.isVisibleRightToLeft(); - int start_x, end_x; + int start_x; + int end_x; if (!is_rtl) { - start_x = cursor.x - tmpinset->width(bv_->painter(), font); - end_x = cursor.x; + start_x = cursor.x() - tmpinset->width(bv_, font) + + tmpinset->scroll(); + end_x = cursor.x() + tmpinset->scroll(); } else { - start_x = cursor.x; - end_x = cursor.x + tmpinset->width(bv_->painter(), font); + start_x = cursor.x() + tmpinset->scroll(); + end_x = cursor.x() + tmpinset->width(bv_, font) + + tmpinset->scroll(); } if (x > start_x && x < end_x - && y_tmp > cursor.y - tmpinset->ascent(bv_->painter(), font) - && y_tmp < cursor.y + tmpinset->descent(bv_->painter(), font)) { + && y_tmp > cursor.y() - tmpinset->ascent(bv_, font) + && y_tmp < cursor.y() + tmpinset->descent(bv_, font)) { #if 0 - if (move_cursor && (tmpinset != bv_->the_locking_inset)) + if (move_cursor && (tmpinset != bv_->theLockingInset())) #endif - bv_->text->SetCursor(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 - (bv_->text->cursor.y); + y = y_tmp - (text->cursor.y()); return tmpinset; } } @@ -972,15 +951,15 @@ void BufferView::Pimpl::workAreaExpose() // redraw(); //} - static unsigned int work_area_width = 0; + static int work_area_width = 0; static unsigned int work_area_height = 0; - bool widthChange = workarea->workWidth() != work_area_width; - bool heightChange = workarea->height() != work_area_height; + bool widthChange = workarea_->workWidth() != work_area_width; + bool heightChange = workarea_->height() != work_area_height; // update from work area - work_area_width = workarea->workWidth(); - work_area_height = workarea->height(); + work_area_width = workarea_->workWidth(); + work_area_height = workarea_->height(); if (buffer_ != 0) { if (widthChange) { // All buffers need a resize @@ -1001,17 +980,17 @@ void BufferView::Pimpl::workAreaExpose() // fitCursor() ensures we don't jump back // to the start of the document on vertical // resize - fitCursor(); + fitCursor(bv_->text); // The main window size has changed, repaint most stuff redraw(); // ...including the minibuffer owner_->getMiniBuffer()->Init(); - } else if (screen) screen->Redraw(); + } else if (screen_) screen_->Redraw(bv_->text); } else { // Grey box when we don't have a buffer - workarea->greyOut(); + workarea_->greyOut(); } // always make sure that the scrollbar is sane. @@ -1021,84 +1000,9 @@ void BufferView::Pimpl::workAreaExpose() } -static -string fromClipboard(Window win, XEvent * event) -{ - string strret; - if (event->xselection.type == XA_STRING - && event->xselection.property) { - Atom tmpatom; - unsigned long ul1; - unsigned long ul2; - unsigned char * uc = 0; - int tmpint; - if (XGetWindowProperty( - event->xselection.display, // display - win, // w - event->xselection.property, // property - 0, // long_offset - 0, // logn_length - False, // delete - XA_STRING, // req_type - &tmpatom, // actual_type_return - &tmpint, // actual_format_return - &ul1, - &ul2, - &uc // prop_return - ) != Success) { - return strret; - } - if (uc) { - free(uc); - uc = 0; - } - if (XGetWindowProperty( - event->xselection.display, // display - win, // w - event->xselection.property, // property - 0, // long_offset - ul2/4+1, // long_length - True, // delete - XA_STRING, // req_type - &tmpatom, // actual_type_return - &tmpint, // actual_format_return - &ul1, // nitems_return - &ul2, // bytes_after_return - &uc // prop_return */ - ) != Success) { - return strret; - } - if (uc) { - strret = reinterpret_cast(uc); - free(uc); // yes free! - uc = 0; - } - } - return strret; -} - - -void BufferView::Pimpl::workAreaSelectionNotify(Window win, XEvent * event) -{ - if (buffer_ == 0) return; - - screen->HideCursor(); - bv_->beforeChange(); - string clb = fromClipboard(win, event); - if (!clb.empty()) { - if (!ascii_type) - bv_->text->InsertStringA(clb); - else - bv_->text->InsertStringB(clb); - - update(1); - } -} - - void BufferView::Pimpl::update() { - if (screen) screen->Update(); + if (screen_) screen_->Update(bv_->text); } // Values used when calling update: @@ -1138,46 +1042,21 @@ void BufferView::Pimpl::update() // update(-1) -> update(1 + 2 + 4) -> update(7) -> update(SELECT|FITCUR|CHANGE) // update(1) -> update(1 + 2 + 4) -> update(7) -> update(SELECT|FITCUR|CHANGE) // update(3) -> update(1) -> update(1) -> update(SELECT) -void BufferView::Pimpl::update(signed char f) + +void BufferView::Pimpl::update(BufferView::UpdateCodes f) { -#if 1 owner_->updateLayoutChoice(); - if (!bv_->text->selection && f > -3) + if (!bv_->text->selection && (f & SELECT)) { bv_->text->sel_cursor = bv_->text->cursor; - - FreeUpdateTimer(); - bv_->text->FullRebreak(); - - update(); - - if (f != 3 && f != -3) { - fitCursor(); - //updateScrollbar(); - } - - if (f == 1 || f == -1) { - if (buffer_->isLyxClean()) { - buffer_->markDirty(); - owner_->getMiniBuffer()->setTimer(4); - } else { - buffer_->markDirty(); - } } -#else - owner_->updateLayoutChoice(); - if (!bv_->text->selection && (f & SELECT)) - bv_->text->sel_cursor = bv_->text->cursor; - - FreeUpdateTimer(); - bv_->text->FullRebreak(); + bv_->text->FullRebreak(bv_); update(); if ((f & FITCUR)) { - fitCursor(); - //updateScrollbar(); + fitCursor(bv_->text); } if ((f & CHANGE)) { @@ -1188,40 +1067,7 @@ void BufferView::Pimpl::update(signed char f) buffer_->markDirty(); } } -#endif -} - - -#if 0 -void BufferView::Pimpl::smallUpdate(signed char f) -{ -#if 1 - update(f); -#else - screen->SmallUpdate(); - if (screen->TopCursorVisible() - != screen->first) { - update(f); - return; - } - - fitCursor(); - //updateScrollbar(); - - if (!bv_->text->selection) - bv_->text->sel_cursor = bv_->text->cursor; - - if (f == 1 || f == -1) { - if (buffer_->isLyxClean()) { - buffer_->markDirty(); - owner_->getMiniBuffer()->setTimer(4); - } else { - buffer_->markDirty(); - } - } -#endif } -#endif // Callback for cursor timer @@ -1272,99 +1118,61 @@ void BufferView::Pimpl::cursorToggle() updatelist.update(bv_); - if (!screen) { + if (!screen_) { goto set_timer_and_return; } - if (lyx_focus && work_area_focus) { - if (!bv_->the_locking_inset) { - screen->CursorToggle(); - } else { - bv_->the_locking_inset-> - ToggleInsetCursor(bv_); - } - goto set_timer_and_return; + if (!bv_->theLockingInset()) { + screen_->CursorToggle(bv_->text); } else { - // Make sure that the cursor is visible. - if (!bv_->the_locking_inset) { - screen->ShowCursor(); - } else { - if (!bv_->the_locking_inset->isCursorVisible()) - bv_->the_locking_inset-> - ToggleInsetCursor(bv_); - } - // This is only run when work_area_focus or lyx_focus is false. - Window tmpwin; - int tmp; - XGetInputFocus(fl_display, &tmpwin, &tmp); - // Commenting this out, we have not had problems with this - // for a long time. We will probably work on this code later - // and we can reenable this debug code then. Now it only - // anoying when debugging. (Lgb) - //if (lyxerr.debugging(Debug::INFO)) { - // lyxerr << "tmpwin: " << tmpwin - // << "\nwindow: " << view->owner_->getForm()->window - // << "\nwork_area_focus: " << view->work_area_focus - // << "\nlyx_focus : " << view->lyx_focus - // << endl; - //} - if (tmpwin != owner_->getForm()->window) { - lyx_focus = false; - goto skip_timer; - } else { - lyx_focus = true; - if (!work_area_focus) - goto skip_timer; - else - goto set_timer_and_return; - } + bv_->theLockingInset()->ToggleInsetCursor(bv_); } - + set_timer_and_return: - fl_set_timer(timer_cursor, 0.4); - skip_timer: + cursor_timeout.restart(); return; } void BufferView::Pimpl::cursorPrevious() { - if (!bv_->text->cursor.row->previous) return; + if (!bv_->text->cursor.row()->previous()) return; - long y = screen->first; - Row * cursorrow = bv_->text->cursor.row; - bv_->text->SetCursorFromCoordinates(bv_->text->cursor.x_fix, y); + int y = bv_->text->first; + Row * cursorrow = bv_->text->cursor.row(); + bv_->text->SetCursorFromCoordinates(bv_, bv_->text->cursor.x_fix(), y); bv_->text->FinishUndo(); // This is to allow jumping over large insets - if ((cursorrow == bv_->text->cursor.row)) - bv_->text->CursorUp(); + if ((cursorrow == bv_->text->cursor.row())) + bv_->text->CursorUp(bv_); - if (bv_->text->cursor.row->height < workarea->height()) - screen->Draw(bv_->text->cursor.y - - bv_->text->cursor.row->baseline - + bv_->text->cursor.row->height - - workarea->height() + 1 ); + if (bv_->text->cursor.row()->height() < workarea_->height()) + screen_->Draw(bv_->text, + bv_->text->cursor.y() + - bv_->text->cursor.row()->baseline() + + bv_->text->cursor.row()->height() + - workarea_->height() + 1 ); updateScrollbar(); } void BufferView::Pimpl::cursorNext() { - if (!bv_->text->cursor.row->next) return; + if (!bv_->text->cursor.row()->next()) return; - long y = screen->first; + int y = bv_->text->first; bv_->text->GetRowNearY(y); - Row * cursorrow = bv_->text->cursor.row; - bv_->text->SetCursorFromCoordinates(bv_->text->cursor.x_fix, y - + workarea->height()); + Row * cursorrow = bv_->text->cursor.row(); + bv_->text->SetCursorFromCoordinates(bv_, bv_->text->cursor.x_fix(), y + + workarea_->height()); bv_->text->FinishUndo(); // This is to allow jumping over large insets - if ((cursorrow == bv_->text->cursor.row)) - bv_->text->CursorDown(); + if ((cursorrow == bv_->text->cursor.row())) + bv_->text->CursorDown(bv_); - if (bv_->text->cursor.row->height < workarea->height()) - screen->Draw(bv_->text->cursor.y - - bv_->text->cursor.row->baseline); + if (bv_->text->cursor.row()->height() < workarea_->height()) + screen_->Draw(bv_->text, bv_->text->cursor.y() + - bv_->text->cursor.row()->baseline()); updateScrollbar(); } @@ -1380,15 +1188,17 @@ void BufferView::Pimpl::beforeChange() { toggleSelection(); bv_->text->ClearSelection(); - FreeUpdateTimer(); + + // CHECK + //owner_->update_timeout.stop(); } void BufferView::Pimpl::savePosition() { backstack.push(buffer_->fileName(), - bv_->text->cursor.x, - bv_->text->cursor.y); + bv_->text->cursor.x(), + bv_->text->cursor.y()); } @@ -1398,15 +1208,25 @@ void BufferView::Pimpl::restorePosition() int x, y; string fname = backstack.pop(&x, &y); - + beforeChange(); - Buffer * b = bufferlist.exists(fname) ? - bufferlist.getBuffer(fname) : - bufferlist.loadLyXFile(fname); // don't ask, just load it - buffer(b); - bv_->text->SetCursorFromCoordinates(x, y); - update(0); -} + + if( fname != buffer_->fileName() ) { + Buffer * b = bufferlist.exists(fname) ? + bufferlist.getBuffer(fname) : + bufferlist.loadLyXFile(fname); // don't ask, just load it + if( b != 0 ) buffer(b); + } + + bv_->text->SetCursorFromCoordinates(bv_, x, y); + update(BufferView::SELECT|BufferView::FITCUR); +} + + +bool BufferView::Pimpl::NoSavedPositions() +{ + return backstack.empty(); +} void BufferView::Pimpl::setState() @@ -1427,9 +1247,9 @@ void BufferView::Pimpl::setState() void BufferView::Pimpl::insetSleep() { - if (bv_->the_locking_inset && !bv_->inset_slept) { - bv_->the_locking_inset->GetCursorPos(bv_->slx, bv_->sly); - bv_->the_locking_inset->InsetUnlock(bv_); + if (bv_->theLockingInset() && !bv_->inset_slept) { + bv_->theLockingInset()->GetCursorPos(bv_, bv_->slx, bv_->sly); + bv_->theLockingInset()->InsetUnlock(bv_); bv_->inset_slept = true; } } @@ -1437,8 +1257,8 @@ void BufferView::Pimpl::insetSleep() void BufferView::Pimpl::insetWakeup() { - if (bv_->the_locking_inset && bv_->inset_slept) { - bv_->the_locking_inset->Edit(bv_, bv_->slx, bv_->sly, 0); + if (bv_->theLockingInset() && bv_->inset_slept) { + bv_->theLockingInset()->Edit(bv_, bv_->slx, bv_->sly, 0); bv_->inset_slept = false; } } @@ -1446,9 +1266,10 @@ void BufferView::Pimpl::insetWakeup() void BufferView::Pimpl::insetUnlock() { - if (bv_->the_locking_inset) { - if (!bv_->inset_slept) bv_->the_locking_inset->InsetUnlock(bv_); - bv_->the_locking_inset = 0; + if (bv_->theLockingInset()) { + if (!bv_->inset_slept) + bv_->theLockingInset()->InsetUnlock(bv_); + bv_->theLockingInset(0); bv_->text->FinishUndo(); bv_->inset_slept = false; } @@ -1457,64 +1278,90 @@ void BufferView::Pimpl::insetUnlock() bool BufferView::Pimpl::focus() const { - return workarea->hasFocus(); + return workarea_->hasFocus(); } void BufferView::Pimpl::focus(bool f) { - if (f) workarea->setFocus(); + if (f) workarea_->setFocus(); } bool BufferView::Pimpl::active() const { - return workarea->active(); + return workarea_->active(); } bool BufferView::Pimpl::belowMouse() const { - return workarea->belowMouse(); + return workarea_->belowMouse(); } void BufferView::Pimpl::showCursor() { - if (screen) - screen->ShowCursor(); + if (screen_) + screen_->ShowCursor(bv_->text); } void BufferView::Pimpl::hideCursor() { - if (screen) - screen->HideCursor(); + if (screen_) + screen_->HideCursor(); } void BufferView::Pimpl::toggleSelection(bool b) { - if (screen) - screen->ToggleSelection(b); + if (screen_) + screen_->ToggleSelection(bv_->text, b); } void BufferView::Pimpl::toggleToggle() { - if (screen) - screen->ToggleToggle(); + if (screen_) + screen_->ToggleToggle(bv_->text); } void BufferView::Pimpl::center() { beforeChange(); - if (bv_->text->cursor.y > workarea->height() / 2) { - screen->Draw(bv_->text->cursor.y - workarea->height() / 2); + if (bv_->text->cursor.y() > (int)(workarea_->height() / 2)) { + screen_->Draw(bv_->text, bv_->text->cursor.y() - workarea_->height() / 2); } else { - screen->Draw(0); + screen_->Draw(bv_->text, 0); } - update(0); + update(BufferView::SELECT|BufferView::FITCUR); redraw(); } + + +void BufferView::Pimpl::pasteClipboard(bool asPara) +{ + if (buffer_ == 0) return; + + screen_->HideCursor(); + bv_->beforeChange(); + + string clip(workarea_->getClipboard()); + + if (clip.empty()) return; + + if (asPara) { + bv_->text->InsertStringB(bv_, clip); + } else { + bv_->text->InsertStringA(bv_, clip); + } + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); +} + + +void BufferView::Pimpl::stuffClipboard(string const & stuff) const +{ + workarea_->putClipboard(stuff); +}