]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView_pimpl.C
remove noload/don't typeset
[lyx.git] / src / BufferView_pimpl.C
index 949281956fcebe9708c1513ec24bda3db8b24471..86621ce1499ff6388b2c7098221ce747a0ad7c08 100644 (file)
 #include "ParagraphParameters.h"
 #include "undo_funcs.h"
 #include "funcrequest.h"
-#include "box.h"
 
 #include "insets/insetbib.h"
 #include "insets/insettext.h"
-#include "insets/inseturl.h"
 #include "insets/insetlatexaccent.h"
 #include "insets/insettoc.h"
-#include "insets/insetref.h"
-#include "insets/insetparent.h"
 #include "insets/insetindex.h"
+#include "insets/insetref.h"
 #include "insets/insetinclude.h"
 #include "insets/insetcite.h"
 #include "insets/insetgraphics.h"
 #include "insets/insetmarginal.h"
-#include "insets/insetcaption.h"
 #include "insets/insetfloatlist.h"
 
 #include "mathed/formulabase.h"
@@ -83,12 +79,7 @@ using std::min;
 
 using lyx::pos_type;
 
-/* the selection possible is needed, that only motion events are
- * used, where the bottom press event was on the drawing area too */
-bool selection_possible = false;
-
 extern BufferList bufferlist;
-extern int bibitemMaxWidth(BufferView *, LyXFont const &);
 
 
 namespace {
@@ -109,71 +100,6 @@ boost::signals::connection selectioncon;
 boost::signals::connection lostcon;
 
 
-       /**
-        * Return the on-screen dimensions of the inset at the cursor.
-        * Pre-condition: the cursor must be at an inset.
-        */
-Box insetDimensions(BufferView * bv, LyXText const & text,
-                                      LyXCursor const & cursor)
-{
-       Paragraph /*const*/ & par = *cursor.par();
-       pos_type const pos = cursor.pos();
-
-       lyx::Assert(par.getInset(pos));
-
-       Inset const & inset(*par.getInset(pos));
-
-       LyXFont const & font = text.getFont(bv->buffer(), &par, pos);
-
-       int const width = inset.width(bv, font);
-       int const inset_x = font.isVisibleRightToLeft()
-               ? (cursor.ix() - width) : cursor.ix();
-
-       return Box(
-               inset_x + inset.scroll(),
-               inset_x + width,
-               cursor.iy() - inset.ascent(bv, font),
-               cursor.iy() + inset.descent(bv, font));
-}
-
-
-/**
- * check if the given co-ordinates are inside an inset at the
- * given cursor, if one exists. If so, the inset is returned,
- * and the co-ordinates are made relative. Otherwise, 0 is returned.
- */
-Inset * checkInset(BufferView * bv, LyXText const & text,
-                                     LyXCursor const & cursor, int & x, int & y)
-{
-       pos_type const pos = cursor.pos();
-       Paragraph /*const*/ & par(*cursor.par());
-
-       if (pos >= par.size() || !par.isInset(pos)) {
-               return 0;
-       }
-
-       Inset /*const*/ * inset = par.getInset(pos);
-
-       if (!isEditableInset(inset)) 
-               return 0;
-
-       Box b = insetDimensions(bv, text, cursor);
-
-       if (!b.contained(x, y)) {
-               lyxerr[Debug::GUI] << "Missed inset at x,y " << x << "," << y
-                       << " box " << b << endl;
-               return 0;
-       }
-
-       text.setCursor(bv, &par, pos, true);
-
-       x -= b.x1;
-       // The origin of an inset is on the baseline
-       y -= text.cursor.iy();
-
-       return inset;
-}
-
 } // anon namespace
 
 
@@ -437,13 +363,13 @@ void BufferView::Pimpl::scrollDocView(int value)
 {
        lyxerr[Debug::GUI] << "scrollDocView of " << value << endl;
 
-       if (!buffer_) return;
+       if (!buffer_)
+               return;
 
        screen().draw(bv_->text, bv_, value);
 
-       if (!lyxrc.cursor_follows_scrollbar) {
+       if (!lyxrc.cursor_follows_scrollbar)
                return;
-       }
 
        LyXText * vbt = bv_->text;
 
@@ -519,37 +445,6 @@ void BufferView::Pimpl::selectionLost()
 }
 
 
