Patch title: Release 96 bulk changes
Abstract:
File: /pliant/graphic/layout/table.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/compiler/type/inherit.pli"
module "/pliant/graphic/draw/prototype.pli"
module "/pliant/graphic/draw/prototype.pli"
module "/pliant/graphic/browser/client/context.pli"
module "/pliant/graphic/ui/client/context.pli"
module "prototype.pli"
module "sequence.pli"
module "restyle.pli"
module "helper/recurse.pli"
module "helper/position.pli"
module "prototype.pli"
module "sequence.pli"
module "restyle.pli"
module "helper/recurse.pli"
module "helper/position.pli"
module "helper/draw.pli"


public
  type LayoutCell


public
  type LayoutCell
    field Link:LayoutPrototype next
    field Int parent_and_flags <- 0
    inherit LayoutPrototype
    field Link:LayoutPrototype first_son
    field CBool header <- false


public
  type LayoutRow
    field Link:LayoutPrototype first_son
    field CBool header <- false


public
  type LayoutRow
    field Link:LayoutPrototype next
    field Int parent_and_flags <- 0
    inherit LayoutPrototype
    field Link:LayoutPrototype first_son


public
  type LayoutTable
    field Link:LayoutPrototype first_son


public
  type LayoutTable
    field Link:LayoutPrototype next
    field Int parent_and_flags <- 0
    inherit LayoutPrototype
    field Link:LayoutPrototype first_son
    field Int columns <- undefined
    field Array:Float px py


method t position_cells p c lap ix iy sx sy
  arg_rw LayoutTable t ; oarg_rw LayoutPrototype p ; arg_rw 
  if (entry_type addressof:p)=LayoutCell
    field Link:LayoutPrototype first_son
    field Int columns <- undefined
    field Array:Float px py


