Mercurial > dillo_port1.3
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;