Paragraph const & par = text_->getPar(pit);
pos_type last = par.beginOfBody();
- LBUFERR(last > 0);
+ LBUFERR(last > 0 || par.isEnvSeparator(0));
// -1 because a label ends with a space that is in the label
--last;
// a separator at this end does not count
- if (par.isLineSeparator(last))
+ if (last >= 0 && par.isLineSeparator(last))
--last;
int w = 0;
int yy = y; // is modified by getPitAndRowNearY
Row const & row = getPitAndRowNearY(yy, pit, assert_in_view, up);
- bool bound = false; // is modified by getColumnNearX
- int xx = x; // is modified by getColumnNearX
- pos_type const pos = row.pos()
- + getColumnNearX(pit, row, xx, bound);
cur.pit() = pit;
- cur.pos() = pos;
- cur.boundary(bound);
- cur.setTargetX(x);
- // try to descend into nested insets
- Inset * inset = checkInsetHit(x, yy);
- //lyxerr << "inset " << inset << " hit at x: " << x << " y: " << y << endl;
- if (!inset) {
+ // Do we cover an inset?
+ InsetList::InsetTable * it = checkInsetHit(pit, x, yy);
+
+ if (!it) {
+ // No inset, set position in the text
+ bool bound = false; // is modified by getColumnNearX
+ int xx = x; // is modified by getColumnNearX
+ cur.pos() = row.pos()
+ + getColumnNearX(pit, row, xx, bound);
+ cur.boundary(bound);
cur.setCurrentFont();
+ cur.setTargetX(xx);
return 0;
}
- ParagraphList const & pars = text_->paragraphs();
- Inset const * inset_before = pos ? pars[pit].getInset(pos - 1) : 0;
-
- // This should be just before or just behind the
- // cursor position set above.
- LASSERT(inset == inset_before
- || inset == pars[pit].getInset(pos), return 0);
-
- // Make sure the cursor points to the position before
- // this inset.
- if (inset == inset_before) {
- --cur.pos();
- cur.boundary(false);
- }
+ Inset * inset = it->inset;
+ //lyxerr << "inset " << inset << " hit at x: " << x << " y: " << y << endl;
+
+ // Set position in front of inset
+ cur.pos() = it->pos;
+ cur.boundary(false);
+ cur.setTargetX(x);
// Try to descend recursively inside the inset.
inset = inset->editXY(cur, x, yy);
//takes screen x,y coordinates
-Inset * TextMetrics::checkInsetHit(int x, int y)
+InsetList::InsetTable * TextMetrics::checkInsetHit(pit_type pit, int x, int y)
{
- pit_type pit = getPitNearY(y);
- LASSERT(pit != -1, return 0);
-
Paragraph const & par = text_->paragraphs()[pit];
ParagraphMetrics const & pm = par_metrics_[pit];
&& y >= p.y_ - dim.asc
&& y <= p.y_ + dim.des) {
LYXERR(Debug::DEBUG, "Hit inset: " << inset);
- return inset;
+ return const_cast<InsetList::InsetTable *>(&(*iit));
}
}
}
+//takes screen x,y coordinates
+Inset * TextMetrics::checkInsetHit(int x, int y)
+{
+ pit_type const pit = getPitNearY(y);
+ LASSERT(pit != -1, return 0);
+ InsetList::InsetTable * it = checkInsetHit(pit, x, y);
+
+ if (!it)
+ return 0;
+
+ return it->inset;
+}
+
+
int TextMetrics::cursorX(CursorSlice const & sl,
bool boundary) const
{
if (newpar != pit_type(pars.size())) {
if (pars[newpar].layout().isEnvironment()) {
l_margin = leftMargin(max_width, newpar);
+ // Remove the parindent that has been added
+ // if the paragraph was empty.
+ if (pars[newpar].empty() &&
+ buffer.params().paragraph_separation ==
+ BufferParams::ParagraphIndentSeparation) {
+ docstring pi = pars[newpar].layout().parindent;
+ l_margin -= theFontMetrics(
+ buffer.params().getFont()).signedWidth(pi);
+ }
}
if (tclass.isDefaultLayout(par.layout())
|| tclass.isPlainLayout(par.layout())) {
// This happens after sections or environments in standard classes.
// We have to check the previous layout at same depth.
- if (tclass.isDefaultLayout(par.layout()) && pit > 0
- && pars[pit - 1].getDepth() >= par.getDepth()) {
+ if (buffer.params().paragraph_separation ==
+ BufferParams::ParagraphSkipSeparation)
+ parindent.erase();
+ else if (pit > 0 && pars[pit - 1].getDepth() >= par.getDepth()) {
pit_type prev = text_->depthHook(pit, par.getDepth());
- if (pars[prev < pit ? prev : pit - 1].layout().nextnoindent)
+ if (par.layout() == pars[prev].layout()) {
+ if (prev != pit - 1
+ && pars[pit - 1].layout().nextnoindent)
+ parindent.erase();
+ } else if (pars[prev].layout().nextnoindent)
parindent.erase();
}