-
-Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y)
-{
-       int y_tmp = y + text->first_y;
-
-       LyXCursor cursor;
-       text->setCursorFromCoordinates(bv_, cursor, x, y_tmp);
-
-       Inset * inset = checkInset(bv_, *text, cursor, x, y_tmp);
-
-       if (inset) {
-               y = y_tmp;
-               return inset;
-       }
-
-       // look at previous position
-       if (cursor.pos() == 0) {
-               return 0;
-       }
-
-       // move back one
-       text->setCursor(bv_, cursor, cursor.par(), cursor.pos() - 1, true);
-
-       inset = checkInset(bv_, *text, cursor, x, y_tmp);
-       if (inset) {
-               y = y_tmp;
-       }
-       return inset;
-}
-
-
 void BufferView::Pimpl::workAreaResize()
 {
        static int work_area_width;
@@ -1007,20 +902,14 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev)
                << " button[" << ev.button() << "]"
                << endl;
 
+       // e.g. Qt mouse press when no buffer
+       if (!buffer_)
+               return false;
        LyXTextClass const & tclass = buffer_->params.getLyXTextClass();
 
        switch (ev.action) {
 
-       case LFUN_TOC_INSERT:
-       {
-               InsetCommandParams p;
-               p.setCmdName("tableofcontents");
-               Inset * inset = new InsetTOC(p);
-               if (!insertInset(inset, tclass.defaultLayoutName()))
-                       delete inset;
-               break;
-       }
-
        case LFUN_SCROLL_INSET:
                // this is not handled here as this function is only active
                // if we have a locking_inset and that one is (or contains)
@@ -1178,52 +1067,6 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev)
        }
        break;
 
-       case LFUN_HTMLURL:
-       case LFUN_URL:
-       {
-               InsetCommandParams p;
-               if (ev.action == LFUN_HTMLURL)
-                       p.setCmdName("htmlurl");
-               else
-                       p.setCmdName("url");
-               owner_->getDialogs().createUrl(p.getAsString());
-       }
-       break;
-
-       case LFUN_INSERT_URL:
-       {
-               InsetCommandParams p;
-               p.setFromString(ev.argument);
-
-               InsetUrl * inset = new InsetUrl(p);
-               if (!insertInset(inset))
-                       delete inset;
-               else
-                       updateInset(inset, true);
-       }
-       break;
-
-       case LFUN_INSET_CAPTION:
-       {
-               // Do we have a locking inset...
-               if (bv_->theLockingInset()) {
-                       lyxerr << "Locking inset code: "
-                              << static_cast<int>(bv_->theLockingInset()->lyxCode());
-                       InsetCaption * new_inset =
-                               new InsetCaption(buffer_->params);
-                       new_inset->setOwner(bv_->theLockingInset());
-                       new_inset->setAutoBreakRows(true);
-                       new_inset->setDrawFrame(0, InsetText::LOCKED);
-                       new_inset->setFrameColor(0, LColor::captionframe);
-                       if (insertInset(new_inset))
-                               new_inset->edit(bv_);
-                       else
-                               delete new_inset;
-               }
-       }
-       break;
-
-
        // --- accented characters ---------------------------
 
        case LFUN_UMLAUT:
@@ -1317,9 +1160,8 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev)
        {
                InsetBibtex * inset =
                        static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
-               if (inset) {
+               if (inset)
                        inset->delDatabase(ev.argument);
-               }
        }
        break;
 
@@ -1327,56 +1169,16 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev)
        {
                InsetBibtex * inset =
                        static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
-               if (inset) {
+               if (inset) 
                        inset->setOptions(ev.argument);
-               }
-       }
-       break;
-
-       case LFUN_INDEX_INSERT:
-       {
-               string entry = ev.argument;
-               if (entry.empty())
-                       entry = bv_->getLyXText()->getStringToIndex(bv_);
-
-               if (entry.empty()) {
-                       owner_->getDialogs().createIndex();
-                       break;
-               }
-
-               InsetIndex * inset = new InsetIndex(InsetCommandParams("index", entry));
-
-               if (!insertInset(inset)) {
-                       delete inset;
-               } else {
-                       updateInset(inset, true);
-               }
-       }
-       break;
-
-       case LFUN_INDEX_PRINT:
-       {
-               InsetCommandParams p("printindex");
-               Inset * inset = new InsetPrintIndex(p);
-               if (!insertInset(inset, tclass.defaultLayoutName()))
-                       delete inset;
        }
        break;
 
