-void BufferView::Pimpl::workAreaMotionNotify(int x, int y, mouse_button::state state)
-{
- // Only use motion with button 1
- if (!(state & mouse_button::button1))
- return;
-
- if (!buffer_)
- return;
-
- // Check for inset locking
- if (bv_->theLockingInset()) {
- LyXCursor cursor = bv_->text->cursor;
- LyXFont font = bv_->text->getFont(buffer_,
- cursor.par(), cursor.pos());
- int width = bv_->theLockingInset()->width(bv_, font);
- int inset_x = font.isVisibleRightToLeft()
- ? cursor.ix() - width : cursor.ix();
- int start_x = inset_x + bv_->theLockingInset()->scroll();
-
- FuncRequest cmd(bv_, LFUN_MOUSE_MOTION,
- x - start_x, y - cursor.iy() + bv_->text->first_y, state);
- bv_->theLockingInset()->localDispatch(cmd);
- 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
- if (!selection_possible)
- return;
-
- screen().hideCursor();
-
- Row * cursorrow = bv_->text->cursor.row();
- bv_->text->setCursorFromCoordinates(bv_, x, y + bv_->text->first_y);
-#if 0
- // sorry for this but I have a strange error that the y value jumps at
- // a certain point. This seems like an error in my xforms library or
- // in some other local environment, but I would like to leave this here
- // for the moment until I can remove this (Jug 20020418)
- if (y_before < bv_->text->cursor.y())
- lyxerr << y_before << ":" << bv_->text->cursor.y() << endl;
-#endif
- // This is to allow jumping over large insets
- if (cursorrow == bv_->text->cursor.row()) {
- if (y >= int(workarea().workHeight())) {
- bv_->text->cursorDown(bv_, false);
- } else if (y < 0) {
- bv_->text->cursorUp(bv_, false);
- }
- }
-
- if (!bv_->text->selection.set())
- update(bv_->text, BufferView::UPDATE); // Maybe an empty line was deleted
-
- bv_->text->setSelection(bv_);
- screen().toggleToggle(bv_->text, bv_);
- fitCursor();
- showCursor();
-}
-
-
-// Single-click on work area
-void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos,
- mouse_button::state button)
-{
- if (!buffer_)
- return;
-
- // ok ok, this is a hack (for xforms)
- if (button == mouse_button::button4) {
- scroll(-lyxrc.wheel_jump);
- // We shouldn't go further down as we really should only do the
- // scrolling and be done with this. Otherwise we may open some
- // dialogs (Jug 20020424).
- return;
- } else if (button == mouse_button::button5) {
- scroll(lyxrc.wheel_jump);
- // We shouldn't go further down as we really should only do the
- // scrolling and be done with this. Otherwise we may open some
- // dialogs (Jug 20020424).
- return;
- }
-
- Inset * inset_hit = checkInsetHit(bv_->text, xpos, ypos);
-
- // Middle button press pastes if we have a selection
- // We do this here as if the selection was inside an inset
- // it could get cleared on the unlocking of the inset so
- // we have to check this first
- bool paste_internally = false;
- if (button == mouse_button::button2 && bv_->getLyXText()->selection.set()) {
- owner_->dispatch(FuncRequest(LFUN_COPY));
- paste_internally = true;
- }
-
- int const screen_first = bv_->text->first_y;
-
- 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_->theLockingInset()) {
- FuncRequest cmd(bv_, LFUN_MOUSE_PRESS, xpos, ypos, button);
- bv_->theLockingInset()->localDispatch(cmd);
- return;
- }
- bv_->unlockInset(bv_->theLockingInset());
- }
-
- if (!inset_hit)
- selection_possible = true;
- screen().hideCursor();
-
- // Clear the selection
- screen().toggleSelection(bv_->text, bv_);
- bv_->text->clearSelection();
- bv_->text->fullRebreak(bv_);
- update();
- updateScrollbar();
-
- // Single left click in math inset?
- if (isHighlyEditableInset(inset_hit)) {
- // Highly editable inset, like math
- UpdatableInset * inset = static_cast<UpdatableInset *>(inset_hit);
- selection_possible = false;
- owner_->updateLayoutChoice();
- owner_->message(inset->editMessage());
- //inset->edit(bv_, xpos, ypos, button);
- // We just have to lock the inset before calling a PressEvent on it!
- // we don't need the edit() call here! (Jug20020329)
- if (!bv_->lockInset(inset)) {
- lyxerr[Debug::INSETS] << "Cannot lock inset" << endl;
- }
- FuncRequest cmd(bv_, LFUN_MOUSE_PRESS, xpos, ypos, button);
- inset->localDispatch(cmd);
- return;
- }
- // I'm not sure we should continue here if we hit an inset (Jug20020403)
-
- // Right click on a footnote flag opens float menu
- if (button == mouse_button::button3) {
- selection_possible = false;
- return;
- }
-
- if (!inset_hit) // otherwise it was already set in checkInsetHit(...)
- bv_->text->setCursorFromCoordinates(bv_, xpos, ypos + screen_first);
- finishUndo();
- bv_->text->selection.cursor = bv_->text->cursor;
- bv_->text->cursor.x_fix(bv_->text->cursor.x());
-
- owner_->updateLayoutChoice();
- if (fitCursor()) {
- selection_possible = false;
- }
-
- // Insert primary selection with middle mouse
- // if there is a local selection in the current buffer,
- // insert this
- if (button == mouse_button::button2) {
- if (paste_internally)
- owner_->dispatch(FuncRequest(LFUN_PASTE));
- else
- owner_->dispatch(FuncRequest(LFUN_PASTESELECTION, "paragraph"));
- selection_possible = false;
- return;
- }
-}
-
-
-void BufferView::Pimpl::doubleClick(int /*x*/, int /*y*/, mouse_button::state button)
-{
- if (!buffer_)
- return;
-
- LyXText * text = bv_->getLyXText();
-
- if (text->bv_owner && bv_->theLockingInset())
- return;
-
- if (button == mouse_button::button1) {
- if (text->bv_owner) {
- screen().hideCursor();
- screen().toggleSelection(text, bv_);
- text->selectWord(bv_, LyXText::WHOLE_WORD_STRICT);
- screen().toggleSelection(text, bv_, false);
- } else {
- text->selectWord(bv_, LyXText::WHOLE_WORD_STRICT);
- }
- // This will fit the cursor on the screen if necessary
- update(text, BufferView::SELECT|BufferView::FITCUR);
- workarea().haveSelection(bv_->getLyXText()->selection.set());
- }
-}
-
-
-void BufferView::Pimpl::tripleClick(int /*x*/, int /*y*/, mouse_button::state button)
-{
- if (!buffer_)
- return;
-
- LyXText * text = bv_->getLyXText();
-
- if (text->bv_owner && bv_->theLockingInset())
- return;
-
- if (button == mouse_button::button1) {
- if (text->bv_owner) {
- screen().hideCursor();
- screen().toggleSelection(text, bv_);
- }
- text->cursorHome(bv_);
- text->selection.cursor = text->cursor;
- text->cursorEnd(bv_);
- text->setSelection(bv_);
- if (text->bv_owner) {
- screen().toggleSelection(text, bv_, false);
- }
- // This will fit the cursor on the screen if necessary
- update(text, BufferView::SELECT|BufferView::FITCUR);
- workarea().haveSelection(bv_->getLyXText()->selection.set());
- }
-}
-
-