Patch title: Release 90 bulk changes
Abstract:
File: /graphic/browser/tag/form.pli
Key:
    Removed line
    Added line
   
module "common.pli"
module "/pliant/graphic/vector/font.pli"
module "/pliant/language/type/text/istr.pli"
module "/pliant/util/encoding/http.pli"
module "text.pli"
module "/pliant/language/unsafe.pli"
module "prototype.pli"
module "/pliant/language/type/text/str32.pli"
module "/pliant/util/encoding/html.pli"
module "/pliant/math/curve.pli"
module "/pliant/graphic/browser/xml/helper.pli"


constant button_enlarge 4*25.4/72


type D2Option
  inherit D2Box
  field Str value
  field CBool selected <- false
  field (List Link:D2Box) content


D2Box maybe D2Option
tag_position input
  if (query "input" "type")="submit"
    var Str32 label := html_decode32 (query "input" "value")
    var Link:Font f :> font "Nimbus Sans L Regular" ; var Float scale := 10*25.5/72
    f bbox label null (var Float bx0) (var Float by0) (var Float bx1) (var Float by1)
    x0 := bx0*scale-button_enlarge ; y0 := by0*scale-button_enlarge ; x1 := bx1*scale+button_enlarge ; y1 := by1*scale+button_enlarge
    addtoline tree
    console "position button " x0 " " y0 " " x1 " " y1 eol


method o configure attribute value options
  oarg_rw D2Option o ; arg Str attribute value options
  if attribute="value"
    o value := value
  eif attribute="selected"
    o selected := true
tag_draw input
  if (query "input" "type")="submit"
    (var Array:Curve curves) size := 1
    var Pointer:Curve c :> curves 0 ; var CurvePoint p
    p := curve_point x0+button_enlarge y0+button_enlarge/2 false ; p tg_in -1 0 ; p tg_out 1 0 ; c += p
    p := curve_point x1-button_enlarge y0+button_enlarge/2 false ; p tg_in -1 0 ; p tg_out 1 0 ; c += p
    p := curve_point x1-button_enlarge/2 y0+button_enlarge false ; p tg_in 0 -1 ; p tg_out 0 1 ; c += p
    p := curve_point x1-button_enlarge/2 y1-button_enlarge false ; p tg_in 0 -1 ; p tg_out 0 1 ; c += p
    p := curve_point x1-button_enlarge y1-button_enlarge/2 false ; p tg_in 1 0 ; p tg_out -1 0 ; c += p
    p := curve_point x0+button_enlarge y1-button_enlarge/2 false ; p tg_in 1 0 ; p tg_out -1 0 ; c += p
    p := curve_point x0+button_enlarge/2 y1-button_enlarge false ; p tg_in 0 1 ; p tg_out 0 -1 ; c += p
    p := curve_point x0+button_enlarge/2 y0+button_enlarge false ; p tg_in 0 1 ; p tg_out 0 -1 ; c += p
    c compute outline
    var Int color := 0C0F0F0h
    fill curves fill_evenodd transform addressof:color
    var Str32 label := html_decode32 (query "input" "value")
    var Link:Font f :> font "Nimbus Sans L Regular" ; var Float scale := 10*25.5/72
    f bbox label null (var Float bx0) (var Float by0) (var Float bx1) (var Float by1)
    var Int color := 0
    text label f null undefined (transform x0+button_enlarge y0+button_enlarge-by0*scale scale scale 0 0) addressof:color


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

method o position c
  oarg_rw D2Option o ; arg_rw D2Context c
  o position_hidden c


function option_text b value -> label
  oarg_rw D2Box b ; arg Str value ; arg iStr label
  if (entry_type addressof:b)=D2Text
    return (addressof:b map D2Text):itext
  var Pointer:(List Link:D2Box) l :> b list
  if exists:l
    each bb l
      label := option_text bb value
      if label<>""
        return
  label := ""

function label_for b value -> label
  oarg_rw D2Box b ; arg Str value ; arg iStr label
  if (entry_type addressof:b)=D2Option
    if (addressof:b map D2Option):value=value
      return (option_text b value)
  var Pointer:(List Link:D2Box) l :> b list
  if exists:l
    each bb l
      label := label_for bb value
      if label<>""
        return
  label := ""

