summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2002-04-24 17:38:36 +0000
committerJames Bursa <james@netsurf-browser.org>2002-04-24 17:38:36 +0000
commit4f1bd18a3de5084824ea6ca3995060aa1f199c3b (patch)
treefdad243655a7997b60eedf45e77db41fd3825b82
parent91b9ffdbcb954123ed74d65018f13242c05a478e (diff)
downloadnetsurf-4f1bd18a3de5084824ea6ca3995060aa1f199c3b.tar.gz
netsurf-4f1bd18a3de5084824ea6ca3995060aa1f199c3b.tar.bz2
[project @ 2002-04-24 17:38:36 by bursa]
Added a simple table layout implementation. svn path=/import/netsurf/; revision=6
-rw-r--r--render/css_enums2
-rw-r--r--render/render.c89
2 files changed, 87 insertions, 4 deletions
diff --git a/render/css_enums b/render/css_enums
index 8ef3ffd3b..96ce8ef56 100644
--- a/render/css_enums
+++ b/render/css_enums
@@ -5,7 +5,7 @@ css_background_repeat inherit repeat repeat_x repeat_y no_repeat
css_border_width inherit medium thin thick length
css_border_style inherit none dashed dotted double groove inset outset ridge solid
css_clear none both left right
-css_display block inline none
+css_display inline block list-item run-in compact marker table inline-table table-row-group table-header-group table-footer-group table-row table-column-group table-column table-cell table-caption none
css_float none left right
css_font_style normal italic oblique
css_font_variant normal smallcaps
diff --git a/render/render.c b/render/render.c
index 6745d7ae7..2ba864a69 100644
--- a/render/render.c
+++ b/render/render.c
@@ -1,5 +1,5 @@
/**
- * $Id: render.c,v 1.3 2002/04/23 22:05:19 bursa Exp $
+ * $Id: render.c,v 1.4 2002/04/24 17:38:36 bursa Exp $
*/
#include <assert.h>
@@ -16,7 +16,8 @@
*/
struct box {
- enum { BOX_BLOCK, BOX_INLINE_CONTAINER, BOX_INLINE, BOX_FLOAT } type;
+ enum { BOX_BLOCK, BOX_INLINE_CONTAINER, BOX_INLINE,
+ BOX_TABLE, BOX_TABLE_ROW, BOX_TABLE_CELL, BOX_FLOAT } type;
xmlNode * node;
struct css_style * style;
unsigned long x, y, width, height;
@@ -33,6 +34,7 @@ signed long len(struct css_length * length, unsigned long em);
void layout_block(struct box * box, unsigned long width);
unsigned long layout_block_children(struct box * box, unsigned long width);
void layout_inline_container(struct box * box, unsigned long width);
+void layout_table(struct box * box, unsigned long width);
void render_plain_element(char * g, struct box * box, unsigned long x, unsigned long y);
void render_plain(struct box * box);
@@ -111,8 +113,14 @@ unsigned long layout_block_children(struct box * box, unsigned long width)
c->y = y;
y += c->height + 1;
break;
+ case BOX_TABLE:
+ layout_table(c, width-4);
+ c->x = 2;
+ c->y = y;
+ y += c->height + 1;
+ break;
default:
- die("block child not block or inline container");
+ die("block child not block, table, or inline container");
}
}
return y;
@@ -136,6 +144,41 @@ void layout_inline_container(struct box * box, unsigned long width)
box->height = y;
}
+void layout_table(struct box * box, unsigned long width)
+{
+ /* TODO: do this properly */
+ unsigned int columns;
+ unsigned long cwidth;
+ unsigned long y = 1;
+ struct box * c;
+ struct box * r;
+
+ for (columns = 0, c = box->children->children; c != 0; c = c->next) {
+ assert(c->type == BOX_TABLE_CELL);
+ columns++;
+ }
+ cwidth = (width-8) / columns; /* just split into equal width columns */
+
+ for (r = box->children; r != 0; r = r->next) {
+ unsigned long height = 0;
+ unsigned int col;
+ for (col = 0, c = r->children; c != 0; col++, c = c->next) {
+ layout_block(c, cwidth);
+ c->x = 2 + col * cwidth;
+ c->y = 1;
+ if (c->height > height) height = c->height;
+ }
+ r->x = 2;
+ r->y = y;
+ r->width = width-4;
+ r->height = height + 2;
+ y += height + 3;
+ }
+
+ box->width = width;
+ box->height = y;
+}
+
/******************************************************************************/
@@ -161,6 +204,9 @@ void render_plain_element(char * g, struct box * box, unsigned long x, unsigned
}
switch (box->type) {
+ case BOX_TABLE:
+ case BOX_TABLE_ROW:
+ case BOX_TABLE_CELL:
case BOX_BLOCK: strncpy(g + 80 * (y + box->y) + x + box->x,
box->node->name, strlen(box->node->name));
break;
@@ -269,6 +315,40 @@ struct box * xml_to_box(xmlNode * n, struct css_style * parent_style, struct css
inline_container = xml_to_box(c, style, stylesheet,
selector, depth + 1, box, inline_container);
break;
+ case CSS_DISPLAY_TABLE:
+ box = xcalloc(1, sizeof(struct box));
+ box->node = n;
+ box->type = BOX_TABLE;
+ box->style = style;
+ box_add_child(parent, box);
+ for (c = n->children; c != 0; c = c->next)
+ xml_to_box(c, style, stylesheet,
+ selector, depth + 1, box, 0);
+ inline_container = 0;
+ break;
+ case CSS_DISPLAY_TABLE_ROW:
+ box = xcalloc(1, sizeof(struct box));
+ box->node = n;
+ box->type = BOX_TABLE_ROW;
+ box->style = style;
+ box_add_child(parent, box);
+ for (c = n->children; c != 0; c = c->next)
+ xml_to_box(c, style, stylesheet,
+ selector, depth + 1, box, 0);
+ inline_container = 0;
+ break;
+ case CSS_DISPLAY_TABLE_CELL:
+ box = xcalloc(1, sizeof(struct box));
+ box->node = n;
+ box->type = BOX_TABLE_CELL;
+ box->style = style;
+ box_add_child(parent, box);
+ inline_container_c = 0;
+ for (c = n->children; c != 0; c = c->next)
+ inline_container_c = xml_to_box(c, style, stylesheet,
+ selector, depth + 1, box, inline_container_c);
+ inline_container = 0;
+ break;
case CSS_DISPLAY_NONE:
default:
}
@@ -307,6 +387,9 @@ void box_dump(struct box * box, unsigned int depth)
case BOX_BLOCK: printf("BOX_BLOCK <%s>\n", box->node->name); break;
case BOX_INLINE_CONTAINER: printf("BOX_INLINE_CONTAINER\n"); break;
case BOX_INLINE: printf("BOX_INLINE '%s'\n", box->node->content); break;
+ case BOX_TABLE: printf("BOX_TABLE <%s>\n", box->node->name); break;
+ case BOX_TABLE_ROW: printf("BOX_TABLE_ROW <%s>\n", box->node->name); break;
+ case BOX_TABLE_CELL: printf("BOX_TABLE_CELL <%s>\n", box->node->name); break;
default: printf("Unknown box type\n");
}