par.params().read(lex);
} else if (token == "\\end_layout") {
- lyxerr << "Solitary \\end_layout in line " << lex.getLineNo() << "\n"
+ lyxerr << BOOST_CURRENT_FUNCTION
+ << ": Solitary \\end_layout in line "
+ << lex.getLineNo() << "\n"
<< "Missing \\begin_layout?.\n";
} else if (token == "\\end_inset") {
- lyxerr << "Solitary \\end_inset in line " << lex.getLineNo() << "\n"
+ lyxerr << BOOST_CURRENT_FUNCTION
+ << ": Solitary \\end_inset in line "
+ << lex.getLineNo() << "\n"
<< "Missing \\begin_inset?.\n";
} else if (token == "\\begin_inset") {
InsetBase * inset = readInset(lex, buf);
break;
}
}
+ // Initialize begin_of_body_ on load; redoParagraph maintains
+ par.setBeginOfBody();
}
// The most common case is handled first (Asger)
if (IsPrintable(c)) {
- if (font.language()->RightToLeft()) {
+ Language const * language = font.language();
+ if (language->RightToLeft()) {
if ((lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
lyxrc.font_norm_type == LyXRC::ISO_10646_1)
- && font.language()->lang() == "arabic") {
+ && language->lang() == "arabic") {
if (Encodings::IsComposeChar_arabic(c))
return 0;
c = par.transformChar(c, pos);
- } else if (font.language()->lang() == "hebrew" &&
+ } else if (language->lang() == "hebrew" &&
Encodings::IsComposeChar_hebrew(c))
return 0;
}
&& !isFirstInSequence(pit, pars_)))
&& align == LYX_ALIGN_BLOCK
&& !par.params().noindent()
+ // display style insets are always centered, omit indentation
+ && !(!par.empty()
+ && par.isInset(pos)
+ && par.getInset(pos)->display())
// in charstyles, tabulars and ert paragraphs are never indented!
- && (par.ownerCode() != InsetBase::TEXT_CODE
+ && ((par.ownerCode() != InsetBase::TEXT_CODE || isMainText())
&& par.ownerCode() != InsetBase::ERT_CODE
&& par.ownerCode() != InsetBase::CHARSTYLE_CODE)
&& (par.layout() != tclass.defaultLayout()
pos_type const end = row.endpos();
Paragraph const & par = pars_[pit];
- string labelsep = par.layout()->labelsep;
+ string const & labelsep = par.layout()->labelsep;
int w = leftMargin(pit, row.pos());
pos_type const body_pos = par.beginOfBody();
// This is special code for the chapter, since the label of this
// layout is printed in an extra row
- if (layout->counter == "chapter"
+ if (layout->counter == "chapter"
&& !par.params().labelString().empty()) {
labeladdon = int(font_metrics::maxHeight(labelfont)
* layout->spacing.getValue()
if (bv_owner->text() == this) {
if (pit == 0 && row.pos() == 0)
maxasc += 20;
- if (pit == pars_.size() - 1 && row.endpos() == par.size())
+ if (pit + 1 == pars_.size() && row.endpos() == par.size())
maxdesc += 20;
}
current_font = rawtmpfont;
real_current_font = realtmpfont;
- setCursor(cur, cur.pit(), cur.pos() + 1, false, cur.boundary());
+ //setCursor(cur, cur.pit(), cur.pos() + 1, false, cur.boundary());
+ setCursor(cur, cur.pit(), cur.pos() + 1, false, true);
charInserted();
}
// handle the actual deletion of the paragraph.
if (cur.pit() != 0) {
+ // For KeepEmpty layouts we need to get
+ // rid of the keepEmpty setting first.
+ // And the only way to do this is to
+ // reset the layout to something
+ // else: f.ex. the default layout.
+ if (par.allowEmpty()) {
+ Buffer & buf = cur.buffer();
+ BufferParams const & bparams = buf.params();
+ par.layout(bparams.getLyXTextClass().defaultLayout());
+ }
+
cursorLeft(cur);
return;
}
}
-void LyXText::redoParagraph(pit_type const pit)
+bool LyXText::redoParagraph(pit_type const pit)
{
// remove rows of paragraph, keep track of height changes
Paragraph & par = pars_[pit];
+ // Add bibitem insets if necessary
+ if (par.layout()->labeltype == LABEL_BIBLIO) {
+ bool hasbibitem(false);
+ if (!par.insetlist.empty()
+ // Insist on it being in pos 0
+ && par.getChar(0) == Paragraph::META_INSET) {
+ InsetBase * inset = par.insetlist.begin()->inset;
+ if (inset->lyxCode() == InsetBase::BIBITEM_CODE)
+ hasbibitem = true;
+ }
+ if (!hasbibitem) {
+ InsetBibitem * inset(new
+ InsetBibitem(InsetCommandParams("bibitem")));
+ par.insertInset(0, static_cast<InsetBase *>(inset));
+ bv()->cursor().posRight();
+ }
+ }
+
// redo insets
InsetList::iterator ii = par.insetlist.begin();
InsetList::iterator iend = par.insetlist.end();
dim.asc += par.rows()[0].ascent();
dim.des -= par.rows()[0].ascent();
+
+ bool const same = dim == par.dim();
+
par.dim() = dim;
//lyxerr << "redoParagraph: " << par.rows().size() << " rows\n";
+
+ return !same;
}
x2 = 0;
} else {
y1 = bv_funcs::getPos(beg).y_ - row1.ascent();
- int const startx = cursorX(beg.top());
+ int const startx = cursorX(beg.top(), begin.boundary());
x1 = isRTL(par1) ? startx : 0;
x2 = isRTL(par1) ? 0 + dim_.wid : startx;
}
X2 = 0;
} else {
y2 = bv_funcs::getPos(end).y_ + row2.descent();
- int const endx = cursorX(end.top());
+ int const endx = cursorX(end.top(), end.boundary());
X1 = isRTL(par2) ? 0 : endx;
X2 = isRTL(par2) ? endx : 0 + dim_.wid;
}
if (!ptr_cmp(cur.text(), this))
return;
- lyxerr << "draw selection at " << x << endl;
+ lyxerr[Debug::DEBUG]
+ << BOOST_CURRENT_FUNCTION
+ << "draw selection at " << x
+ << endl;
// is there a better way of getting these two iterators?
DocIterator beg = cur;
x2 = dim_.wid;
} else {
Row const & row1 = par1.getRow(beg.pos());
- y1 = bv_funcs::getPos(beg).y_ - row1.ascent();
+ y1 = bv_funcs::getPos(beg, beg.boundary()).y_ - row1.ascent();
y2 = y1 + row1.height();
- int const startx = cursorX(beg.top());
+ int const startx = cursorX(beg.top(), false);
x1 = !isRTL(par1) ? startx : 0;
x2 = !isRTL(par1) ? 0 + dim_.wid : startx;
}
X2 = dim_.wid;
} else {
Row const & row2 = par2.getRow(end.pos());
- Y1 = bv_funcs::getPos(end).y_ - row2.ascent();
+ Y1 = bv_funcs::getPos(end, end.boundary()).y_ - row2.ascent();
Y2 = Y1 + row2.height();
- int const endx = cursorX(end.top());
+ int const endx = cursorX(end.top(), false);
X1 = !isRTL(par2) ? 0 : endx;
X2 = !isRTL(par2) ? endx : 0 + dim_.wid;
}
Y1 - y2, LColor::selection);
}
+
bool LyXText::isLastRow(pit_type pit, Row const & row) const
{
return row.endpos() >= pars_[pit].size()
}
-int LyXText::cursorX(CursorSlice const & cur) const
+int LyXText::cursorX(CursorSlice const & sl, bool boundary) const
{
- pit_type const pit = cur.pit();
+ pit_type const pit = sl.pit();
Paragraph const & par = pars_[pit];
if (par.rows().empty())
return 0;
- Row const & row = par.getRow(cur.pos());
+ pos_type ppos = sl.pos();
+ // Correct position in front of big insets
+ bool const boundary_correction = ppos != 0 && boundary;
+ if (boundary_correction)
+ --ppos;
+
+ Row const & row = par.getRow(ppos);
- pos_type pos = cur.pos();
pos_type cursor_vpos = 0;
RowMetrics const m = computeRowMetrics(pit, row);
if (end <= row_pos)
cursor_vpos = row_pos;
- else if (pos >= end)
+ else if (ppos >= end)
cursor_vpos = isRTL(par) ? row_pos : end;
- else if (pos > row_pos && pos >= end)
+ else if (ppos > row_pos && ppos >= end)
// Place cursor after char at (logical) position pos - 1
- cursor_vpos = (bidi.level(pos - 1) % 2 == 0)
- ? bidi.log2vis(pos - 1) + 1 : bidi.log2vis(pos - 1);
+ cursor_vpos = (bidi.level(ppos - 1) % 2 == 0)
+ ? bidi.log2vis(ppos - 1) + 1 : bidi.log2vis(ppos - 1);
else
- // Place cursor before char at (logical) position pos
- cursor_vpos = (bidi.level(pos) % 2 == 0)
- ? bidi.log2vis(pos) : bidi.log2vis(pos) + 1;
+ // Place cursor before char at (logical) position ppos
+ cursor_vpos = (bidi.level(ppos) % 2 == 0)
+ ? bidi.log2vis(ppos) : bidi.log2vis(ppos) + 1;
pos_type body_pos = par.beginOfBody();
if (body_pos > 0 &&
x -= singleWidth(par, body_pos - 1);
}
- if (hfillExpansion(par, row, pos)) {
- x += singleWidth(par, pos);
- if (pos >= body_pos)
- x += m.hfill;
- else
- x += m.label_hfill;
- } else if (par.isSeparator(pos)) {
- x += singleWidth(par, pos);
- if (pos >= body_pos)
- x += m.separator;
- } else
- x += singleWidth(par, pos);
+ x += singleWidth(par, pos);
+
+ if (hfillExpansion(par, row, pos))
+ x += (pos >= body_pos) ? m.hfill : m.label_hfill;
+ else if (par.isSeparator(pos) && pos >= body_pos)
+ x += m.separator;
}
+
+ // see correction above
+ if (boundary_correction)
+ x += singleWidth(par, ppos);
+
return int(x);
}
-int LyXText::cursorY(CursorSlice const & cur) const
+int LyXText::cursorY(CursorSlice const & sl, bool boundary) const
{
- Paragraph const & par = getPar(cur.pit());
+ //lyxerr << "LyXText::cursorY: boundary: " << boundary << std::endl;
+ Paragraph const & par = getPar(sl.pit());
int h = 0;
h -= pars_[0].rows()[0].ascent();
- for (pit_type pit = 0; pit < cur.pit(); ++pit)
+ for (pit_type pit = 0; pit < sl.pit(); ++pit)
h += pars_[pit].height();
- for (size_t rit = 0, rend = par.pos2row(cur.pos()); rit != rend; ++rit)
+ int pos = sl.pos();
+ if (pos && boundary)
+ --pos;
+ size_t const rend = par.pos2row(pos);
+ for (size_t rit = 0; rit != rend; ++rit)
h += par.rows()[rit].height();
- h += par.rows()[par.pos2row(cur.pos())].ascent();
+ h += par.rows()[rend].ascent();
return h;
}
os << _(", Paragraph: ") << cur.pit();
os << _(", Id: ") << par.id();
os << _(", Position: ") << cur.pos();
+ os << _(", Boundary: ") << cur.boundary();
// Row & row = cur.textRow();
// os << bformat(_(", Row b:%1$d e:%2$d"), row.pos(), row.endpos());
#endif
pos_type LyXText::x2pos(pit_type pit, int row, int x) const
{
- BOOST_ASSERT(row < pars_[pit].rows().size());
+ BOOST_ASSERT(row < int(pars_[pit].rows().size()));
bool bound = false;
Row const & r = pars_[pit].rows()[row];
return r.pos() + getColumnNearX(pit, r, x, bound);
{
pit_type pit = getPitNearY(y);
int yy = theCoords.get(this, pit).y_ - pars_[pit].ascent();
- lyxerr << "setCursorFromCoordinates: x: " << x << " y: " << y
- << " pit: " << pit << " yy: " << yy << endl;
+ lyxerr[Debug::DEBUG]
+ << BOOST_CURRENT_FUNCTION
+ << ": x: " << x
+ << " y: " << y
+ << " pit: " << pit
+ << " yy: " << yy << endl;
Paragraph const & par = pars_[pit];
int r = 0;
Row const & row = par.rows()[r];
- lyxerr << "setCursorFromCoordinates: row " << r
- << " from pos: " << row.pos() << endl;
+ lyxerr[Debug::DEBUG]
+ << BOOST_CURRENT_FUNCTION
+ << ": row " << r
+ << " from pos: " << row.pos()
+ << endl;
bool bound = false;
int xx = x;
pos_type const pos = row.pos() + getColumnNearX(pit, row, xx, bound);
+
+ lyxerr[Debug::DEBUG]
+ << BOOST_CURRENT_FUNCTION
+ << ": setting cursor pit: " << pit
+ << " pos: " << pos
+ << endl;
+
setCursor(cur, pit, pos, true, bound);
}