function value_for b -> value
  oarg_rw D2Box b ; arg Str value
  if (entry_type addressof:b)=D2Option
    if (addressof:b map D2Option):selected
      return (addressof:b map D2Option):value
  var Pointer:(List Link:D2Box) l :> b list
  if exists:l
    each bb l
      value := value_for bb
      if value<>""
        return
  value := ""

type D2Select
  inherit D2Box
  field Str name value
  field CBool selected <- false
  field (List Link:D2Box) content

D2Box maybe D2Select

method s configure attribute value options
  oarg_rw D2Select s ; arg Str attribute value options
  if attribute="name"
    s name := value

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

method s position c
  oarg_rw D2Select s ; arg_rw D2Context c
  if not s:selected
    s value := value_for s
    s selected := true
  var Str32 label := label_for s s:value
  c:font box label 0 0 c:scale s:x0 s:y0 s:x1 s:y1
  var Float u := c unit
  s y0 -= 2*u
  s x1 += 4*u
  s y1 += 2*u
  c addtoline s

method s draw img c
  oarg_rw D2Select s ; oarg_rw ImagePrototype img ; arg_rw D
  var Int ground := 0C0E8E8h
  var Float u := c unit
  img fill s:x0+u s:y0+u s:x1-u s:y1-u 2*u addressof:ground
  var Str32 label := label_for s s:value
  c:font box label 0 0 c:scale (var Float x0) (var Float y0)
  c:font draw label img s:x0+2*u s:y0+2*u-y0 c:scale (addres

method s event e
  oarg_rw D2Select s ; arg_rw D2Event e


type D2Input
  inherit D2Box
  field Str type name value

D2Box maybe D2Input

method i configure attribute value options
  oarg_rw D2Input i ; arg Str attribute value options
  if attribute="type"
    i type := value
  eif attribute="name"
    i name := value
  eif attribute="value"
    i value := html_decode value

method i position c
  oarg_rw D2Input i ; arg_rw D2Context c
  if i:type="hidden"
    i position_hidden c
    return
  c:font box i:value 0 0 c:scale i:x0 i:y0 i:x1 i:y1
  var Float u := c unit
  i y0 -= 2*u
  i x1 += 4*u
  i y1 += 2*u
  c addtoline i

method i draw img c
  oarg_rw D2Input i ; oarg_rw ImagePrototype img ; arg_rw D2
  if i:x0=undefined
    return
  var Int ground := shunt i:type="submit" 0FF8080h 0E0E0E0h
  var Float u := c unit
  img fill i:x0+u i:y0+u i:x1-u i:y1-u 2*u addressof:ground
  c:font box i:value 0 0 c:scale (var Float x0) (var Float y
  c:font draw i:value img i:x0+2*u i:y0+2*u-y0 c:scale (addr


type D2Form
  inherit D2Box
  field (List Link:D2Box) content
  field Str action

D2Box maybe D2Form

function fill_form b form
  oarg_rw D2Box b ; arg_rw Str form
  if (entry_type addressof:b)=D2Input
    var Link:D2Input i :> addressof:b map D2Input
    if i:type<>"submit"
      form += replace "&"+i:name+"="+(http_encode i:value) "
  var Pointer:(List Link:D2Box) l :> b list
  if exists:l
    each bb l
      fill_form bb form

method i event e
  oarg_rw D2Input i ; arg_rw D2Event e
  if i:type="submit" and e:status:mouse_button_1_pressed
    if i:x0=defined and e:x>=i:x0 and e:x<=i:x1 and e:y>=i:y
      e url := ((addressof e:form_box) map D2Form) action
      e form := replace i:name+"="+(http_encode i:value) " "
      fill_form e:form_box e:form


method f configure attribute value options
  oarg_rw D2Form f ; arg Str attribute value options
  if attribute="action"
    f action := value

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

method f position c
  oarg_rw D2Form f ; arg_rw D2Context c
  f position_undefined c
    
method f draw img c
  oarg_rw D2Form f ; oarg_rw ImagePrototype img ; arg_rw D2C
  each b f:content
    b draw img c

method f event e
  oarg_rw D2Form f ; arg_rw D2Event e
  var Link:D2Box memo :> e form_box
  e form_box :> f
  each b f:content
    b event e
  e form_box :> memo

html_tags insert "form" true addressof:D2Form
html_tags insert "input" true addressof:D2Input
html_tags insert "select" true addressof:D2Select
html_tags insert "option" true addressof:D2Option
tag_event input
  if (query "input" "type")="submit"
    if key="press button1"
      url := full_url (query "input" "name")