]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
Use paragraph iterators in CutAndPaste::SwitchLayoutsBetweenClasses
[lyx.git] / src / text.C
index d009dbcc858c01773fa2bc388e67b7c41779c909..f4da5dd0b847fee8702d772a1c9c17ff3f022c79 100644 (file)
@@ -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 =
@@ -3426,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;
+               int const height =  getLengthMarkerHeight(p.bv, parparams.spaceBottom());
+               y_bottom -= drawLengthMarker(p, _("Space below"),
+                               parparams.spaceBottom(),
+                               p.yo + y_bottom - height);
  
-               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());
-               } 
+       } 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