Patch title: Release 87 bulk changes
Abstract:
File: /pliant/graphic/browser/tag/table.pli
Key:
    Removed line
    Added line
   
module "common.pli"


type D2TableCell
  inherit D2Box
  field (List Link:D2Box) content
  field Int bgcolor <- undefined

D2Box maybe D2TableCell

method tc configure attribute value options
  oarg_rw D2TableCell tc ; arg Str attribute value options
  if attribute="bgcolor"
    tc bgcolor := html_color value

method tc list -> l
  oarg_rw D2TableCell tc ; arg Pointer:(List Link:D2Box) l
  l :> tc content

method tc position c
  oarg_rw D2TableCell tc ; arg_rw D2Context c
  tc position_zero c

method tc draw img c
  oarg_rw D2TableCell tc ; oarg_rw ImagePrototype img ; arg_rw D2Context c
  if tc:bgcolor=defined and tc:x0=defined
    img fill tc:x0 tc:y0 tc:x1 tc:y1 (addressof tc:bgcolor)
  each b tc:content
    b draw img c

html_tags insert "td" true addressof:D2TableCell


type D2TableHeader
  inherit D2Box
  field (List Link:D2Box) content

D2Box maybe D2TableHeader

method th list -> l
  oarg_rw D2TableHeader th ; arg Pointer:(List Link:D2Box) l
  l :> th content

method th position c
  oarg_rw D2TableHeader th ; arg_rw D2Context c
  th position_zero c
    
method th draw img c
  oarg_rw D2TableHeader th ; oarg_rw ImagePrototype img ; arg_rw D2Context c
  each b th:content
    b draw img c

html_tags insert "th" true addressof:D2TableHeader


type D2TableRow
  inherit D2Box
  field (List Link:D2Box) content

D2Box maybe D2TableRow

method tr list -> l
  oarg_rw D2TableRow tr ; arg Pointer:(List Link:D2Box) l
  l :> tr content

method tr position c
  oarg_rw D2TableRow tr ; arg_rw D2Context c
  tr position_undefined c
    
method tr draw img c
  oarg_rw D2TableRow tr ; oarg_rw ImagePrototype img ; arg_rw D2Context c
  each b tr:content
    b draw img c

html_tags insert "tr" true addressof:D2TableRow


type D2Table
  inherit D2Box
  field (List Link:D2Box) content
  field Int bgcolor <- undefined
  field Str border padding spacing

D2Box maybe D2Table

method t configure attribute value options
  oarg_rw D2Table t ; arg Str attribute value options
  if attribute="bgcolor"
    t bgcolor := html_color value
  eif attribute="border"
    t border := value
  eif attribute="cellpadding"
    t padding := value
  eif attribute="cellspacing"
    t spacing := value

method t list -> l
  oarg_rw D2Table t ; arg Pointer:(List Link:D2Box) l
  l :> t content

function compute_col_row_size b ix iy sx sy
  oarg_rw D2Box b ; arg_rw Int ix iy ; arg_rw Array:Float sx sy
  if (entry_type addressof:b)=D2TableCell or (entry_type addressof:b)=D2TableHeader
    while ix>=sx:size
      sx += 0
    while iy>=sy:size
      sy += 0
    if b:x0=defined
      sx ix := max sx:ix b:x1
      sy iy := max sy:iy b:y1
    ix += 1
  eif (entry_type addressof:b)=D2Table
    void
  else
    var Pointer:(List Link:D2Box) l :> b list
    if exists:l
      each bb l
        compute_col_row_size bb ix iy sx sy
    if (entry_type addressof:b)=D2TableRow
      ix := 0 ; iy += 1

function adjust_col_row_size b ix iy sx sy c
  oarg_rw D2Box b ; arg_rw Int ix iy ; arg_rw Array:Float sx sy ; arg D2Context c
  if (entry_type addressof:b)=D2TableCell or (entry_type addressof:b)=D2TableHeader
    var D2Context c2 := c
    c2 x0 := 0
    c2 y0 := 0
    c2 x1 := sx ix
    c2 y1 := float_max/2
    c2 newline
    b position c2
    if b:x0=defined
      sy iy := max sy:iy b:y1
    ix += 1
  eif (entry_type addressof:b)=D2Table
    void
  else
    var Pointer:(List Link:D2Box) l :> b list
    if exists:l
      each bb l
        adjust_col_row_size bb ix iy sx sy c
    if (entry_type addressof:b)=D2TableRow
      ix := 0 ; iy += 1

function adjust_cell_position b ix iy px py
  oarg_rw D2Box b ; arg_rw Int ix iy ; arg Array:Float px py
  if (entry_type addressof:b)=D2TableCell or (entry_type addressof:b)=D2TableHeader
    if (b:x0<>0 or b:y0<>0) and b:x0=defined
      console "oops " b:x0 " " b:y0 eol
    b translate px:ix py:iy
    ix += 1
  eif (entry_type addressof:b)=D2Table
    void
  else
    # if (entry_type addressof:b)=D2TableRow
    #   b translate px:ix py:iy 
    var Pointer:(List Link:D2Box) l :> b list
    if exists:l
      each bb l
        adjust_cell_position bb ix iy px py
    if (entry_type addressof:b)=D2TableRow
      ix := 0 ; iy += 1

method t position c
  oarg_rw D2Table t ; arg_rw D2Context c
  var Float u := c unit
  # ask cells for size
  c newline
  each b t:content
    b position c
  var Array:Float sx sy
  var Int ix := 0 ; var Int iy := 0
  each b t:content
    compute_col_row_size b ix iy sx sy
  # adjust columns horizontal size
  var Float total := 0*(3*sx:size+1)*u
  for (var Int i) 0 sx:size-1
    total += sx i
  if total>c:x1-c:x0
    var Float limit := (c:x1-c:x0)/sx:size
    part adjust_limit
      var Float total := 0*(3*sx:size+1)*u ; var Int candidate := 0
      for (var Int i) 0 sx:size-1
        total += min sx:i limit
        if sx:i>limit
          candidate += 1
      if c:x1-c:x0>total+1e-6 and candidate>0
        limit += (c:x1-c:x0-total)/candidate
        restart adjust_limit
    for (var Int i) 0 sx:size-1
      sx i := min sx:i limit
    var Int ix := 0 ; var Int iy := 0
    each b t:content
      adjust_col_row_size b ix iy sx sy c
  # compute absolute horizontal and vertical positions
  var Array:Float px py
  px size := sx:size+1
  px 0 := c x0
  for (var Int i) 1 px:size-1
    px i := (px i-1)+(sx i-1)
  py size := sy:size+1
  py 0 := c y0
  for (var Int i) 1 py:size-1
    py i := (py i-1)+(sy i-1)
  # adjust cells positions
  var Int ix := 0 ; var Int iy := 0
  each b t:content
    adjust_cell_position b ix iy px py
  # overall table position
  t x0 := px 0
  t y0 := py 0
  t x1 := px px:size-1
  t y1 := py py:size-1
  c y0 := t y1
  c newline
    
method t draw img c
  oarg_rw D2Table t ; oarg_rw ImagePrototype img ; arg_rw D2Context c
  if t:bgcolor=defined and t:x0=defined
    img fill t:x0 t:y0 t:x1 t:y1 (addressof t:bgcolor)
  each b t:content
    b draw img c

html_tags insert "table" true addressof:D2Table