Test: fast/table/border-collapsing/rtl-border-collapsing.html
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 29 Jan 2006 18:59:00 +0000 (18:59 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 29 Jan 2006 18:59:00 +0000 (18:59 +0000)
        Reviewed by Darin.

        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=6888
          Collapsed borders appear on the wrong side or on the wrong cell in RTL tables

        * rendering/RenderTable.cpp:
        (WebCore::RenderTable::cellBefore): Renamed cellLeft to this.
        (WebCore::RenderTable::cellAfter): Renamed cellRight to this.
        * rendering/RenderTable.h:
        * rendering/RenderTableCell.cpp:
        (WebCore::RenderTableCell::collapsedLeftBorder): Added the RTL case.
        (WebCore::RenderTableCell::collapsedRightBorder): Ditto.
        (WebCore::RenderTableCell::borderLeft):
        (WebCore::RenderTableCell::borderRight):
        (WebCore::RenderTableCell::collectBorders):
        (WebCore::RenderTableCell::paintCollapsedBorder):
        * rendering/RenderTableCell.h:

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

WebCore/ChangeLog
WebCore/rendering/RenderTable.cpp
WebCore/rendering/RenderTable.h
WebCore/rendering/RenderTableCell.cpp
WebCore/rendering/RenderTableCell.h

index f19fe5b..0febd24 100644 (file)
@@ -1,3 +1,25 @@
+2006-01-29  Mitz Pettel  <opendarwin.org@mitzpettel.com>
+
+        Test: fast/table/border-collapsing/rtl-border-collapsing.html
+
+        Reviewed by Darin.
+
+        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=6888
+          Collapsed borders appear on the wrong side or on the wrong cell in RTL tables
+
+        * rendering/RenderTable.cpp:
+        (WebCore::RenderTable::cellBefore): Renamed cellLeft to this.
+        (WebCore::RenderTable::cellAfter): Renamed cellRight to this.
+        * rendering/RenderTable.h:
+        * rendering/RenderTableCell.cpp:
+        (WebCore::RenderTableCell::collapsedLeftBorder): Added the RTL case.
+        (WebCore::RenderTableCell::collapsedRightBorder): Ditto.
+        (WebCore::RenderTableCell::borderLeft):
+        (WebCore::RenderTableCell::borderRight):
+        (WebCore::RenderTableCell::collectBorders):
+        (WebCore::RenderTableCell::paintCollapsedBorder):
+        * rendering/RenderTableCell.h:
+
 2006-01-29  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej.
index 0f77b6b..d1831ef 100644 (file)
@@ -736,7 +736,7 @@ RenderTableCell* RenderTable::cellBelow(const RenderTableCell* cell) const
         return 0;
 }
 
-RenderTableCell* RenderTable::cellLeft(const RenderTableCell* cell) const
+RenderTableCell* RenderTable::cellBefore(const RenderTableCell* cell) const
 {
     RenderTableSection* section = cell->section();
     int effCol = colToEffCol(cell->col());
@@ -752,7 +752,7 @@ RenderTableCell* RenderTable::cellLeft(const RenderTableCell* cell) const
     return prevCell.cell;
 }
 