method t position_cells p c lap ix iy sx sy
  arg_rw LayoutTable t ; oarg_rw LayoutPrototype p ; arg_rw 
  if (entry_type addressof:p)=LayoutCell
    var Pointer:LayoutStyleBox style
    if (addressof:p map LayoutCell):header
      style :> c:style:table header
    else
      style :> c:style:table cell
    while ix>=sx:size
      sx += 0
    while iy>=sy:size
      sy += 0
    if lap=0
      (var LayoutPC c2) setup c:window c:style 0 0 c:area:x1
      var LayoutArea b := p position c2
    while ix>=sx:size
      sx += 0
    while iy>=sy:size
      sy += 0
    if lap=0
      (var LayoutPC c2) setup c:window c:style 0 0 c:area:x1
      var LayoutArea b := p position c2
      sx ix := max sx:ix b:x1-b:x0
      sy iy := max sy:iy b:y1-b:y0
      sx ix := max sx:ix (b:x1-b:x0)+style:padding:x0+style:padding:x1
      sy iy := max sy:iy (b:y1-b:y0)+style:padding:y0+style:padding:y1
    eif lap=1
      (var LayoutPC c2) setup c:window c:style 0 0 sx:ix c:a
      var LayoutArea b := p position c2
      sy iy := max sy:iy b:y1-b:y0
    else
    eif lap=1
      (var LayoutPC c2) setup c:window c:style 0 0 sx:ix c:a
      var LayoutArea b := p position c2
      sy iy := max sy:iy b:y1-b:y0
    else
      (var LayoutPC c2) setup c:window c:style (t:px ix) (t:
      (var LayoutPC c2) setup c:window c:style (t:px ix)+style:padding:x0 (t:py iy)+style:padding:y0 (t:px ix)+sx:ix-style:padding:x1 (t:py iy)+sy:iy-style:padding:y1 0
      p position c2
    ix += 1
    if ix=t:columns
      ix := 0 ; iy += 1
  eif (entry_type addressof:p)=LayoutRow
    ix := 0 ; iy += 1
    var Link:LayoutPrototype q :> p first
    while exists:q
      t position_cells q c lap ix iy sx sy
      q :> q next 
  eif (entry_type addressof:p)=LayoutRestyle
    var Pointer:LayoutRestyle s :> addressof:p map LayoutRes
    var Pointer:LayoutStyle memo :> c style
    if (exists s:style)
      c style :> s style
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:o
    var Link:LayoutPrototype q :> p first
    while exists:q
      t position_cells q c lap ix iy sx sy
      q :> q next 
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:o
    c style :> memo
      p position c2
    ix += 1
    if ix=t:columns
      ix := 0 ; iy += 1
  eif (entry_type addressof:p)=LayoutRow
    ix := 0 ; iy += 1
    var Link:LayoutPrototype q :> p first
    while exists:q
      t position_cells q c lap ix iy sx sy
      q :> q next 
  eif (entry_type addressof:p)=LayoutRestyle
    var Pointer:LayoutRestyle s :> addressof:p map LayoutRes
    var Pointer:LayoutStyle memo :> c style
    if (exists s:style)
      c style :> s style
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:o
    var Link:LayoutPrototype q :> p first
    while exists:q
      t position_cells q c lap ix iy sx sy
      q :> q next 
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:o
    c style :> memo
  eif (entry_type addressof:p)=LayoutSection
    var Link:LayoutPrototype q :> p first
    while exists:q
      t position_cells q c lap ix iy sx sy
      q :> q next 
  else
    var Link:LayoutPrototype q :> p first
    while exists:q
      t position_cells q c lap ix iy sx sy
      q :> q next 

method t position c -> b
  oarg_rw LayoutTable t ; arg_rw LayoutPC c ; arg LayoutArea
  var Pointer:LayoutStyleTable s :> c:style table
  implicit s
    # ask cells for size
    var Int ix := 0 ; var Int iy := 0
    t position_cells t c 0 ix iy (var Array:Float sx) (var A
    # adjust columns horizontal size
    var Float total := 0
    for (var Int i) 0 sx:size-1
      total += sx i
  else
    var Link:LayoutPrototype q :> p first
    while exists:q
      t position_cells q c lap ix iy sx sy
      q :> q next 

method t position c -> b
  oarg_rw LayoutTable t ; arg_rw LayoutPC c ; arg LayoutArea
  var Pointer:LayoutStyleTable s :> c:style table
  implicit s
    # ask cells for size
    var Int ix := 0 ; var Int iy := 0
    t position_cells t c 0 ix iy (var Array:Float sx) (var A
    # adjust columns horizontal size
    var Float total := 0
    for (var Int i) 0 sx:size-1
      total += sx i
    var Float room := c:area:x1-c:area:x0-2*sx:size*padding-
    var Float room := c:area:x1-c:area:x0-c:style:table:box:padding:x0-c:style:table:box:padding:x1
    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
      t position_cells t c 1 ix iy (var Array:Float sx) (var
    # computess absolute horizontal and vertical positions
    t:px size := sx:size+1
    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
      t position_cells t c 1 ix iy (var Array:Float sx) (var
    # computess absolute horizontal and vertical positions
    t:px size := sx:size+1
    t:px 0 := c:area:x0+border_size+padding
    t:px 0 := c:area:x0+c:style:table:box:padding:x0
    for (var Int i) 1 sx:size
    for (var Int i) 1 sx:size
      t:px i := (t:px i-1)+(sx i-1)+2*padding+border_size
      t:px i := (t:px i-1)+(sx i-1)
    t:py size := sy:size+1
    t:py size := sy:size+1
    t:py 0 := c:area:y0+border_size+padding
    t:py 0 := c:area:y0+c:style:table:box:padding:y0
    for (var Int i) 1 sy:size
    for (var Int i) 1 sy:size
      t:py i := (t:py i-1)+(sy i-1)+2*padding+border_size
      t:py i := (t:py i-1)+(sy i-1)
    var Int ix := 0 ; var Int iy := 0
    t position_cells t c 2 ix iy (var Array:Float sx) (var A
    b x0 := c:area x0
    b y0 := c:area y0
    var Int ix := 0 ; var Int iy := 0
    t position_cells t c 2 ix iy (var Array:Float sx) (var A
    b x0 := c:area x0
    b y0 := c:area y0
    b x1 := (t:px sx:size)-padding
    b y1 := (t:py sy:size)-padding
    b x1 := (t:px sx:size)+c:style:table:box:padding:x1
    b y1 := (t:py sy:size)+c:style:table:box:padding:y1
    c:area y0 := b y1


method t draw_cells p d c ix iy
  arg_rw LayoutTable t ; oarg_rw LayoutPrototype p ; oarg_rw
    c:area y0 := b y1


method t draw_cells p d c ix iy
  arg_rw LayoutTable t ; oarg_rw LayoutPrototype p ; oarg_rw
  var Pointer:LayoutStyleTable style :> c:style table
  implicit style
    if (entry_type addressof:p)=LayoutCell
      if ix+1<t:px:size and iy+1<t:py:size
        var Float x0 := (t:px ix)-padding-border_size
        var Float y0 := (t:py iy)-padding-border_size
        var Float x1 := (t:px ix+1)-padding
        var Float y1 := (t:py iy+1)-padding
        var Link:LayoutCell cell :> addressof:p map LayoutCe
        var Pointer:LayoutColor bg :> c:style:cell bg_color
        if cell:header
          bg :> c:style:cell header_bg_color
        if (exists bg:gamut)
          d rectangle x0 y0 x1 y1 (c color bg)
        var Address bc := c color border_color
        d rectangle x0 y0 x1 y0+border_size bc
        d rectangle x0 y0+border_size x0+border_size y1-bord
        d rectangle x1-border_size y0+border_size x1 y1-bord
        d rectangle x0 y1-border_size x1 y1 bc
        cell draw d c
      ix += 1
      if ix=t:columns
        ix := 0 ; iy += 1
    eif (entry_type addressof:p)=LayoutRow
  if (entry_type addressof:p)=LayoutCell
    if ix+1<t:px:size and iy+1<t:py:size
      var Link:LayoutCell cell :> addressof:p map LayoutCell
      var Pointer:LayoutStyleBox style
      if cell:header
        style :> c:style:table header
      else
        style :> c:style:table cell
      box_draw (t:px ix) (t:py iy) (t:px ix+1) (t:py iy+1) style d c
      cell draw d c
    ix += 1
    if ix=t:columns
      ix := 0 ; iy += 1
      ix := 0 ; iy += 1
      var Link:LayoutPrototype q :> p first
      while exists:q
        t draw_cells q d c ix iy
        q :> q next 
    eif (entry_type addressof:p)=LayoutRestyle
      var Pointer:LayoutRestyle s :> addressof:p map LayoutR
      var Pointer:LayoutStyle memo :> c style
      if (exists s:style)
        c style :> s style
      each attr s:attributes
        memory_swap ((addressof c:style) translate Byte attr
      var Link:LayoutPrototype q :> p first
      while exists:q
        t draw_cells q d c ix iy
        q :> q next 
      each attr s:attributes
        memory_swap ((addressof c:style) translate Byte attr
      c style :> memo
    eif (entry_type addressof:p)=LayoutSection
      var Link:LayoutPrototype q :> p first
      while exists:q
        t draw_cells q d c ix iy
        q :> q next 
    else
      var Link:LayoutPrototype q :> p first
      while exists:q
        t draw_cells q d c ix iy
        q :> q next 
  eif (entry_type addressof:p)=LayoutRow
    ix := 0 ; iy += 1
    var Link:LayoutPrototype q :> p first
    while exists:q
      t draw_cells q d c ix iy
      q :> q next 
  eif (entry_type addressof:p)=LayoutRestyle
    var Pointer:LayoutRestyle s :> addressof:p map LayoutRestyle
    var Pointer:LayoutStyle memo :> c style
    if (exists s:style)
      c style :> s style
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:offset) attr:value attr:size
    var Link:LayoutPrototype q :> p first
    while exists:q
      t draw_cells q d c ix iy
      q :> q next 
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:offset) attr:value attr:size
    c style :> memo
  eif (entry_type addressof:p)=LayoutSection
    var Link:LayoutPrototype q :> p first
    while exists:q
      t draw_cells q d c ix iy
      q :> q next 
  else
    var Link:LayoutPrototype q :> p first
    while exists:q
      t draw_cells q d c ix iy
      q :> q next 

method t draw d c
  oarg_rw LayoutTable t ; oarg_rw DrawPrototype d ; arg_rw L

method t draw d c
  oarg_rw LayoutTable t ; oarg_rw DrawPrototype d ; arg_rw L
  if t:px:size>=2 and t:py:size>=2
    var Pointer:LayoutStyleBox b :> c:style:table box
    box_draw t:px:0-b:padding:x0 t:py:0-b:padding:y0 (t:px t:px:size-1)+b:padding:x1 (t:py t:py:size-1)+b:padding:y1 b d c
  var Int ix := 0 ; var Int iy := 0
  t draw_cells t d c ix iy



method t first -> p
  oarg_rw LayoutTable t ; arg_C Link:LayoutPrototype p
  p :>> t first_son
  var Int ix := 0 ; var Int iy := 0
  t draw_cells t d c ix iy



method t first -> p
  oarg_rw LayoutTable t ; arg_C Link:LayoutPrototype p
  p :>> t first_son