X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext.C;h=f4da5dd0b847fee8702d772a1c9c17ff3f022c79;hb=5702f22ef0ea3d167fc5f327002d7006eef657b4;hp=33aa39f811651ecf1aff3cedabb092d6e0c8ae6d;hpb=7eace1d85bc309f75f205877f443a2339a9f532f;p=lyx.git diff --git a/src/text.C b/src/text.C index 33aa39f811..f4da5dd0b8 100644 --- a/src/text.C +++ b/src/text.C @@ -100,10 +100,10 @@ int LyXText::workWidth(BufferView * bview, Inset * inset) const int dummy_y; Row * row = getRow(par, pos, dummy_y); Row * frow = row; - while(frow->previous() && frow->par() == frow->previous()->par()) + while (frow->previous() && frow->par() == frow->previous()->par()) frow = frow->previous(); unsigned int maxw = 0; - while(frow->next() && frow->par() == frow->next()->par()) { + while (frow->next() && frow->par() == frow->next()->par()) { if ((frow != row) && (maxw < frow->width())) maxw = frow->width(); frow = frow->next(); @@ -1127,7 +1127,7 @@ int LyXText::numberOfHfills(Buffer const * buf, Row const * row) const pos_type first = row->pos(); if (first) { /* hfill *DO* count at the beginning * of paragraphs! */ - while(first <= last && row->par()->isHfill(first)) + while (first <= last && row->par()->isHfill(first)) ++first; } @@ -1150,7 +1150,7 @@ int LyXText::numberOfLabelHfills(Buffer const * buf, Row const * row) const pos_type first = row->pos(); if (first) { /* hfill *DO* count at the beginning * of paragraphs! */ - while(first < last && row->par()->isHfill(first)) + while (first < last && row->par()->isHfill(first)) ++first; } @@ -1342,9 +1342,8 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const maxasc += LYX_PAPER_MARGIN; // add the vertical spaces, that the user added - if (firstpar->params().spaceTop().kind() != VSpace::NONE) - maxasc += int(firstpar->params().spaceTop().inPixels(bview)); - + maxasc += getLengthMarkerHeight(bview, firstpar->params().spaceTop()); + // do not forget the DTP-lines! // there height depends on the font of the nearest character if (firstpar->params().lineTop()) @@ -1456,8 +1455,7 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const maxdesc += LYX_PAPER_MARGIN; // add the vertical spaces, that the user added - if (firstpar->params().spaceBottom().kind() != VSpace::NONE) - maxdesc += int(firstpar->params().spaceBottom().inPixels(bview)); + maxdesc += getLengthMarkerHeight(bview, firstpar->params().spaceBottom()); // do not forget the DTP-lines! // there height depends on the font of the nearest character @@ -1526,7 +1524,7 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const if (inset_owner) { Row * r = firstrow; width = max(0,workWidth(bview)); - while(r) { + while (r) { if (r->width() > width) width = r->width(); r = r->next(); @@ -3158,6 +3156,80 @@ void LyXText::paintRowDepthBar(DrawRowParams & p) } } + +int LyXText::getLengthMarkerHeight(BufferView * bv, VSpace const & vsp) const +{ + if (vsp.kind() != VSpace::LENGTH) { + return int(vsp.inPixels(bv)); + } + + int const space_size = int(vsp.inPixels(bv)); + int const arrow_size = 10; + + LyXFont font; + font.decSize(); + int const min_size = 2 * arrow_size + 10 + + lyxfont::maxAscent(font) + + lyxfont::maxDescent(font); + + return std::max(min_size, space_size); +} + + +int LyXText::drawLengthMarker(DrawRowParams & p, string const & prefix, + VSpace const & vsp, int start) +{ + string const str(prefix + + " (" + vsp.asLyXCommand() + ")"); + + int const arrow_size = 10; + + int const size = getLengthMarkerHeight(p.bv, vsp); + + // first the string + int w = 0; + int a = 0; + int d = 0; + + LyXFont font; + font.setColor(LColor::added_space).decSize(); + lyxfont::rectText(str, font, w, a, d); + + int const end = start + size; + + p.pain->rectText(p.xo + 2 * arrow_size + 5, + start + ((end - start) / 2) + d, + str, font, + backgroundColor(), + backgroundColor()); + + // adding or removing space + bool const added = !(vsp.length().len().value() < 0.0); + + int const leftx = p.xo; + int const midx = leftx + arrow_size; + int const rightx = midx + arrow_size; + + // top arrow + int const ty1 = added ? (start + arrow_size) : start; + int const ty2 = added ? start : (start + arrow_size); + + p.pain->line(leftx, ty1, midx, ty2, LColor::added_space); + p.pain->line(midx, ty2, rightx, ty1, LColor::added_space); + + // bottom arrow + int const by1 = added ? (end - arrow_size) : end; + int const by2 = added ? end : (end - arrow_size); + + p.pain->line(leftx, by1, midx, by2, LColor::added_space); + p.pain->line(midx, by2, rightx, by1, LColor::added_space); + + // joining line + p.pain->line(midx, ty2, midx, by2, LColor::added_space); + + return size; +} + void LyXText::paintFirstRow(DrawRowParams & p) { @@ -3170,7 +3242,7 @@ void LyXText::paintFirstRow(DrawRowParams & p) } int y_top = 0; - + // think about the margins if (!p.row->previous() && bv_owner) y_top += LYX_PAPER_MARGIN; @@ -3209,36 +3281,14 @@ void LyXText::paintFirstRow(DrawRowParams & p) p.pain->line(x, y2, x, y1, LColor::added_space); y_top += 3 * defaultHeight(); + y_top += int(parparams.spaceTop().inPixels(p.bv)); } else if (parparams.spaceTop().kind() == VSpace::LENGTH) { - string str = string(_("Space above")) + " (" - + parparams.spaceTop().asLyXCommand() - + ")"; - - int const space = int(parparams.spaceTop().inPixels(p.bv)); - int const y = p.yo + y_top + space / 2; - - p.pain->line(p.xo, y, p.xo + p.width, y, - LColor::added_space, Painter::line_onoffdash); - - int w = 0; - int a = 0; - int d = 0; - - LyXFont pb_font; - pb_font.setColor(LColor::added_space).decSize(); - lyxfont::rectText(str, pb_font, w, a, d); - - // don't draw if it won't fit - if (a + d + 4 < space) { - p.pain->rectText(p.xo + (p.width - w)/2, y + d, - str, pb_font, - backgroundColor(), - backgroundColor()); - } + y_top += drawLengthMarker(p, _("Space above"), + parparams.spaceTop(), p.yo + y_top); + } else { + y_top += int(parparams.spaceTop().inPixels(p.bv)); } - y_top += int(parparams.spaceTop().inPixels(p.bv)); - Buffer const * buffer = p.bv->buffer(); LyXLayout const & layout = @@ -3316,7 +3366,7 @@ void LyXText::paintFirstRow(DrawRowParams & p) lyxfont::width(str, font); } - p.pain->text(int(x), p.yo + + p.pain->text(int(x), p.yo + p.row->baseline() - p.row->ascent_of_text() - maxdesc, str, font); @@ -3325,9 +3375,10 @@ void LyXText::paintFirstRow(DrawRowParams & p) if (is_rtl) { x = ww - leftMargin(p.bv, p.row) + lyxfont::width(layout.labelsep, font); - } else + } else { x = p.x - lyxfont::width(layout.labelsep, font) - lyxfont::width(str, font); + } p.pain->text(int(x), p.yo + p.row->baseline(), str, font); } @@ -3425,38 +3476,17 @@ void LyXText::paintLastRow(DrawRowParams & p) p.pain->line(x, y, x, y2, LColor::added_space); y_bottom -= 3 * defaultHeight(); + y_bottom -= int(parparams.spaceBottom().inPixels(p.bv)); } else if (parparams.spaceBottom().kind() == VSpace::LENGTH) { - string str = string(_("Space below")) - + " (" - + parparams.spaceBottom().asLyXCommand() - + ")"; - - int const space = int(parparams.spaceBottom().inPixels(p.bv)); - int const y = p.yo + y_bottom - space / 2; - - p.pain->line(p.xo, y, p.xo + p.width, y, - LColor::added_space, Painter::line_onoffdash); - - int w = 0; - int a = 0; - int d = 0; + int const height = getLengthMarkerHeight(p.bv, parparams.spaceBottom()); + y_bottom -= drawLengthMarker(p, _("Space below"), + parparams.spaceBottom(), + p.yo + y_bottom - height); - LyXFont pb_font; - pb_font.setColor(LColor::added_space).decSize(); - lyxfont::rectText(str, pb_font, w, a, d); - - // don't draw if it won't fit - if (a + d + 4 < space) { - p.pain->rectText(p.xo + (p.width - w) / 2, y + d, - str, pb_font, - backgroundColor(), - backgroundColor()); - } + } else { + y_bottom -= int(parparams.spaceBottom().inPixels(p.bv)); } - // think about user added space - y_bottom -= int(parparams.spaceBottom().inPixels(p.bv)); - Buffer const * buffer = p.bv->buffer(); // draw a bottom line