-/*
- * Returns an inset if inset was hit. 0 otherwise.
- * If hit, the coordinates are changed relative to the inset.
- * Otherwise coordinates are not changed, and false is returned.
- */
-Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y,
- unsigned int /* button */)
+Box BufferView::Pimpl::insetDimensions(LyXText const & text,
+ LyXCursor const & cursor) const
+{
+ 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(buffer_, &par, pos);
+
+ int const width = inset.width(bv_, font);
+ int const inset_x = font.isVisibleRightToLeft()
+ ? (cursor.x() - width) : cursor.x();
+
+ return Box(
+ inset_x + inset.scroll(),
+ inset_x + width,
+ cursor.y() - inset.ascent(bv_, font),
+ cursor.y() + inset.descent(bv_, font));
+}
+
+
+Inset * BufferView::Pimpl::checkInset(LyXText const & text,
+ LyXCursor const & cursor,
+ int & x, int & y) const
+{
+ 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(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.y());
+
+ return inset;
+}
+
+
+Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y)