Patch title: Release 93 bulk changes
Abstract:
File: /graphic/browser/tag/table.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/unsafe.pli"
module "/pliant/language/unsafe.pli"
module "prototype.pli"
module "/pliant/graphic/browser/xml/helper.pli"
module "/pliant/graphic/browser/core.pli"
module "/pliant/graphic/misc/float.pli"




tag_position td
browser_tag_position cell
  newline
  newline
  position_recurse tree
  position_container tree
  position_recurse node
  position_container node


tag_draw td
browser_tag_draw cell
  if not ((query "table" "border") parse (var Float border))
    border := 0
  if not ((query "table" "border") parse (var Float border))
    border := 0
  border *= 25.4/72
  if border>0
  if border>0
    var Int bcolor := html_color (query "table" "bordercolor
    var Int bcolor := console browser_color (query "table" "bordercolor")
    if bcolor=undefined
      bcolor := 808080h
    if bcolor=undefined
      bcolor := 808080h
    rectangle x0-border y0-border x1+border y0 addressof:bco
    rectangle x0-border y0-border x0 y1+border addressof:bco
    rectangle x1 y0-border x1+border y1+border addressof:bco
    rectangle x0-border y1 x1+border y1+border addressof:bco
  var Int c := html_color (query "td" "bgcolor")
  if c<>undefined and x0<>undefined
    rectangle x0 y0 x1 y1 addressof:c
  draw_recurse tree
    rectangle area:x0-border area:y0-border area:x1+border area:y0 addressof:bcolor
    rectangle area:x0-border area:y0-border area:x0 area:y1+border addressof:bcolor
    rectangle area:x1 area:y0-border area:x1+border area:y1+border addressof:bcolor
    rectangle area:x0-border area:y1 area:x1+border area:y1+border addressof:bcolor
  var Int c := console browser_color (query "cell" "color")
  if c<>undefined and area:x0<>undefined
    rectangle area:x0 area:y0 area:x1 area:y1 addressof:c
  draw_recurse node




function compute_col_row_size t ix iy sx sy
  arg XmlTree t ; arg_rw Int ix iy ; arg_rw Array:Float sx s
  if t:tag="td"
function compute_col_row_size n ix iy sx sy
  arg_rw BrowserNode n ; arg_rw Int ix iy ; arg_rw Array:Float sx sy
  if n:tag="cell"
    while ix>=sx:size
      sx += 0
    while iy>=sy:size
      sy += 0
    while ix>=sx:size
      sx += 0
    while iy>=sy:size
      sy += 0
    if t:x0<>undefined
      sx ix := max sx:ix t:x1-t:x0
      sy iy := max sy:iy t:y1-t:y0
    if n:area:x0<>undefined
      sx ix := max sx:ix n:area:x1-n:area:x0
      sy iy := max sy:iy n:area:y1-n:area:y0
    ix += 1
    ix += 1
  eif t:tag="table"
  eif n:tag="table"
    void
  else
    void
  else
    each sub t
    each sub n
      compute_col_row_size sub ix iy sx sy
      compute_col_row_size sub ix iy sx sy
    if t:tag="tr"
    if n:tag="row"
      ix := 0 ; iy += 1

      ix := 0 ; iy += 1

method c adjust_col_row_size t ix iy sx sy
  arg_rw XmlContext c ; arg_rw XmlTree t ; arg_rw Int ix iy 
  if t:tag="td"
method c adjust_col_row_size n ix iy sx sy
  arg_rw BrowserContext c ; arg_rw BrowserNode n ; arg_rw Int ix iy ; arg_rw Array:Float sx sy
  if n:tag="cell"
    var Float memo_x0 := c area_x0 ; var Float memo_y0 := c 
    c area_x0 := 0 ; c area_y0 := 0 ; c area_x1 := sx ix ; c
    c newline
    var Float memo_x0 := c area_x0 ; var Float memo_y0 := c 
    c area_x0 := 0 ; c area_y0 := 0 ; c area_x1 := sx ix ; c
    c newline
    c position t
    c position n
    c area_x0 := memo_x0 ; c area_y0 := memo_y0 ; c area_x1 
    c newline
    c area_x0 := memo_x0 ; c area_y0 := memo_y0 ; c area_x1 
    c newline
    if t:x0<>undefined
      sy iy := max sy:iy t:y1
    if n:area:x0<>undefined
      sy iy := max sy:iy n:area:y1
    ix += 1
    ix += 1
  eif t:tag="table"
  eif n:tag="table"
    void
  else
    void
  else
    each sub t
    each sub n
      c adjust_col_row_size sub ix iy sx sy
      c adjust_col_row_size sub ix iy sx sy
    if t:tag="tr"
    if n:tag="row"
      ix := 0 ; iy += 1

      ix := 0 ; iy += 1

function adjust_cell_position t ix iy px py padding extra
  arg_rw XmlTree t ; arg_rw Int ix iy ; arg Array:Float px p
  if t:tag="td"
    if t:x0<>undefined
      position_translate t px:ix-t:x0+padding py:iy-t:y0+pad
    t x0 := px ix ; t y0 := py iy ; t x1 := (px ix+1)-extra 
function adjust_cell_position n ix iy px py padding extra
  arg_rw BrowserNode n ; arg_rw Int ix iy ; arg Array:Float px py ; arg Float padding extra
  if n:tag="cell"
    if n:area:x0<>undefined
      position_translate n px:ix-n:area:x0+padding py:iy-n:area:y0+padding
    n:area x0 := px ix ; n:area y0 := py iy ; n:area x1 := (px ix+1)-extra ; n:area y1 := (py iy+1)-extra
    ix += 1
    ix += 1
  eif t:tag="table"
  eif n:tag="table"
    void
  else
    void
  else
    each sub t
    each sub n
      adjust_cell_position sub ix iy px py padding extra
      adjust_cell_position sub ix iy px py padding extra
    if t:tag="tr"
    if n:tag="row"
      ix := 0 ; iy += 1


      ix := 0 ; iy += 1


tag_position table
  if not ((query "table" "cellpadding") parse (var Float pad
browser_tag_position table
  if not ((query "table" "padding") parse (var Float padding))
    padding := 0
  if not ((query "table" "border") parse (var Float border))
    border := 0
    padding := 0
  if not ((query "table" "border") parse (var Float border))
    border := 0
  if not ((query "table" "cellspacing") parse (var Float spa
  if not ((query "table" "spacing") parse (var Float spacing))
    spacing := 0
    spacing := 0
  padding *= 25.4/72
  border *= 25.4/72
  spacing *= 25.4/72
  # ask cells for size
  # ask cells for size
  x0 := area_x0 ; y0 := area_y0
  area x0 := area_x0 ; area y0 := area_y0
  newline
  newline
  position_recurse tree
  position_recurse node
  var Array:Float sx sy
  var Int ix := 0 ; var Int iy := 0
  var Array:Float sx sy
  var Int ix := 0 ; var Int iy := 0
  each sub tree
  each sub node
    compute_col_row_size sub ix iy sx sy
  # adjust columns horizontal size
  var Float total := 0
  for (var Int i) 0 sx:size-1
    total += sx i
  var Float room := area_x1-area_x0-padding*2*sx:size-border
  if total>room
    var Float limit := room/sx:size
    part adjust_limit
      var Float total := 0 ; var Int candidate := 0
      for (var Int i) 0 sx:size-1
        total += min sx:i limit
        if sx:i>limit
          candidate += 1
      if room>total+1e-6 and candidate>0
        limit += (room-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
    compute_col_row_size sub ix iy sx sy
  # adjust columns horizontal size
  var Float total := 0
  for (var Int i) 0 sx:size-1
    total += sx i
  var Float room := area_x1-area_x0-padding*2*sx:size-border
  if total>room
    var Float limit := room/sx:size
    part adjust_limit
      var Float total := 0 ; var Int candidate := 0
      for (var Int i) 0 sx:size-1
        total += min sx:i limit
        if sx:i>limit
          candidate += 1
      if room>total+1e-6 and candidate>0
        limit += (room-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 sub tree
    each sub node
      adjust_col_row_size sub ix iy sx sy
  # computess absolute horizontal and vertical positions
  var Array:Float px py
  px size := sx:size+1
      adjust_col_row_size sub ix iy sx sy
  # computess absolute horizontal and vertical positions
  var Array:Float px py
  px size := sx:size+1
  px 0 := x0+2*border+spacing
  px 0 := area:x0+2*border+spacing
  for (var Int i) 1 px:size-1
    px i := (px i-1)+(sx i-1)+2*padding+2*border+spacing
  py size := sy:size+1
  for (var Int i) 1 px:size-1
    px i := (px i-1)+(sx i-1)+2*padding+2*border+spacing
  py size := sy:size+1
  py 0 := y0+2*border+spacing
  py 0 := area:y0+2*border+spacing
  for (var Int i) 1 py:size-1
    py i := (py i-1)+(sy i-1)+2*padding+2*border+spacing
  # adjust cells positions
  var Int ix := 0 ; var Int iy := 0
  for (var Int i) 1 py:size-1
    py i := (py i-1)+(sy i-1)+2*padding+2*border+spacing
  # adjust cells positions
  var Int ix := 0 ; var Int iy := 0
  each sub tree
  each sub node
    adjust_cell_position sub ix iy px py padding 2*border+sp
  # overall table position
    adjust_cell_position sub ix iy px py padding 2*border+sp
  # overall table position
  x1 := px px:size-1 ; y1 := py py:size-1
  area_y0 := y1
  area x1 := px px:size-1 ; area y1 := py py:size-1
  area_y0 := area y1
  newline

  newline

tag_draw table
  if not ((query "table" "cellpadding") parse (var Float pad
browser_tag_draw table
  if not ((query "table" "padding") parse (var Float padding))
    padding := 0
  if not ((query "table" "border") parse (var Float border))
    border := 0
    padding := 0
  if not ((query "table" "border") parse (var Float border))
    border := 0
  if not ((query "table" "cellspacing") parse (var Float spa
  if not ((query "table" "spacing") parse (var Float spacing))
    spacing := 0
    spacing := 0
  padding *= 25.4/72
  border *= 25.4/72
  spacing *= 25.4/72
  if border>0
  if border>0
    var Int bcolor := html_color (query "table" "bordercolor
    var Int bcolor := console browser_color (query "table" "bordercolor")
    if bcolor=undefined
      bcolor := 808080h
    if bcolor=undefined
      bcolor := 808080h
    rectangle x0 y0 x1 y0+border addressof:bcolor
    rectangle x0 y0 x0+border y1 addressof:bcolor
    rectangle x1-border y0 x1 y1 addressof:bcolor
    rectangle x0 y1-border x1 y1 addressof:bcolor
  draw_recurse tree
    rectangle area:x0 area:y0 area:x1 area:y0+border addressof:bcolor
    rectangle area:x0 area:y0 area:x0+border area:y1 addressof:bcolor
    rectangle area:x1-border area:y0 area:x1 area:y1 addressof:bcolor
    rectangle area:x0 area:y1-border area:x1 area:y1 addressof:bcolor
  draw_recurse node