Patch title: Release 95 bulk changes
Abstract:
File: /pliant/graphic/layout/text.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
module "/pliant/graphic/vector/font.pli"
module "/pliant/graphic/draw/prototype.pli"
module "/pliant/util/encoding/utf8.pli"
module "prototype.pli"
submodule "text1.pli"
module "helper/text.pli"
module "helper/recurse.pli"
module "helper/position.pli"
module "helper/event.pli"
module "sequence.pli"
module "restyle.pli"
module "/pliant/graphic/browser/client/context.pli"
module "/pliant/graphic/browser/client/window.pli"



method t position c -> b
  oarg_rw LayoutPara t ; arg_rw LayoutPC c ; arg LayoutArea 
  if t:positioned # FIXME: too naive
    var Pointer:LayoutArea pa :> t:bbox first
    var Float tx := c:area:x0-pa:x0
    var Float ty := c:area:y0-pa:y0
    pa x0 += tx ; pa y0 += ty ; pa x1 += tx ; pa y1 += ty
    c:area y0 += pa:y1-pa:y0
    t offset_rec tx ty
    return pa
  b := c area
  t dispatch c (var List list) (var LayoutArea b2)
  b y1 := c:area y0
  var Pointer:Arrow a :> list first
  while a<>null
    var Pointer:Type ta :> entry_type a
    if ta=LayoutTextObject
      var Pointer:LayoutTextObject o :> a map LayoutTextObje
      o:object translate o:x o:y
    a :> list next a
module "/pliant/language/compiler.pli"
module "/pliant/graphic/vector/font.pli"
module "/pliant/graphic/draw/prototype.pli"
module "/pliant/util/encoding/utf8.pli"
module "prototype.pli"
submodule "text1.pli"
module "helper/text.pli"
module "helper/recurse.pli"
module "helper/position.pli"
module "helper/event.pli"
module "sequence.pli"
module "restyle.pli"
module "/pliant/graphic/browser/client/context.pli"
module "/pliant/graphic/browser/client/window.pli"



method t position c -> b
  oarg_rw LayoutPara t ; arg_rw LayoutPC c ; arg LayoutArea 
  if t:positioned # FIXME: too naive
    var Pointer:LayoutArea pa :> t:bbox first
    var Float tx := c:area:x0-pa:x0
    var Float ty := c:area:y0-pa:y0
    pa x0 += tx ; pa y0 += ty ; pa x1 += tx ; pa y1 += ty
    c:area y0 += pa:y1-pa:y0
    t offset_rec tx ty
    return pa
  b := c area
  t dispatch c (var List list) (var LayoutArea b2)
  b y1 := c:area y0
  var Pointer:Arrow a :> list first
  while a<>null
    var Pointer:Type ta :> entry_type a
    if ta=LayoutTextObject
      var Pointer:LayoutTextObject o :> a map LayoutTextObje
      o:object translate o:x o:y
    a :> list next a
  if (c:flags .and. layout_pos_test_x)=0
    b x1 := max b:x1 b2:x1 # +c:style:focus:thickness
  b x1 := max b:x1 b2:x1
  t bbox := var List:LayoutArea empty_list
  t bbox += b
  t bbox := var List:LayoutArea empty_list
  t bbox += b
  if (c:flags .and. layout_pos_test_x)<>0
    b x0 := b2 x0
    b x1 := b2 x1
  if (c:flags .and. layout_pos_test_x+layout_pos_test_y)=0
    t set_position
  if (c:flags .and. layout_pos_test_x+layout_pos_test_y)=0
    t set_position
  else
    b := b2



method t draw d c
  oarg_rw LayoutPara t ; oarg_rw DrawPrototype d ; arg_rw La
  part escape
    var Pointer:LayoutArea pa :> t:bbox first
    while exists:pa