-RenderTableCell* RenderTable::cellRight(const RenderTableCell* cell) const
+RenderTableCell* RenderTable::cellAfter(const RenderTableCell* cell) const
 {
     int effCol = colToEffCol(cell->col() + cell->colSpan());
     if (effCol >= numEffCols())
index 06b855e..960d5a8 100644 (file)
@@ -35,8 +35,7 @@ class RenderTableCell;
 class RenderTableSection;
 class TableLayout;
 
-class RenderTable : public RenderBlock
-{
+class RenderTable : public RenderBlock {
 public:
     enum Rules {
         None    = 0x00,
@@ -58,17 +57,16 @@ public:
         Box    = 0x0f
     };
 
-    RenderTable(DOM::NodeImpl* node);
+    RenderTable(NodeImpl*);
     ~RenderTable();
 
-    virtual const char *renderName() const { return "RenderTable"; }
+    virtual const charrenderName() const { return "RenderTable"; }
 
-    virtual void setStyle(RenderStyle *style);
+    virtual void setStyle(RenderStyle*);
 
     virtual bool isTable() const { return true; }
 
-    int getColumnPos(int col) const
-        { return columnPos[col]; }
+    int getColumnPos(int col) const { return columnPos[col]; }
 
     int hBorderSpacing() const { return hspacing; }
     int vBorderSpacing() const { return vspacing; }
@@ -81,17 +79,17 @@ public:
     
     Rules getRules() const { return rules; }
 
-    const Color &bgColor() const { return style()->backgroundColor(); }
+    const ColorbgColor() const { return style()->backgroundColor(); }
 
-    uint cellPadding() const { return padding; }
-    void setCellPadding(uint p) { padding = p; }
+    unsigned cellPadding() const { return padding; }
+    void setCellPadding(unsigned p) { padding = p; }
 
     // overrides
     virtual int overflowHeight(bool includeInterior = true) const { return height(); }
     virtual int overflowWidth(bool includeInterior = true) const { return width(); }
-    virtual void addChild(RenderObject *child, RenderObject *beforeChild = 0);
-    virtual void paint(PaintInfo& i, int tx, int ty);
-    virtual void paintBoxDecorations(PaintInfo& i, int _tx, int _ty);
+    virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0);
+    virtual void paint(PaintInfo&, int tx, int ty);
+    virtual void paintBoxDecorations(PaintInfo&, int _tx, int _ty);
     virtual void layout();
     virtual void calcMinMaxWidth();
 
@@ -106,15 +104,15 @@ public:
     virtual void dump(QTextStream *stream, QString ind = "") const;
 #endif
     struct ColumnStruct {
-       enum {
-           WidthUndefined = 0xffff
-       };
-       ColumnStruct() {
-           span = 1;
-           width = WidthUndefined;
-       }
-       ushort span;
-       uint width; // the calculated position of the column
+        enum {
+            WidthUndefined = 0xffff
+        };
+        ColumnStruct() {
+            span = 1;
+            width = WidthUndefined;
+        }
+        unsigned short span;
+        unsigned width; // the calculated position of the column
     };
 
     Array<int> columnPos;
@@ -125,67 +123,67 @@ public:
     int numEffCols() const { return columns.size(); }
     int spanOfEffCol(int effCol) const { return columns[effCol].span; }
     int colToEffCol(int col) const {
-       int c = 0;
-       int i = 0;
-       while (c < col && i < (int)columns.size()) {
-           c += columns[i].span;
-           i++;
-       }
-       return i;
+        int c = 0;
+        int i = 0;
+        while (c < col && i < (int)columns.size()) {
+            c += columns[i].span;
+            i++;
+        }
+        return i;
     }
     int effColToCol(int effCol) const {
-       int c = 0;
-       for (int i = 0; i < effCol; i++)
-           c += columns[i].span;
-       return c;
+        int c = 0;
+        for (int i = 0; i < effCol; i++)
+            c += columns[i].span;
+        return c;
     }
 
     int bordersPaddingAndSpacing() const {
-       return borderLeft() + borderRight() + 
+        return borderLeft() + borderRight() + 
                (collapseBorders() ? 0 : (paddingLeft() + paddingRight() + (numEffCols() + 1) * hBorderSpacing()));
     }
 
-    RenderTableCol *colElement(int col);
+    RenderTableColcolElement(int col);
 
     void setNeedSectionRecalc() { needSectionRecalc = true; }
 
-    virtual RenderObject* removeChildNode(RenderObject* child);
+    virtual RenderObject* removeChildNode(RenderObject*);
 
-    RenderTableCell* cellAbove(const RenderTableCell* cell) const;
-    RenderTableCell* cellBelow(const RenderTableCell* cell) const;
-    RenderTableCell* cellLeft(const RenderTableCell* cell) const;
-    RenderTableCell* cellRight(const RenderTableCell* cell) const;
+    RenderTableCell* cellAbove(const RenderTableCell*) const;
+    RenderTableCell* cellBelow(const RenderTableCell*) const;
+    RenderTableCell* cellBefore(const RenderTableCell*) const;
+    RenderTableCell* cellAfter(const RenderTableCell*) const;
  
     CollapsedBorderValue* currentBorderStyle() { return m_currentBorder; }
     
     bool hasSections() const { return head || foot || firstBody; }
 
-protected:
-
+private:
     void recalcSections();
 
     friend class AutoTableLayout;
     friend class FixedTableLayout;
 
-    RenderBlock *tCaption;
-    RenderTableSection *head;
-    RenderTableSection *foot;
-    RenderTableSection *firstBody;
+    RenderBlocktCaption;
+    RenderTableSectionhead;
+    RenderTableSectionfoot;
+    RenderTableSectionfirstBody;
 
-    TableLayout *tableLayout;
+    TableLayouttableLayout;
 
     CollapsedBorderValue* m_currentBorder;
     
     Frame frame                 : 4;
     Rules rules                 : 4;
 
-    bool has_col_elems         : 1;
-    uint padding               : 22;
-    uint needSectionRecalc     : 1;
+    bool has_col_elems          : 1;
+    unsigned padding            : 22;
+    uint needSectionRecalc      : 1;
     
     short hspacing;
     short vspacing;
 };
 
 }
