Patch title: Release 94 bulk changes
Abstract:
File: /pliant/graphic/layout/hook.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/util/pml/io.pli"
module "/pliant/graphic/draw/prototype.pli"
module "/pliant/graphic/browser/client/context.pli"
module "prototype.pli"
module "sequence.pli"
module "helper/recurse.pli"
module "helper/position.pli"


public
  type LayoutHook
    field Link:LayoutPrototype next
    field Int parent_and_flags <- 0
    field LayoutArea bbox
    field Link:LayoutPrototype first_son
    field Str id
    field Int flags <- 0

  LayoutPrototype maybe LayoutHook


function build h
  arg_w LayoutHook h
  h:bbox x0 := undefined


method h position c -> b
  oarg_rw LayoutHook h ; arg_rw LayoutPC c ; arg LayoutArea b
  b := h position_recurse c
  h set_position b


method h draw d c
  oarg_rw LayoutHook h ; oarg_rw DrawPrototype d ; arg_rw LayoutDC c
  if h:bbox:x0=undefined or (h:bbox intersects c:bbox)
    h draw_recurse d c


method h event c
  oarg_rw LayoutHook h ; arg_rw LayoutEC c
  # console "hook mode " c:mode " for event " c:event " " c:key " " c:pointer_index " (" c:x " " c:y " in " h:bbox:x0 " " h:bbox:y0 " " h:bbox:x1 " " h:bbox:y1 " " (shunt c:x>=h:bbox:x0 and c:x<=h:bbox:x1 and c:y>=h:bbox:y0 and c:y<=h:bbox:y1 "yes" "no") ")" eol
  h event_recurse c
  if c:event="move" and (h:flags .and. 1)=0
    return
  var CBool clic := c:event="press" and (c:key parse "button" any) and c:x>=h:bbox:x0 and c:x<=h:bbox:x1 and c:y>=h:bbox:y0 and c:y<=h:bbox:y1
  if c:mode=(shunt clic layout_event_pointer layout_event_focus)
    var Pointer:BrowserSession s :> c:window session
    s:connection otag "event" h:id
    s:connection oattr "event" c:event
    s:connection oattr "key" c:key
    if c:x<>undefined
      s:connection oattr "pointer_x" c:x
    if c:y<>undefined
      s:connection oattr "pointer_y" c:y
    part pointer_section
      var Pointer:LayoutPrototype p :> c pointer_target
      while exists:p
        if (entry_type addressof:p)=LayoutSection
          s:connection oattr "pointer_section" (addressof:p map LayoutSection):section
          if c:pointer_index<>undefined
            s:connection oattr "pointer_index" c:pointer_index
          leave pointer_section          
        p :> p parent
    part focus_section
      var Pointer:LayoutPrototype p :> s focus_target
      while exists:p
        if (entry_type addressof:p)=LayoutSection
          s:connection oattr "focus_section" (addressof:p map LayoutSection):section
          if s:focus_index<>undefined
            s:connection oattr "focus_index" (shunt clic s:focus_index c:focus_was)
          leave focus_section          
        p :> p parent
    s:connection flush anytime
    c cancel := true


method s first -> p
  oarg_rw LayoutHook s ; arg_C Link:LayoutPrototype p
  p :>> s first_son