method t draw d c
  oarg_rw LayoutPara t ; oarg_rw DrawPrototype d ; arg_rw La
  part escape
    var Pointer:LayoutArea pa :> t:bbox first
    while exists:pa
      if (pa intersects c:bbox)
      if (pa intersects c:bbox c:style:focus:thickness)
        leave escape
      pa :> t:bbox next pa
    return
  var Pointer:LayoutStyleFocus fs :> c:style focus
  (var LayoutPC pc) setup c:window c:style t:bbox 0
  t dispatch pc (var List list) (var LayoutArea box)
  var Int index := shunt (addressof c:window:session:focus_t
  var Int i := 0
  var Pointer:Arrow a :> list first
  while a<>null
    var Pointer:Type ta :> entry_type a
    if ta=LayoutTextPart
      var Pointer:LayoutTextPart p :> a map LayoutTextPart
      d text p:text p:font p:kerning (transform p:x p:y+p:sl
      if debug
        var Int g := 808080h
        d rectangle p:x-0.5 p:y-0.5 p:x+0.5 p:y+0.5 addresso
      if index>=i and index<i+p:text:len+p:extra
        var Float x := p:x+p:scale*(p:font vector (p:text 0 
        d rectangle x p:y+p:scale*p:font:bbox_y0 x+fs:thickn
        c:window focus_area x p:y+p:scale*p:font:bbox_y0 x+f
      i += p:text:len+p:extra
    eif ta=LayoutTextObject
      (a map LayoutTextObject):object draw d c
      if debug
        var Pointer:LayoutTextPart p :> a map LayoutTextPart
        var Int g := 808080h
        d rectangle p:x-0.5 p:y-0.5 p:x+0.5 p:y+0.5 addresso
      i += 1
    a :> list next a



method t event c
  oarg_rw LayoutPara t ; arg_rw LayoutEC c
  if c:mode=layout_event_pointer
    part escape
      var Pointer:LayoutArea pa :> t:bbox first
      while exists:pa
        leave escape
      pa :> t:bbox next pa
    return
  var Pointer:LayoutStyleFocus fs :> c:style focus
  (var LayoutPC pc) setup c:window c:style t:bbox 0
  t dispatch pc (var List list) (var LayoutArea box)
  var Int index := shunt (addressof c:window:session:focus_t
  var Int i := 0
  var Pointer:Arrow a :> list first
  while a<>null
    var Pointer:Type ta :> entry_type a
    if ta=LayoutTextPart
      var Pointer:LayoutTextPart p :> a map LayoutTextPart
      d text p:text p:font p:kerning (transform p:x p:y+p:sl
      if debug
        var Int g := 808080h
        d rectangle p:x-0.5 p:y-0.5 p:x+0.5 p:y+0.5 addresso
      if index>=i and index<i+p:text:len+p:extra
        var Float x := p:x+p:scale*(p:font vector (p:text 0 
        d rectangle x p:y+p:scale*p:font:bbox_y0 x+fs:thickn
        c:window focus_area x p:y+p:scale*p:font:bbox_y0 x+f
      i += p:text:len+p:extra
    eif ta=LayoutTextObject
      (a map LayoutTextObject):object draw d c
      if debug
        var Pointer:LayoutTextPart p :> a map LayoutTextPart
        var Int g := 808080h
        d rectangle p:x-0.5 p:y-0.5 p:x+0.5 p:y+0.5 addresso
      i += 1
    a :> list next a



method t event c
  oarg_rw LayoutPara t ; arg_rw LayoutEC c
  if c:mode=layout_event_pointer
    part escape
      var Pointer:LayoutArea pa :> t:bbox first
      while exists:pa
        if pa:x0<=c:x and pa:y0<=c:y and pa:x1>=c:x and pa:y
        if pa:y0<=c:y and pa:y1>=c:y
          leave escape
        pa :> t:bbox next pa
      return
  t event_recurse c
  if c:cancel
    return
  var Pointer:LayoutArea b :> t:bbox first
          leave escape
        pa :> t:bbox next pa
      return
  t event_recurse c
  if c:cancel
    return
  var Pointer:LayoutArea b :> t:bbox first
  if c:mode=layout_event_pointer and exists:b and c:x>=b:x0 
  if c:mode=layout_event_pointer and (t:flags .and. 4)<>0 and exists:b and c:y>=b:y0 and c:y<=b:y1
    var Pointer:LayoutStyleFocus fs :> c:style focus
    (var LayoutPC pc) setup c:window c:style t:bbox 0
    t dispatch pc (var List list) (var LayoutArea box)
    var CBool found := false ; var Int possible := undefined
    var Int i := 0
    var Pointer:Arrow a :> list first
    while a<>null
      var Pointer:Type ta :> entry_type a
      if ta=LayoutTextPart
        var Pointer:LayoutTextPart p :> a map LayoutTextPart
        if c:y>=p:y+p:scale*p:font:bbox_y0 and c:y<=p:y+p:sc
          var Float x := p x
          for (var Int index) 0 p:text:len-1
            var Float dx := p:scale*(p:font vector p:text:in
            if p:kerning<>null
              dx += p:scale*(p:kerning map Float index)*p:fo
            if c:x>=x and c:x<=x+dx
              c pointer_target :> t
              c pointer_index := i+index
              found := true
            x += dx
          if c:x>x
            possible := i+p:text:len
        i += p:text:len+p:extra
      eif ta=LayoutTextObject
        i += 1
      a :> list next a
    if not found and possible<>undefined
    var Pointer:LayoutStyleFocus fs :> c:style focus
    (var LayoutPC pc) setup c:window c:style t:bbox 0
    t dispatch pc (var List list) (var LayoutArea box)
    var CBool found := false ; var Int possible := undefined
    var Int i := 0
    var Pointer:Arrow a :> list first
    while a<>null
      var Pointer:Type ta :> entry_type a
      if ta=LayoutTextPart
        var Pointer:LayoutTextPart p :> a map LayoutTextPart
        if c:y>=p:y+p:scale*p:font:bbox_y0 and c:y<=p:y+p:sc
          var Float x := p x
          for (var Int index) 0 p:text:len-1
            var Float dx := p:scale*(p:font vector p:text:in
            if p:kerning<>null
              dx += p:scale*(p:kerning map Float index)*p:fo
            if c:x>=x and c:x<=x+dx
              c pointer_target :> t
              c pointer_index := i+index
              found := true
            x += dx
          if c:x>x
            possible := i+p:text:len
        i += p:text:len+p:extra
      eif ta=LayoutTextObject
        i += 1
      a :> list next a
    if not found and possible<>undefined
      c pointer_target :> t
      c pointer_index := possible
  var Pointer:BrowserSession s :> c:window session
  var CBool pos := exists t:bbox:first
  var CBool redraw := false
  if c:mode=layout_event_focus and (exists c:window) and (ad
    if c:event="character" and (t:flags .and. 8)<>0
      var Pointer:LayoutPrototype pp :> t first ; var Int in
      if (scan pp index) and (entry_type addressof:pp)=Layou
        var Pointer:LayoutText tt :> addressof:pp map Layout
        var Str32 v := utf8_decode tt:text
        tt text := utf8_encode (v 0 index)+(utf8_decode c:ke
        s set_focus_index s:focus_index+1
        c reposition t
        redraw := true
  if c:event="focus"
    redraw := true
  if pos and redraw
    each b t:bbox
      c pointer_index := possible
  var Pointer:BrowserSession s :> c:window session
  var CBool pos := exists t:bbox:first
  var CBool redraw := false
  if c:mode=layout_event_focus and (exists c:window) and (ad
    if c:event="character" and (t:flags .and. 8)<>0
      var Pointer:LayoutPrototype pp :> t first ; var Int in
      if (scan pp index) and (entry_type addressof:pp)=Layou
        var Pointer:LayoutText tt :> addressof:pp map Layout
        var Str32 v := utf8_decode tt:text
        tt text := utf8_encode (v 0 index)+(utf8_decode c:ke
        s set_focus_index s:focus_index+1
        c reposition t
        redraw := true
  if c:event="focus"
    redraw := true
  if pos and redraw
    each b t:bbox
      c:window redraw_area b:x0 b:y0 b:x1 b:y1
      c:window redraw_area b:x0 b:y0 b:x1+c:style:focus:thickness b:y1


method t focusable -> c
  oarg_rw LayoutPara t ; arg CBool c
  c := (t:flags .and. 4)<>0



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