changeset 1757:c75d0b8f71fc

imported patch border-collapse
author Jorge Arellano Cid <jcid@dillo.org>
date Sun, 24 Oct 2010 12:02:06 -0300
parents cc7c9180ae95
children ed0b2be9c06d
files dw/style.cc dw/style.hh src/html_common.hh src/table.cc
diffstat 4 files changed, 75 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/dw/style.cc	Thu Oct 21 11:22:29 2010 -0300
+++ b/dw/style.cc	Sun Oct 24 12:02:06 2010 -0300
@@ -50,6 +50,7 @@
    borderWidth.setVal (0);
    padding.setVal (0);
    borderCollapse = BORDER_MODEL_SEPARATE;
+   collapseStyleSet = false;
    setBorderColor (NULL);
    setBorderStyle (BORDER_NONE);
    hBorderSpacing = 0;
@@ -125,6 +126,7 @@
        borderWidth.equals (&otherAttrs->borderWidth) &&
        padding.equals (&otherAttrs->padding) &&
        borderCollapse == otherAttrs->borderCollapse &&
+       collapseStyleSet == otherAttrs->collapseStyleSet &&
        borderColor.top == otherAttrs->borderColor.top &&
        borderColor.right == otherAttrs->borderColor.right &&
        borderColor.bottom == otherAttrs->borderColor.bottom &&
@@ -161,6 +163,7 @@
       borderWidth.hashValue () +
       padding.hashValue () +
       borderCollapse +
+      collapseStyleSet +
       (intptr_t) borderColor.top +
       (intptr_t) borderColor.right +
       (intptr_t) borderColor.bottom  +
@@ -250,6 +253,7 @@
    borderWidth = attrs->borderWidth;
    padding = attrs->padding;
    borderCollapse = attrs->borderCollapse;
+   collapseStyleSet = attrs->collapseStyleSet;
    borderColor = attrs->borderColor;
    borderStyle = attrs->borderStyle;
    display = attrs->display;
--- a/dw/style.hh	Thu Oct 21 11:22:29 2010 -0300
+++ b/dw/style.hh	Sun Oct 24 12:02:06 2010 -0300
@@ -441,6 +441,7 @@
 
    Box margin, borderWidth, padding;
    BorderCollapse borderCollapse;
+   bool collapseStyleSet;
    struct { Color *top, *right, *bottom, *left; } borderColor;
    struct { BorderStyle top, right, bottom, left; } borderStyle;
 
--- a/src/html_common.hh	Thu Oct 21 11:22:29 2010 -0300
+++ b/src/html_common.hh	Sun Oct 24 12:02:06 2010 -0300
@@ -97,6 +97,7 @@
    DilloHtmlParseMode parse_mode;
    DilloHtmlTableMode table_mode;
    bool cell_text_align_set;
+
    DilloHtmlListMode list_type;
    int list_number;
 
--- a/src/table.cc	Thu Oct 21 11:22:29 2010 -0300
+++ b/src/table.cc	Sun Oct 24 12:02:06 2010 -0300
@@ -108,7 +108,7 @@
       html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_TOP_WIDTH,
                                         CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
       html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
-                                        CSS_TYPE_LENGTH_PERCENTAGE,  cssLength);
+                                        CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
       html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_LEFT_WIDTH,
                                         CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
       html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_RIGHT_WIDTH,
@@ -216,6 +216,69 @@
  * Utilities
  */
 
+/* WORKAROUND: collapsing border model requires moving rendering code from
+ *             the cell to the table, and making table-code aware of each
+ *             cell style.
+ * This workaround mimics collapsing model within separate model. This is not
+ * a complete emulation but should be enough for most cases.
+ */
+static void Html_set_collapsing_border_model(DilloHtml *html, Widget *col_tb)
+{
+   dw::core::style::Style *collapseStyle, *tableStyle;
+   dw::core::style::StyleAttrs collapseCellAttrs, collapseTableAttrs;
+   int borderWidth, marginWidth;
+
+   tableStyle = ((dw::Table*)S_TOP(html)->table)->getStyle ();
+   borderWidth = html->styleEngine->style ()->borderWidth.top;
+   marginWidth = tableStyle->margin.top;
+
+   collapseCellAttrs = *(html->styleEngine->style ());
+   collapseCellAttrs.margin.setVal (0);
+   collapseCellAttrs.borderWidth.left = 0;
+   collapseCellAttrs.borderWidth.top = 0;
+   collapseCellAttrs.borderWidth.right = borderWidth;
+   collapseCellAttrs.borderWidth.bottom = borderWidth;
+   collapseCellAttrs.hBorderSpacing = 0;
+   collapseCellAttrs.vBorderSpacing = 0;
+   collapseStyle = Style::create(HT2LT(html), &collapseCellAttrs);
+   col_tb->setStyle (collapseStyle);
+
+   if (!tableStyle->collapseStyleSet) {
+      collapseTableAttrs = *tableStyle;
+      collapseTableAttrs.collapseStyleSet = true;
+      collapseTableAttrs.margin.setVal (marginWidth);
+      _MSG("COLLAPSING table margin set to %d\n", marginWidth);
+      collapseTableAttrs.borderWidth.left = borderWidth;
+      collapseTableAttrs.borderWidth.top = borderWidth;
+      collapseTableAttrs.borderWidth.right = 0;
+      collapseTableAttrs.borderWidth.bottom = 0;
+      collapseTableAttrs.hBorderSpacing = 0;
+      collapseTableAttrs.vBorderSpacing = 0;
+      collapseTableAttrs.borderColor = collapseCellAttrs.borderColor;
+      collapseTableAttrs.borderStyle = collapseCellAttrs.borderStyle;
+      /* CSS2 17.6.2: table does not have padding (in collapsing mode) */
+      collapseTableAttrs.padding.setVal (0);
+      collapseStyle = Style::create(HT2LT(html), &collapseTableAttrs);
+      ((dw::Table*)S_TOP(html)->table)->setStyle (collapseStyle);
+   }
+}
+
+/*
+ * Adjust style for separate border model.
+ * (Dw uses this model internally).
+ */
+static void Html_set_separate_border_model(DilloHtml *html, Widget *col_tb)
+{
+   dw::core::style::Style *separateStyle;
+   dw::core::style::StyleAttrs separateCellAttrs;
+
+   separateCellAttrs = *(html->styleEngine->style ());
+   /* CSS2 17.5: Internal table elements do not have margins */
+   separateCellAttrs.margin.setVal (0);
+   separateStyle = Style::create(HT2LT(html), &separateCellAttrs);
+   col_tb->setStyle (separateStyle);
+}
+
 /*
  * used by <TD> and <TH>
  */
@@ -290,7 +353,11 @@
       else
          col_tb = new Textblock (prefs.limit_text_width);
 
-      col_tb->setStyle (html->styleEngine->style ());
+      if (html->styleEngine->style()->borderCollapse == BORDER_MODEL_COLLAPSE){
+         Html_set_collapsing_border_model(html, col_tb);
+      } else {
+         Html_set_separate_border_model(html, col_tb);
+      }
 
       ((dw::Table*)S_TOP(html)->table)->addCell (col_tb, colspan, rowspan);
       S_TOP(html)->textblock = html->dw = col_tb;