Implement canAccommodateEllipsis. The basic idea is that everything on a line will...
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 16 Jun 2004 00:00:13 +0000 (00:00 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 16 Jun 2004 00:00:13 +0000 (00:00 +0000)
drawn on top of it unless it's a replaced element.  Then, if the replaced element overlaps, the ellipsis won't
be allowed.

        Reviewed by john

        * khtml/rendering/bidi.cpp:
        (khtml::RenderBlock::checkLinesForTextOverflow):
        * khtml/rendering/render_line.cpp:
        (InlineBox::closestLeafChildForXPos):
        (InlineBox::canAccommodateEllipsis):
        (InlineFlowBox::canAccommodateEllipsis):
        (RootInlineBox::canAccommodateEllipsis):
        * khtml/rendering/render_line.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@6858 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/rendering/bidi.cpp
WebCore/khtml/rendering/render_line.cpp
WebCore/khtml/rendering/render_line.h

index eeada08..db99c8f 100644 (file)
@@ -1,3 +1,20 @@
+2004-06-15  David Hyatt  <hyatt@apple.com>
+
+       Implement canAccommodateEllipsis.  The basic idea is that everything on a line will allow an ellipsis to be
+       drawn on top of it unless it's a replaced element.  Then, if the replaced element overlaps, the ellipsis won't
+       be allowed.
+       
+        Reviewed by john
+
+        * khtml/rendering/bidi.cpp:
+        (khtml::RenderBlock::checkLinesForTextOverflow):
+        * khtml/rendering/render_line.cpp:
+        (InlineBox::closestLeafChildForXPos):
+        (InlineBox::canAccommodateEllipsis):
+        (InlineFlowBox::canAccommodateEllipsis):
+        (RootInlineBox::canAccommodateEllipsis):
+        * khtml/rendering/render_line.h:
+
 2004-06-15  Vicki Murley <vicki@apple.com>
 
        - added a few layout tests, rdar://3694510
index 14e3296..be93a53 100644 (file)
@@ -2281,7 +2281,7 @@ void RenderBlock::checkLinesForTextOverflow()
             // accommodate our truncation string, and no replaced elements (images, tables) can overlap the ellipsis
             // space.
             int width = curr == firstRootBox() ? firstLineEllipsisWidth : ellipsisWidth;
-            if (curr->canAccommodateEllipsis(blockEdge, ltr, width))
+            if (curr->canAccommodateEllipsis(ltr, lineBoxEdge, blockEdge, width))
                 curr->placeEllipsis(&ellipsis, blockEdge, ltr, width);
         }
     }
index 82d9f91..7277862 100644 (file)
@@ -165,6 +165,33 @@ InlineBox* InlineBox::lastLeafChild()
     return this;
 }
 
+InlineBox* InlineBox::closestLeafChildForXPos(int _x, int _tx)
+{
+    if (!isInlineFlowBox())
+        return this;
+    
+    InlineFlowBox *flowBox = static_cast<InlineFlowBox*>(this);
+    if (!flowBox->firstChild())
+        return this;
+
+    InlineBox *box = flowBox->closestChildForXPos(_x, _tx);
+    if (!box)
+        return this;
+    
+    return box->closestLeafChildForXPos(_x, _tx);
+}
+
+bool InlineBox::canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth)
+{
+    // Non-replaced elements can always accommodate an ellipsis.
+    if (!m_object || !m_object->isReplaced())
+        return true;
+    
+    QRect boxRect(m_x, 0, m_width, 1);
+    QRect ellipsisRect(ltr ? blockEdge - ellipsisWidth : blockEdge, 0, ellipsisWidth, 1);
+    return !(boxRect.intersects(ellipsisRect));
+}
+
 int InlineFlowBox::marginLeft()
 {
     if (!includeLeftEdge())
@@ -784,20 +811,13 @@ InlineBox* InlineFlowBox::closestChildForXPos(int _x, int _tx)
     return 0;
 }
 
-InlineBox* InlineBox::closestLeafChildForXPos(int _x, int _tx)
+bool InlineFlowBox::canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth)
 {
-    if (!isInlineFlowBox())
-        return this;
-    
-    InlineFlowBox *flowBox = static_cast<InlineFlowBox*>(this);
-    if (!flowBox->firstChild())
-        return this;
-
-    InlineBox *box = flowBox->closestChildForXPos(_x, _tx);
-    if (!box)
-        return this;
-    
-    return box->closestLeafChildForXPos(_x, _tx);
+    for (InlineBox *box = firstChild(); box; box = box->nextOnLine()) {
+        if (!box->canAccommodateEllipsis(ltr, blockEdge, ellipsisWidth))
+            return false;
+    }
+    return true;
 }
 
 void RootInlineBox::detach(RenderArena* arena)
@@ -814,15 +834,16 @@ void RootInlineBox::detachEllipsisBox(RenderArena* arena)
     }
 }
 
-bool RootInlineBox::canAccommodateEllipsis(int blockEdge, bool ltr, int ellipsisWidth)
+bool RootInlineBox::canAccommodateEllipsis(bool ltr, int blockEdge, int lineBoxEdge, int ellipsisWidth)
 {
-    // First sanity-check the width of the whole line to see if there is sufficient room.
-    if (width() < ellipsisWidth)
+    // First sanity-check the unoverflowed width of the whole line to see if there is sufficient room.
+    int delta = ltr ? lineBoxEdge - blockEdge : blockEdge - lineBoxEdge;
+    if (width() - delta < ellipsisWidth)
         return false;
-        
+
     // Next iterate over all the line boxes on the line.  If we find a replaced element that intersects
     // then we refuse to accommodate the ellipsis.  Otherwise we're ok.
-    return false;
+    return InlineFlowBox::canAccommodateEllipsis(ltr, blockEdge, ellipsisWidth);
 }
 
 void RootInlineBox::placeEllipsis(QChar* ellipsisStr, int blockEdge, bool ltr, int ellipsisWidth)
index 1edfbd5..fb24bc4 100644 (file)
@@ -130,6 +130,8 @@ public:
 
     void dirtyLineBoxes();
     
+    virtual bool canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth);
+    
 public: // FIXME: Would like to make this protected, but methods are accessing these
         // members over in the part.
     RenderObject* m_object;
@@ -260,6 +262,8 @@ public:
     
     void removeChild(InlineBox* child);
     
+    virtual bool canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth);
+    
 protected:
     InlineBox* m_firstChild;
     InlineBox* m_lastChild;
@@ -303,7 +307,7 @@ public:
 
     void childRemoved(InlineBox* box);
 
-    bool canAccommodateEllipsis(int blockEdge, bool ltr, int ellipsisWidth);
+    bool canAccommodateEllipsis(bool ltr, int blockEdge, int lineBoxEdge, int ellipsisWidth);
     void placeEllipsis(QChar* ellipsisStr, int blockEdge, bool ltr, int ellipsisWidth);
 
 protected: