- BOOST_ASSERT(pit >= 0);
- BOOST_ASSERT(pit < int(pars_.size()));
- return leftMargin(buffer, max_width, pit, pars_[pit].size());
-}
-
-
-int Text::leftMargin(Buffer const & buffer, int max_width,
- pit_type const pit, pos_type const pos) const
-{
- BOOST_ASSERT(pit >= 0);
- BOOST_ASSERT(pit < int(pars_.size()));
- Paragraph const & par = pars_[pit];
- BOOST_ASSERT(pos >= 0);
- BOOST_ASSERT(pos <= par.size());
- //lyxerr << "Text::leftMargin: pit: " << pit << " pos: " << pos << endl;
- TextClass const & tclass = buffer.params().getTextClass();
- Layout_ptr const & layout = par.layout();
-
- string parindent = layout->parindent;
-
- int l_margin = 0;
-
- if (isMainText(buffer))
- l_margin += changebarMargin();
-
- // FIXME UNICODE
- docstring leftm = from_utf8(tclass.leftmargin());
- l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(leftm);
-
- if (par.getDepth() != 0) {
- // find the next level paragraph
- pit_type newpar = outerHook(pit, pars_);
- if (newpar != pit_type(pars_.size())) {
- if (pars_[newpar].layout()->isEnvironment()) {
- l_margin = leftMargin(buffer, max_width, newpar);
- }
- if (par.layout() == tclass.defaultLayout()) {
- if (pars_[newpar].params().noindent())
- parindent.erase();
- else
- parindent = pars_[newpar].layout()->parindent;
- }
- }
- }
-
- // This happens after sections in standard classes. The 1.3.x
- // code compared depths too, but it does not seem necessary
- // (JMarc)
- if (par.layout() == tclass.defaultLayout()
- && pit > 0 && pars_[pit - 1].layout()->nextnoindent)
- parindent.erase();
-
- Font const labelfont = getLabelFont(buffer, par);
- FontMetrics const & labelfont_metrics = theFontMetrics(labelfont);
-
- switch (layout->margintype) {
- case MARGIN_DYNAMIC:
- if (!layout->leftmargin.empty()) {
- // FIXME UNICODE
- docstring leftm = from_utf8(layout->leftmargin);
- l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(leftm);
- }
- if (!par.getLabelstring().empty()) {
- // FIXME UNICODE
- docstring labin = from_utf8(layout->labelindent);
- l_margin += labelfont_metrics.signedWidth(labin);
- docstring labstr = par.getLabelstring();
- l_margin += labelfont_metrics.width(labstr);
- docstring labsep = from_utf8(layout->labelsep);
- l_margin += labelfont_metrics.width(labsep);
- }
- break;
-
- case MARGIN_MANUAL: {
- // FIXME UNICODE
- docstring labin = from_utf8(layout->labelindent);
- l_margin += labelfont_metrics.signedWidth(labin);
- // The width of an empty par, even with manual label, should be 0
- if (!par.empty() && pos >= par.beginOfBody()) {
- if (!par.getLabelWidthString().empty()) {
- docstring labstr = par.getLabelWidthString();
- l_margin += labelfont_metrics.width(labstr);
- docstring labsep = from_utf8(layout->labelsep);
- l_margin += labelfont_metrics.width(labsep);
- }
- }
- break;
- }
-
- case MARGIN_STATIC: {
- // FIXME UNICODE
- docstring leftm = from_utf8(layout->leftmargin);
- l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(leftm)
- * 4 / (par.getDepth() + 4);
- break;
- }
-
- case MARGIN_FIRST_DYNAMIC:
- if (layout->labeltype == LABEL_MANUAL) {
- if (pos >= par.beginOfBody()) {
- // FIXME UNICODE
- l_margin += labelfont_metrics.signedWidth(
- from_utf8(layout->leftmargin));
- } else {
- // FIXME UNICODE
- l_margin += labelfont_metrics.signedWidth(
- from_utf8(layout->labelindent));
- }
- } else if (pos != 0
- // Special case to fix problems with
- // theorems (JMarc)
- || (layout->labeltype == LABEL_STATIC
- && layout->latextype == LATEX_ENVIRONMENT
- && !isFirstInSequence(pit, pars_))) {
- // FIXME UNICODE
- l_margin += labelfont_metrics.signedWidth(from_utf8(layout->leftmargin));
- } else if (layout->labeltype != LABEL_TOP_ENVIRONMENT
- && layout->labeltype != LABEL_BIBLIO
- && layout->labeltype !=
- LABEL_CENTERED_TOP_ENVIRONMENT) {
- l_margin += labelfont_metrics.signedWidth(from_utf8(layout->labelindent));
- l_margin += labelfont_metrics.width(from_utf8(layout->labelsep));
- l_margin += labelfont_metrics.width(par.getLabelstring());
- }
- break;
-
- case MARGIN_RIGHT_ADDRESS_BOX: {
-#if 0
- // ok, a terrible hack. The left margin depends on the widest
- // row in this paragraph.
- RowList::iterator rit = par.rows().begin();
- RowList::iterator end = par.rows().end();
- // FIXME: This is wrong.
- int minfill = max_width;
- for ( ; rit != end; ++rit)
- if (rit->fill() < minfill)
- minfill = rit->fill();
- l_margin += theFontMetrics(params.getFont()).signedWidth(layout->leftmargin);
- l_margin += minfill;
-#endif
- // also wrong, but much shorter.
- l_margin += max_width / 2;
- break;
- }
- }
-
- if (!par.params().leftIndent().zero())
- l_margin += par.params().leftIndent().inPixels(max_width);
-
- LyXAlignment align;
-
- if (par.params().align() == LYX_ALIGN_LAYOUT)
- align = layout->align;
- else
- align = par.params().align();
-
- // set the correct parindent
- if (pos == 0
- && (layout->labeltype == LABEL_NO_LABEL
- || layout->labeltype == LABEL_TOP_ENVIRONMENT
- || layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT
- || (layout->labeltype == LABEL_STATIC
- && layout->latextype == LATEX_ENVIRONMENT
- && !isFirstInSequence(pit, pars_)))
- && align == LYX_ALIGN_BLOCK
- && !par.params().noindent()
- // in some insets, paragraphs are never indented
- && !(par.inInset() && par.inInset()->neverIndent(buffer))
- // display style insets are always centered, omit indentation
- && !(!par.empty()
- && par.isInset(pos)
- && par.getInset(pos)->display())
- && (par.layout() != tclass.defaultLayout()
- || buffer.params().paragraph_separation ==
- BufferParams::PARSEP_INDENT))
- {
- docstring din = from_utf8(parindent);
- l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(din);
- }
-
- return l_margin;
-}
-
-
-Color_color Text::backgroundColor() const
-{
- return Color_color(Color::color(background_color_));
-}
-
-
-void Text::breakParagraph(Cursor & cur, bool keep_layout)
-{
- BOOST_ASSERT(this == cur.text());