+
 #endif
index 02ecaa5..1b7cdfb 100644 (file)
@@ -213,20 +213,28 @@ static CollapsedBorderValue compareBorders(const CollapsedBorderValue& border1,
     return border1.precedence >= border2.precedence ? border1 : border2;
 }
 
-CollapsedBorderValue RenderTableCell::collapsedLeftBorder() const
+CollapsedBorderValue RenderTableCell::collapsedLeftBorder(bool rtl) const
 {
+    RenderTable* tableElt = table();
+    bool leftmostColumn;
+    if (!rtl)
+        leftmostColumn = col() == 0;
+    else {
+        int effCol = tableElt->colToEffCol(col() + colSpan() - 1);
+        leftmostColumn = effCol == tableElt->numEffCols() - 1;
+    }
+    
     // For border left, we need to check, in order of precedence:
     // (1) Our left border.
     CollapsedBorderValue result(&style()->borderLeft(), BCELL);
     
-    // (2) The previous cell's right border.
-    RenderTableCell* prevCell = table()->cellLeft(this);
+    // (2) The right border of the cell to the left.
+    RenderTableCell* prevCell = rtl ? tableElt->cellAfter(this) : tableElt->cellBefore(this);
     if (prevCell) {
         result = compareBorders(result, CollapsedBorderValue(&prevCell->style()->borderRight(), BCELL));
         if (!result.exists())
             return result;
-    }
-    else if (col() == 0) {
+    } else if (leftmostColumn) {
         // (3) Our row's left border.
         result = compareBorders(result, CollapsedBorderValue(&parent()->style()->borderLeft(), BROW));
         if (!result.exists())
@@ -239,26 +247,24 @@ CollapsedBorderValue RenderTableCell::collapsedLeftBorder() const
     }
     
     // (5) Our column's left border.
-    RenderTableCol* colElt = table()->colElement(col());
+    RenderTableCol* colElt = tableElt->colElement(col() + (rtl ? colSpan() - 1 : 0));
     if (colElt) {
         result = compareBorders(result, CollapsedBorderValue(&colElt->style()->borderLeft(), BCOL));
         if (!result.exists())
             return result;
     }
     
-    // (6) The previous column's right border.
-    if (col() > 0) {
-        colElt = table()->colElement(col() - 1);
+    // (6) The right border of the column to the left.
+    if (!leftmostColumn) {
+        colElt = tableElt->colElement(col() + (rtl ? colSpan() : -1));
         if (colElt) {
             result = compareBorders(result, CollapsedBorderValue(&colElt->style()->borderRight(), BCOL));
             if (!result.exists())
                 return result;
         }
-    }
-    
-    if (col() == 0) {
+    } else {
         // (7) The table's left border.
-        result = compareBorders(result, CollapsedBorderValue(&table()->style()->borderLeft(), BTABLE));
+        result = compareBorders(result, CollapsedBorderValue(&tableElt->style()->borderLeft(), BTABLE));
         if (!result.exists())
             return result;
     }
@@ -266,21 +272,24 @@ CollapsedBorderValue RenderTableCell::collapsedLeftBorder() const
     return result;
 }
 
-CollapsedBorderValue RenderTableCell::collapsedRightBorder() const
+CollapsedBorderValue RenderTableCell::collapsedRightBorder(bool rtl) const
 {
     RenderTable* tableElt = table();
-    bool inLastColumn = false;
-    int effCol = tableElt->colToEffCol(col() + colSpan() - 1);
-    if (effCol == tableElt->numEffCols() - 1)
-        inLastColumn = true;
+    bool rightmostColumn;
+    if (rtl)
+        rightmostColumn = col() == 0;
+    else {
+        int effCol = tableElt->colToEffCol(col() + colSpan() - 1);
+        rightmostColumn = effCol == tableElt->numEffCols() - 1;
+    }
     
     // For border right, we need to check, in order of precedence:
     // (1) Our right border.
     CollapsedBorderValue result = CollapsedBorderValue(&style()->borderRight(), BCELL);
     
-    // (2) The next cell's left border.
-    if (!inLastColumn) {
-        RenderTableCell* nextCell = tableElt->cellRight(this);
+    // (2) The left border of the cell to the right.
+    if (!rightmostColumn) {
+        RenderTableCell* nextCell = rtl ? tableElt->cellBefore(this) : tableElt->cellAfter(this);
         if (nextCell && nextCell->style()) {
             result = compareBorders(result, CollapsedBorderValue(&nextCell->style()->borderLeft(), BCELL));
             if (!result.exists())
@@ -299,23 +308,22 @@ CollapsedBorderValue RenderTableCell::collapsedRightBorder() const
     }
     
     // (5) Our column's right border.
-    RenderTableCol* colElt = table()->colElement(col()+colSpan() - 1);
+    RenderTableCol* colElt = tableElt->colElement(col() + (rtl ? 0 : colSpan() - 1));
     if (colElt) {
         result = compareBorders(result, CollapsedBorderValue(&colElt->style()->borderRight(), BCOL));
         if (!result.exists())
             return result;
     }
     
-    // (6) The next column's left border.
-    if (!inLastColumn) {
-        colElt = tableElt->colElement(col()+colSpan());
+    // (6) The left border of the column to the right.
+    if (!rightmostColumn) {
+        colElt = tableElt->colElement(col() + (rtl ? -1 : colSpan()));
         if (colElt) {
             result = compareBorders(result, CollapsedBorderValue(&colElt->style()->borderLeft(), BCOL));
             if (!result.exists())
                 return result;
         }
-    }
-    else {
+    } else {
         // (7) The table's right border.
         result = compareBorders(result, CollapsedBorderValue(&tableElt->style()->borderRight(), BTABLE));
         if (!result.exists())
@@ -463,7 +471,7 @@ CollapsedBorderValue RenderTableCell::collapsedBottomBorder() const
 int RenderTableCell::borderLeft() const
 {
     if (table()->collapseBorders()) {
-        CollapsedBorderValue border = collapsedLeftBorder();
+        CollapsedBorderValue border = collapsedLeftBorder(table()->style()->direction() == RTL);
         if (border.exists())
             return int(border.width() / 2.0 + 0.5); // Give the extra pixel to top and left.
         return 0;
@@ -474,7 +482,7 @@ int RenderTableCell::borderLeft() const
 int RenderTableCell::borderRight() const
 {
     if (table()->collapseBorders()) {
-        CollapsedBorderValue border = collapsedRightBorder();
+        CollapsedBorderValue border = collapsedRightBorder(table()->style()->direction() == RTL);
         if (border.exists())
             return border.width() / 2;
         return 0;
@@ -615,8 +623,9 @@ static void addBorderStyle(QValueList<CollapsedBorderValue>& borderStyles, Colla
 
 void RenderTableCell::collectBorders(QValueList<CollapsedBorderValue>& borderStyles)
 {
-    addBorderStyle(borderStyles, collapsedLeftBorder());
-    addBorderStyle(borderStyles, collapsedRightBorder());
+    bool rtl = table()->style()->direction() == RTL;
+    addBorderStyle(borderStyles, collapsedLeftBorder(rtl));
+    addBorderStyle(borderStyles, collapsedRightBorder(rtl));
     addBorderStyle(borderStyles, collapsedTopBorder());
     addBorderStyle(borderStyles, collapsedBottomBorder());
 }
@@ -626,8 +635,9 @@ void RenderTableCell::paintCollapsedBorder(QPainter* p, int _tx, int _ty, int w,
     if (!table()->currentBorderStyle())
         return;
     
-    CollapsedBorderValue leftVal = collapsedLeftBorder();
-    CollapsedBorderValue rightVal = collapsedRightBorder();
+    bool rtl = table()->style()->direction() == RTL;
+    CollapsedBorderValue leftVal = collapsedLeftBorder(rtl);
+    CollapsedBorderValue rightVal = collapsedRightBorder(rtl);
     CollapsedBorderValue topVal = collapsedTopBorder();
     CollapsedBorderValue bottomVal = collapsedBottomBorder();
      
index cfbe275..9dc122d 100644 (file)
@@ -23,6 +23,7 @@
  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+
 #ifndef RenderTableCell_H
 #define RenderTableCell_H
 
 
 namespace WebCore {
 
-class RenderTableCell : public RenderBlock
-{
+class RenderTableCell : public RenderBlock {
 public:
-    RenderTableCell(DOM::NodeImpl* node);
+    RenderTableCell(NodeImpl*);
 
     virtual void destroy();
 
-    virtual const char *renderName() const { return "RenderTableCell"; }
+    virtual const charrenderName() const { return "RenderTableCell"; }
     virtual bool isTableCell() const { return true; }
 
-    // overrides RenderObject
-    virtual bool requiresLayer();
-
-    // ### FIX these two...
+    // FIXME: need to implement cellIndex
     int cellIndex() const { return 0; }
     void setCellIndex(int) { }
 
@@ -62,22 +59,22 @@ public:
 
     Length styleOrColWidth();
 
-    // overrides
+    virtual bool requiresLayer();
     virtual void calcMinMaxWidth();
     virtual void calcWidth();
-    virtual void setWidth(int width);
-    virtual void setStyle(RenderStyle *style);
+    virtual void setWidth(int);
+    virtual void setStyle(RenderStyle*);
 
     int borderLeft() const;
     int borderRight() const;
     int borderTop() const;
     int borderBottom() const;
 
-    CollapsedBorderValue collapsedLeftBorder() const;
-    CollapsedBorderValue collapsedRightBorder() const;
+    CollapsedBorderValue collapsedLeftBorder(bool rtl) const;
+    CollapsedBorderValue collapsedRightBorder(bool rtl) const;
     CollapsedBorderValue collapsedTopBorder() const;
     CollapsedBorderValue collapsedBottomBorder() const;
-    virtual void collectBorders(QValueList<CollapsedBorderValue>& borderStyles);
+    virtual void collectBorders(QValueList<CollapsedBorderValue>&);
 
     virtual void updateFromElement();
 
@@ -90,28 +87,28 @@ public:
 
     void paintCollapsedBorder(QPainter* p, int x, int y, int w, int h);
     
-    // lie position to outside observers
+    // lie about position to outside observers
     virtual int yPos() const { return m_y + _topExtra; }
 
-    virtual void computeAbsoluteRepaintRect(IntRect& r, bool f=false);
-    virtual bool absolutePosition(int &xPos, int &yPos, bool f = false);
+    virtual void computeAbsoluteRepaintRect(IntRect&, bool f=false);
+    virtual bool absolutePosition(int& xPos, int& yPos, bool f = false);
 
     virtual short baselinePosition(bool = false) const;
 
     virtual int borderTopExtra() const { return _topExtra; }
     virtual int borderBottomExtra() const { return _bottomExtra; }
 
-    RenderTable *table() const { return static_cast<RenderTable *>(parent()->parent()->parent()); }
-    RenderTableSection *section() const { return static_cast<RenderTableSection *>(parent()->parent()); }
+    RenderTable* table() const { return static_cast<RenderTable*>(parent()->parent()->parent()); }
+    RenderTableSection* section() const { return static_cast<RenderTableSection*>(parent()->parent()); }
 
-#ifndef NDEBUG
+#if !NDEBUG
     virtual void dump(QTextStream *stream, QString ind = "") const;
 #endif
 
     virtual IntRect getAbsoluteRepaintRect();
     
 protected:
-    virtual void paintBoxDecorations(PaintInfo& i, int _tx, int _ty);
+    virtual void paintBoxDecorations(PaintInfo&, int tx, int ty);
     
     int _row;
     int _col;
@@ -126,4 +123,5 @@ protected:
 };
 
 }
+
 #endif