-       case LFUN_PARENTINSERT:
-       {
-               InsetCommandParams p("lyxparent", ev.argument);
-               Inset * inset = new InsetParent(p, *buffer_);
-               if (!insertInset(inset, tclass.defaultLayoutName()))
-                       delete inset;
-       }
-
-       break;
-
        case LFUN_CHILD_INSERT:
        {
                InsetInclude::Params p;
-               p.cparams.setFromString(ev.argument);
+               if (!ev.argument.empty())
+                       p.cparams.setFromString(ev.argument);
                p.masterFilename_ = buffer_->fileName();
 
                InsetInclude * inset = new InsetInclude(p);
@@ -1425,351 +1227,6 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev)
                ev.errorMessage(N_("Unknown function!"));
                break;
 
-       case LFUN_MOUSE_TRIPLE:
-       {
-               if (!buffer_)
-                       return false;
-
-               LyXText * text = bv_->getLyXText();
-
-               if (text->bv_owner && bv_->theLockingInset())
-                       return false;
-
-               if (ev.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());
-               }
-               break;
-       }
-
-       case LFUN_MOUSE_DOUBLE:
-       {
-               if (!buffer_)
-                       return false;
-
-               LyXText * text = bv_->getLyXText();
-
-               if (text->bv_owner && bv_->theLockingInset())
-                       return false;
-
-               if (ev.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());
-               }
-               break;
-       }
-
-       case LFUN_MOUSE_MOTION:
-       {
-               // Only use motion with button 1
-               //if (ev.button() != mouse_button::button1)
-               //      return false;
-
-               if (!buffer_)
-                       return false;
-
-               // 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,
-                         ev.x - start_x, ev.y - cursor.iy() + bv_->text->first_y, ev.button());
-                       bv_->theLockingInset()->localDispatch(cmd);
-                       return false;
-               }
-
-               // 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) {
-                       lyxerr[Debug::ACTION]
-                               << "BufferView::Pimpl::Dispatch: no selection possible\n";
-                       return false;
-               }
-
-               screen().hideCursor();
-
-               Row * cursorrow = bv_->text->cursor.row();
-               bv_->text->setCursorFromCoordinates(bv_, ev.x, ev.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 (ev.y >= int(workarea().workHeight())) {
-                               bv_->text->cursorDown(bv_, false);
-                       } else if (ev.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();
-               break;
-       }
-
-       // Single-click on work area
-       case LFUN_MOUSE_PRESS:
-       {
-               if (!buffer_)
-                       return false;
-
-               // ok ok, this is a hack (for xforms)
-               if (ev.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 false;
-               }
-               if (ev.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 false;
-               }
-
-               int x = ev.x;
-               int y = ev.y;
-               Inset * inset_hit = checkInsetHit(bv_->text, x, y);
-
-               // 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 (ev.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, x, y, ev.button());
-                               bv_->theLockingInset()->localDispatch(cmd);
-                               return false;
-                       }
-                       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_, x, y, ev.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, x, y, ev.button());
-                       inset->localDispatch(cmd);
-                       return false;
-               }
-               // I'm not sure we should continue here if we hit an inset (Jug20020403)
-
-               // Right click on a footnote flag opens float menu
-               if (ev.button() == mouse_button::button3) {
-                       selection_possible = false;
-                       return false;
-               }
-
-               if (!inset_hit) // otherwise it was already set in checkInsetHit(...)
-                       bv_->text->setCursorFromCoordinates(bv_, x, y + 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 (ev.button() == mouse_button::button2) {
-                       if (paste_internally)
-                               owner_->dispatch(FuncRequest(LFUN_PASTE));
-                       else
-                               owner_->dispatch(FuncRequest(LFUN_PASTESELECTION, "paragraph"));
-                       selection_possible = false;
-                       return false;
-               }
-               break;
-       }
-
-       case LFUN_MOUSE_RELEASE:
-       {
-               // do nothing if we used the mouse wheel
-               if (!buffer_
-                               || ev.button() == mouse_button::button4
-                               || ev.button() == mouse_button::button5)
-                       return false;
-
-               // 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.
-               int x = ev.x;
-               int y = ev.y;
-               Inset * inset_hit = checkInsetHit(bv_->text, x, y);
-
-               if (bv_->theLockingInset()) {
-                       // We are in inset locking mode.
-
-                       // LyX does a kind of work-area grabbing for insets.
-                       // Only a ButtonPress FuncRequest outside the inset will
-                       // force a insetUnlock.
-                       FuncRequest cmd(bv_, LFUN_MOUSE_RELEASE, x, y, ev.button());
-                       bv_->theLockingInset()->localDispatch(cmd);
-                       return false;
-               }
-
-               selection_possible = false;
-
-               if (ev.button() == mouse_button::button2)
-                       return false;
-
-               // finish selection
-               if (ev.button() == mouse_button::button1) {
-                       workarea().haveSelection(bv_->getLyXText()->selection.set());
-               }
-
-               switchKeyMap();
-               owner_->view_state_changed();
-               owner_->updateMenubar();
-               owner_->updateToolbar();
-
-               // Did we hit an editable inset?
-               if (inset_hit) {
-                       selection_possible = false;
-
-                       // if we reach this point with a selection, it
-                       // must mean we are currently selecting.
-                       // But we don't want to open the inset
-                       // because that is annoying for the user.
-                       // So just pretend we didn't hit it.
-                       // this is OK because a "kosher" ButtonRelease
-                       // will follow a ButtonPress that clears
-                       // the selection.
-                       // Note this also fixes selection drawing
-                       // problems if we end up opening an inset
-                       if (bv_->getLyXText()->selection.set())
-                               return false;
-
-                       // CHECK fix this proper in 0.13
-                       // well, maybe 13.0 !!!!!!!!!
-
-                       // Following a ref shouldn't issue
-                       // a push on the undo-stack
-                       // anylonger, now that we have
-                       // keybindings for following
-                       // references and returning from
-                       // references.  IMHO though, it
-                       // should be the inset's own business
-                       // to push or not push on the undo
-                       // stack. They don't *have* to
-                       // alter the document...
-                       // (Joacim)
-                       // ...or maybe the SetCursorParUndo()
-                       // below isn't necessary at all anylonger?
-                       if (inset_hit->lyxCode() == Inset::REF_CODE) {
-                               setCursorParUndo(bv_);
-                       }
-
-                       owner_->message(inset_hit->editMessage());
-
-                       if (isHighlyEditableInset(inset_hit)) {
-                               // Highly editable inset, like math
-                               UpdatableInset *inset = (UpdatableInset *)inset_hit;
-                               FuncRequest cmd(bv_, LFUN_MOUSE_RELEASE, x, y, ev.button());
-                               inset->localDispatch(cmd);
-                       } else {
-                               FuncRequest cmd(bv_, LFUN_MOUSE_RELEASE, x, y, ev.button());
-                               inset_hit->localDispatch(cmd);
-                               // IMO this is a grosshack! Inset's should be changed so that
-                               // they call the actions they have to do with the insetButtonRel.
-                               // function and not in the edit(). This should be changed
-                               // (Jug 20020329)
-       #ifdef WITH_WARNINGS
-       #warning Please remove donot call inset->edit() here (Jug 20020812)
-       #endif
-                               inset_hit->edit(bv_, x, y, ev.button());
-                       }
-                       return false;
-               }
-
-               // Maybe we want to edit a bibitem ale970302
-               if (bv_->text->cursor.par()->bibkey) {
-                       bool const is_rtl = bv_->text->cursor.par()->isRightToLeftPar(buffer_->params);
-                       int const width = bibitemMaxWidth(bv_, buffer_->params.getLyXTextClass().defaultfont());
-                       if ((is_rtl && x > bv_->text->workWidth(bv_)-20-width) ||
-                                       (!is_rtl && x < 20+width)) {
-                               bv_->text->cursor.par()->bibkey->edit(bv_, 0, 0, mouse_button::none);
-                       }
-               }
-               return false;
-       }
-
        default:
                return bv_->getLyXText()->dispatch(FuncRequest(ev, bv_));
        } // end of switch
@@ -1784,7 +1241,7 @@ bool BufferView::Pimpl::insertInset(Inset * inset, string const & lout)
        // inset there otherwise this is a illegal function now
        if (bv_->theLockingInset()) {
                if (bv_->theLockingInset()->insetAllowed(inset))
-                   return bv_->theLockingInset()->insertInset(bv_, inset);
+                       return bv_->theLockingInset()->insertInset(bv_, inset);
                return false;
        }