Patch title: Release 94 bulk changes
Abstract:
File: /pliant/graphic/browser/naive/lib/all.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/language/parser.pli"
module "/pliant/language/stream.pli"
module "/pliant/graphic/browser/naive/server.pli"
module "/pliant/storage/database.pli"
submodule "/pliant/graphic/color/rgb888.pli"


public

method c text txt
  arg_rw BrowserConnection c ; arg Str txt
  c:stream writeline "text "+string:txt

browser_tag_prototype fixed
  body

browser_tag_prototype center
  body

browser_tag_prototype bold
  body

browser_tag_prototype italic
  body

browser_tag_prototype font
  attr Str face
  attr Float scale
  body

if false
  method c eol
    arg_rw BrowserConnection c
    c:stream writeline "text [dq][lb]lf[rb][dq]"
else
  browser_tag_prototype eol
    void

browser_tag_prototype para
  body


browser_tag_prototype table
  body

browser_tag_prototype row
  body

browser_tag_prototype cell
  body


private


#-------------------------------------------------------------------------------


method c rectangle x0 y0 x1 y1 color
  arg_rw BrowserConnection c ; arg Float x0 y0 x1 y1 ; arg ColorRGB888 color
  c:stream writeline "t [dq]vrect[dq]"
  c:stream writeline "a [dq]x0[dq] "+(string string:x0)
  c:stream writeline "a [dq]y0[dq] "+(string string:y0)
  c:stream writeline "a [dq]x1[dq] "+(string string:x1)
  c:stream writeline "a [dq]y1[dq] "+(string string:y1)
  c:stream writeline "a [dq]color[dq] "+(string string:color)
  
export '. rectangle'


#-------------------------------------------------------------------------------


function ovar_init v t
  arg_rw Arrow v ; arg Type t
  if v=null
    v := entry_new t

meta ovar e
  var Pointer:Arrow c :> pliant_general_dictionary first "pliant function"
  if c=null or entry_type:c<>Function
    return
  var Link:Function current_function :> c map Function
  if e:size<2
    return
  var Pointer:Type t :> (e:0 constant Type) map Type
  if not exists:t
    return
  for (var Int i) 1 e:size-1
    if not e:i:is_pure_ident
      return
  for (var Int i) 1 e:size-1
    var Link:Argument v :> e local_variable e:i:ident linkto:t
    e add (instruction (the_function ovar_init Arrow Type) v (argument mapped_constant Type t))
  e set_result v access_read+access_write


constant to_index (the_function '. to string' Universal Str -> Str):generic_index

function to_string data options function -> string
  arg Universal data ; arg Str options ; arg Function function ; arg Str string
  indirect

method c input_data_tag label flags focus d
  arg_rw BrowserConnection c ; arg Str label ; arg Int flags ; arg CBool focus ; arg Data_ d
  if label<>""
    c:stream writeline "ipush"
    c:stream writeline "text "+string:label
    c:stream writeline "ipop"
  var Str id := generate_id
  c:stream writeline "t [dq]input[dq]"
  if (d:interface get d addressof:(var Str value) Str)=failure
    value := ""
  if value<>""
    c:stream writeline "a [dq]value[dq] "+string:value
  c:stream writeline "a [dq]id[dq] "+(string "set "+(string c:section_current)+" "+string:id)
  c:attached_sem request
  var Link:BrowserSection section :> (c:attached first c:section_current) map BrowserSection
  if not exists:section or (entry_type addressof:section)<>BrowserSection
    section :> new BrowserSection
    c:attached insert c:section_current true addressof:section
  var Link:BrowserVariable va :> new BrowserVariable
  va data_path := d path
  section:attached insert id true addressof:va
  c:attached_sem release
  if (flags .and. 1)<>0
    c:stream writeline "a [dq]multiline[dq] [dq]true[dq]"
  if (flags .and. 2)<>0
    c:stream writeline "a [dq]password[dq] [dq]true[dq]"
  if focus
    c:stream writeline "focus_set [dq][dq] [dq][dq] 0 [dq][dq]"

method c input_var_tag label flags focus v
  arg_rw BrowserConnection c ; arg Str label ; arg Int flags ; arg CBool focus ; arg Universal v
  if label<>""
    c:stream writeline "ipush"
    c:stream writeline "text "+string:label
    c:stream writeline "ipop"
  var Str id := generate_id
  c:stream writeline "t [dq]input[dq]"
  var Pointer:Function f :> (entry_type addressof:v) get_generic_method to_index
  var Str value := to_string v "db" f
  if value<>""
    c:stream writeline "a [dq]value[dq] "+string:value
  c:stream writeline "a [dq]id[dq] "+(string "set "+(string c:section_current)+" "+string:id)
  c:attached_sem request
  var Link:BrowserSection section :> (c:attached first c:section_current) map BrowserSection
  if not exists:section or (entry_type addressof:section)<>BrowserSection
    section :> new BrowserSection
    c:attached insert c:section_current true addressof:section
  var Link:BrowserVariable va :> new BrowserVariable
  va variable := addressof v
  section:attached insert id true addressof:va
  c:attached_sem release
  if (flags .and. 1)<>0
    c:stream writeline "a [dq]multiline[dq] [dq]true[dq]"
  if (flags .and. 2)<>0
    c:stream writeline "a [dq]password[dq] [dq]true[dq]"
  if focus
    c:stream writeline "focus_set [dq][dq] [dq][dq] 0 [dq][dq]"

meta '. input' e
  if e:size<3 or not (e:0 cast BrowserConnection) or not (e:1 cast Str)
    return
  e:2 compile ?
  var CBool data := e:2 is_data
  if not data
    var Link:Type type :> e:2:result:type:real_data_type
    if not (e:2 cast type)
      return
    var Pointer:Function function :> type get_generic_method to_index
    if addressof:function=null or addressof:function=addressof:(the_function '. to string' Universal Str -> Str)
      return
  var Int flags := 0
  var Link:Argument focus :> argument constant CBool false
  var Int i := 3
  while i<e:size
    if e:i:ident="multiline"
      flags := flags .or. 1
      i += 1
    eif e:i:ident="password"
      flags := flags .or. 2
      i += 1
    eif e:i:ident="focus" and i+1<e:size and ((e i+1) cast CBool)
      e suckup (e i+1)
      focus :> (e i+1) result
      i += 2
    else
      return
  e suckup e:0 ; e suckup e:1 ; e suckup e:2
  if data
    e add (instruction (the_function '. input_data_tag' BrowserConnection Str Int CBool Data_) e:0:result e:1:result (argument constant Int flags) focus e:2:result)
  else
    e add (instruction (the_function '. input_var_tag' BrowserConnection Str Int CBool Universal) e:0:result e:1:result (argument constant Int flags) focus e:2:result)
  e set_void_result


method c select_data_tag_open label focus d
  arg_rw BrowserConnection c ; arg Str label ; arg CBool focus ; arg Data_ d
  if label<>""
    c:stream writeline "ipush"
    c:stream writeline "text "+string:label
    c:stream writeline "ipop"
  var Str id := generate_id
  c:stream writeline "o [dq]select[dq]"
  if (d:interface get d addressof:(var Str value) Str)=failure
    value := ""
  if value<>""
    c:stream writeline "a [dq]value[dq] "+string:value
  c:stream writeline "a [dq]id[dq] "+(string "set "+(string c:section_current)+" "+string:id)
  c:attached_sem request
  var Link:BrowserSection section :> (c:attached first c:section_current) map BrowserSection
  if not exists:section or (entry_type addressof:section)<>BrowserSection
    section :> new BrowserSection
    c:attached insert c:section_current true addressof:section
  var Link:BrowserVariable va :> new BrowserVariable
  va data_path := d path
  section:attached insert id true addressof:va
  c:attached_sem release
  if focus
    c:stream writeline "focus_set [dq][dq] [dq][dq] 0 [dq][dq]"

method c select_var_tag_open label focus v
  arg_rw BrowserConnection c ; arg Str label ; arg CBool focus ; arg Universal v
  if label<>""
    c:stream writeline "ipush"
    c:stream writeline "text "+string:label
    c:stream writeline "ipop"
  var Str id := generate_id
  c:stream writeline "o [dq]select[dq]"
  var Pointer:Function f :> (entry_type addressof:v) get_generic_method to_index
  var Str value := to_string v "db" f
  if value<>""
    c:stream writeline "a [dq]value[dq] "+string:value
  c:stream writeline "a [dq]id[dq] "+(string "set "+(string c:section_current)+" "+string:id)
  c:attached_sem request
  var Link:BrowserSection section :> (c:attached first c:section_current) map BrowserSection
  if not exists:section or (entry_type addressof:section)<>BrowserSection
    section :> new BrowserSection
    c:attached insert c:section_current true addressof:section
  var Link:BrowserVariable va :> new BrowserVariable
  va variable := addressof v
  section:attached insert id true addressof:va
  c:attached_sem release
  if focus
    c:stream writeline "focus_set [dq][dq] [dq][dq] 0 [dq][dq]"

method c select_tag_close
  arg_rw BrowserConnection c
  c:stream writeline "c"
  
meta '. select' e
  if e:size<4 or not (e:0 cast BrowserConnection) or not (e:1 cast Str)
    return
  e:2 compile ?
  var CBool data := e:2 is_data
  if not data
    var Link:Type type :> e:2:result:type:real_data_type
    if not (e:2 cast type)
      return
    var Pointer:Function function :> type get_generic_method to_index
    if addressof:function=null or addressof:function=addressof:(the_function '. to string' Universal Str -> Str)
      return
  var Link:Argument focus :> argument constant CBool false
  var Int i := 3
  while i<e:size-1
    if e:i:ident="focus" and i+1<e:size and ((e i+1) cast CBool)
      e suckup (e i+1)
      focus :> (e i+1) result
      i += 2
    else
      return
  (e e:size-1) compile ?
  e suckup e:0 ; e suckup e:1 ; e suckup e:2
  if data
    e add (instruction (the_function '. select_data_tag_open' BrowserConnection Str CBool Data_) e:0:result e:1:result focus e:2:result)
  else
    e add (instruction (the_function '. select_var_tag_open' BrowserConnection Str CBool Universal) e:0:result e:1:result focus e:2:result)
  e suckup (e e:size-1)
  e add (instruction (the_function '. select_tag_close' BrowserConnection) e:0:result)
  e set_void_result


method c option label value
  arg_rw BrowserConnection c ; arg Str label value
  c:stream writeline "t [dq]option[dq]"
  c:stream writeline "a [dq]label[dq] "+string:label
  c:stream writeline "a [dq]value[dq] "+string:value
  

method c button_tag label key da active
  arg_rw BrowserConnection c ; arg Str label ; arg Str key ; arg DelayedAction da ; arg CBool active
  var Str id := generate_id
  c:stream writeline "t [dq]button[dq]"
  c:stream writeline "a [dq]label[dq] "+string:label
  if key<>""
    c:stream writeline "a [dq]key[dq] "+string:key
    c:stream writeline "key "+string:key+" [dq][dq]"
  c:stream writeline "a [dq]id[dq] "+(string "run "+(string c:section_current)+" "+string:id)
  if active
    c:attached_sem request
    var Link:BrowserSection section :> (c:attached first c:section_current) map BrowserSection
    if not exists:section or (entry_type addressof:section)<>BrowserSection
      section :> new BrowserSection
      c:attached insert c:section_current true addressof:section
    var Link:DelayedAction lda :> new DelayedAction ; lda := da
    section:attached insert id true addressof:lda
    if key<>""
      if (c:attached first "key "+key)<>null
        c:attached first "key "+key := addressof lda
      else
        c:attached insert "key "+key true addressof:lda      
    c:attached_sem release

method c set_attribute attr value
  arg_rw BrowserConnection c ; arg Str attr value
  c:stream writeline "a "+string:attr+" "+string:value

method c set_bool_attribute attr value
  arg_rw BrowserConnection c ; arg Str attr ; arg CBool value
  c:stream writeline "a "+string:attr+" [dq]"+(shunt value "true" "false")+"[dq]"

meta '. button' e
  if e:size<3 or e:size%2<>1 or not (e:0 cast BrowserConnection) or not (e:1 cast Str)
    return
  var Link:Argument active :> argument constant CBool true
  var Link:Argument key :> argument constant Str ""
  for (var Int i) 2 e:size-2 step 2
    if not e:i:is_pure_ident or not ((e i+1) cast Str) and not ((e i+1) cast CBool)
      return
    if e:i:ident="active"
      e suckup (e i+1)
      active :> (e i+1) result
    if e:i:ident="key" and ((e i+1) cast Str)
      e suckup (e i+1)
      key :> (e i+1) result
  var Link:List expressions :> new List
  expressions append addressof:(e e:size-1)
  var Link:List byaddress :> new List
  byaddress append addressof:(new Ident (cast "connection" Ident))
  var Pointer:Module module :> e module
  var Address mark := module mark
  var List functions ; var Link:Type type
  e freeze expressions byaddress functions type
  module rewind mark
  e suckup e:0
  e suckup e:1
  e add (instruction (the_function '. button_tag' BrowserConnection Str Str DelayedAction CBool) e:0:result e:1:result key (e e:size-1):result active)
  for (var Int i) 2 e:size-2 step 2
    if (e:(i+1) cast Str)
      e suckup (e i+1)
      e add (instruction (the_function '. set_attribute' BrowserConnection Str Str) e:0:result (argument constant Str e:i:ident) e:(i+1):result)
    eif (e:(i+1) cast CBool)
      if e:i:ident<>"active"
        e suckup (e i+1)
      e add (instruction (the_function '. set_bool_attribute' BrowserConnection Str CBool) e:0:result (argument constant Str e:i:ident) e:(i+1):result)
  e set_void_result

export ovar '. input' '. select' '. option' '. button'


#-------------------------------------------------------------------------------


dual_keyword hook 1 1000 event 1 1

method c hook_open da
  arg_rw BrowserConnection c ; arg DelayedAction da
  var Str id := generate_id
  c:stream writeline "o [dq]hook[dq]"
  c:stream writeline "a [dq]id[dq] "+(string "run "+(string c:section_current)+" "+string:id)
  c:attached_sem request
  var Link:BrowserSection section :> (c:attached first c:section_current) map BrowserSection
  if not exists:section or (entry_type addressof:section)<>BrowserSection
    section :> new BrowserSection
    c:attached insert c:section_current true addressof:section
  var Link:DelayedAction lda :> new DelayedAction ; lda := da
  section:attached insert id true addressof:lda
  c:attached_sem release

method c hook_close
  arg_rw BrowserConnection c
  c:stream writeline "c"

meta '. hook' e
  if e:size<4 or not (e:0 cast BrowserConnection) or (e e:size-2):ident<>"event"
    return
  var Int i := 1
  while i<e:size-3
    return
  (e e:size-3) compile ?
  var Link:List expressions :> new List
  expressions append addressof:(e e:size-1)
  var Link:List byaddress :> new List
  byaddress append addressof:(new Ident (cast "connection" Ident))
  var Pointer:Module module :> e module
  var Address mark := module mark
  var List functions ; var Link:Type type
  e freeze expressions byaddress functions type
  module rewind mark
  e suckup e:0
  e add (instruction (the_function '. hook_open' BrowserConnection DelayedAction) e:0:result (e e:size-1):result)
  for (var Int i) 1 e:size-4 step 2
    e suckup (e i+1)
    e add (instruction (the_function '. set_attribute' BrowserConnection Str Str) e:0:result (argument constant Str e:i:ident) (e i+1):result)
  e suckup (e e:size-3)
  e add (instruction (the_function '. hook_close' BrowserConnection) e:0:result)
  e set_void_result

export '. hook'


#-------------------------------------------------------------------------------


method c browser_thread_start da
  arg_rw BrowserConnection c ; arg DelayedAction da
  var Str id := generate_id
  var BrowserPendingThread p
  p timestamp := datetime
  p action := da
  p attached_sem :> c attached_sem
  p attached :> c attached
  browser_thread_sem request
  browser_thread_dict insert id p
  browser_thread_sem release
  c:stream writeline "thread "+string:id
  
meta '. browser_thread' e
  if e:size<>2 or not (e:0 cast BrowserConnection)
    return
  var Link:List expressions :> new List
  expressions append (addressof e:1)
  var Link:List byaddress :> new List
  byaddress append addressof:(new Ident (cast "connection" Ident))
  var Pointer:Module module :> e module
  var Address mark := module mark
  var List functions ; var Link:Type type
  e freeze expressions byaddress functions type
  module rewind mark
  e suckup e:0
  e add (instruction (the_function '. browser_thread_start' BrowserConnection DelayedAction) e:0:result e:1:result)
  e set_void_result

export '. browser_thread'


#-------------------------------------------------------------------------------


method c window_open w
  arg_rw BrowserConnection c ; arg Str w
  c:stream writeline "push"
  c:stream writeline "i [dq]"+w+"[dq]"
  c:stream writeline "o [dq]section[dq]"
  c:stream writeline "key_cleanup"

method c window_close w
  arg_rw BrowserConnection c ; arg Str w
  c:stream writeline "c"
  c:stream writeline "pop"
  c:stream writeline "window_root [dq]"+w+"[dq] [dq]"+w+"[dq]"

meta '. window' e
  if e:size<>3 or not (e:0 cast BrowserConnection) or not e:1:is_pure_ident
    return
  e suckup e:0
  e add (instruction (the_function '. window_open' BrowserConnection Str) e:0:result (argument constant Str e:1:ident))
  (e e:size-1) compile ?
  e suckup (e e:size-1)
  e add (instruction (the_function '. window_close' BrowserConnection Str) e:0:result (argument constant Str e:1:ident))
  e set_void_result


method c window_refresh w level
  arg_rw BrowserConnection c ; arg Str w ; arg Int level
  c:stream writeline "window_refresh "+string:w+" "+string:level

meta '. window_refresh' e
  if e:size<>2 or not (e:0 cast BrowserConnection) or not e:1:is_pure_ident
    return
  e suckup e:0
  e add (instruction (the_function '. window_refresh' BrowserConnection Str Int) e:0:result (argument constant Str e:1:ident) (argument constant Int 2))
  e set_void_result


method c section_tag_open id memo
  arg_rw BrowserConnection c ; arg Str id ; arg_w Str memo
  c:stream writeline "i "+string:id
  c:stream writeline "o [dq]section[dq]"
  memo := c section_current
  c section_current := id
  

method c section_tag_close memo
  arg_rw BrowserConnection c ; arg Str memo
  c section_current := memo
  c:stream writeline "c"

function execute1 a f
  arg Address a ; arg Function f
  indirect

method c section_tag id da
  arg_rw BrowserConnection c ; arg Str id ; arg DelayedAction da
  c:attached_sem request
  var Link:BrowserSection section :> (c:attached first id) map BrowserSection
  if not exists:section or (entry_type addressof:section)<>BrowserSection
    section :> new BrowserSection
    c:attached insert id true addressof:section
  section refresh := da
  section attached := var Dictionary empty_attached
  c:attached_sem release
  c:stream writeline "i "+string:id
  c:stream writeline "o [dq]section[dq]"
  c:stream writeline "key_cleanup"
  var Str memo := c section_current
  c section_current := id
  var Pointer:Type t :> entry_type da:parameter
  for (var Int i) 0 t:nb_fields-1
    if (t field i):name="connection"
      (da:parameter translate Byte (t field i):offset) map Address := addressof c
  execute1 da:parameter da:function
  c section_current := memo
  c:stream writeline "c"

meta '. section' e
  if e:size<3 or not (e:0 cast BrowserConnection) or not (e:1 cast Str)
    return
  var CBool dynamic := false
  var Int i := 2
  while i<e:size-1
    if e:i:ident="dynamic"
      dynamic := true
      i += 1
    else
      return
  if dynamic
    var Link:List expressions :> new List
    expressions append addressof:(e e:size-1)
    var Link:List byaddress :> new List
    byaddress append addressof:(new Ident (cast "connection" Ident))
    var Pointer:Module module :> e module
    var Address mark := module mark
    var List functions ; var Link:Type type
    e freeze expressions byaddress functions type
    module rewind mark
    e suckup e:0
    e suckup e:1
    e add (instruction (the_function '. section_tag' BrowserConnection Str DelayedAction) e:0:result e:1:result (e e:size-1):result)
  else
    (e e:size-1) compile ?
    e suckup e:0 ; e suckup e:1
    var Link:Argument memo :> argument local Str
    e add (instruction (the_function '. section_tag_open' BrowserConnection Str Str) e:0:result e:1:result memo)
    e suckup (e e:size-1)
    e add (instruction (the_function '. section_tag_close' BrowserConnection Str) e:0:result memo)
  e set_void_result


method c section_replay id
  arg_rw BrowserConnection c ; arg Str id
  c:attached_sem request
  var Link:BrowserSection section :> (c:attached first id) map BrowserSection
  if exists:section and (entry_type addressof:section)=BrowserSection
    section attached := var Dictionary empty_attached
    var DelayedAction action := section refresh
    c:attached_sem release
    c:stream writeline "window_refresh2 "+string:id+" 2"
    c:stream writeline "push"
    c:stream writeline "i "+string:id
    c:stream writeline "o [dq]section[dq]"
    var Str memo := c section_current
    c section_current := id
    var Pointer:Type t :> entry_type action:parameter
    for (var Int i) 0 t:nb_fields-1
      if (t field i):name="connection"
        (action:parameter translate Byte (t field i):offset) map Address := addressof c
    execute1 action:parameter action:function
    c section_current := memo
    c:stream writeline "c"
    c:stream writeline "pop"
  else
    c:attached_sem release


method c section_overwrite_open id
  arg_rw BrowserConnection c ; arg Str id
  c:stream writeline "window_refresh2 "+string:id+" 2"
  c:stream writeline "push"
  c:stream writeline "i "+string:id
  c:stream writeline "o [dq]section[dq]"

method c section_overwrite_close
  arg_rw BrowserConnection c
  c:stream writeline "c"
  c:stream writeline "pop"

meta '. section_overwrite' e
  if e:size<>3 or not (e:0 cast BrowserConnection) or not (e:1 cast Str)
    return
  e:2 compile ?
  e suckup e:0 ; e suckup e:1
  e add (instruction (the_function '. section_overwrite_open' BrowserConnection Str) e:0:result e:1:result)
  e suckup e:2
  e add (instruction (the_function '. section_overwrite_close' BrowserConnection) e:0:result)
  e set_void_result


method c set_next_node_id id
  arg_rw BrowserConnection c ; arg Str id
  c:stream writeline "i "+string:id

meta '. node' e
  if e:size<>3 or not (e:0 cast BrowserConnection) or not (e:1 cast Str)
    return
  e:2 compile ?
  e suckup e:0
  e suckup e:1
  e add (instruction (the_function '. set_next_node_id' BrowserConnection Str) e:0:result e:1:result)
  e suckup e:2
  e set_void_result


method c node_overwrite_open id
  arg_rw BrowserConnection c ; arg Str id
  c:stream writeline "push"
  c:stream writeline "i "+string:id

method c node_overwrite_close
  arg_rw BrowserConnection c
  c:stream writeline "pop"

meta '. node_overwrite' e
  if e:size<>3 or not (e:0 cast BrowserConnection) or not (e:1 cast Str)
    return
  e:2 compile ?
  e suckup e:0 ; e suckup e:1
  e add (instruction (the_function '. node_overwrite_open' BrowserConnection Str) e:0:result e:1:result)
  e suckup e:2
  e add (instruction (the_function '. node_overwrite_close' BrowserConnection) e:0:result)
  e set_void_result


method c node_attribute id attr value
  arg_rw BrowserConnection c ; arg Str id attr value
  c:stream writeline "attr "+string:id+" "+string:attr+" "+string:value


method c node_draw id
  arg_rw BrowserConnection c ; arg Str id
  c:stream writeline "node_draw "+string:id


method c node_refresh id mm_x mm_y options
  arg_rw BrowserConnection c ; arg Str id ; arg Float mm_x mm_y ; arg Str options
  c:stream writeline "node_refresh "+string:id+" "+string:mm_x+" "+string:mm_y+" "+options


method c node_tag id tag
  arg_rw BrowserConnection c ; arg Str id tag
  c:stream writeline "tag "+string:id+" "+string:tag


method c node_stick id where ref
  arg_rw BrowserConnection c ; arg Str id where ref
  c:stream writeline "stick "+string:id+" "+where+" "+string:ref

meta '. node_stick' e
  if e:size=4 and (e:0 cast BrowserConnection) and (e:1 cast Str) and e:2:is_pure_ident and (e:3 cast Str)
    var Str where := e:2 ident
    if where="before" or where="after" or where="head" or where="tail"
      e suckup e:0 ; e suckup e:1 ; e suckup e:3
      e add (instruction (the_function '. node_stick' BrowserConnection Str Str Str) e:0:result e:1:result (argument constant Str e:2:ident) e:3:result)
      e set_void_result
      

method c node_unstick id 
  arg_rw BrowserConnection c ; arg Str id
  c:stream writeline "unstick "+string:id


method c node_drop id 
  arg_rw BrowserConnection c ; arg Str id
  c:stream writeline "drop "+string:id


method c display
  arg_rw BrowserConnection c
  c:stream writeline "display"
  c:stream flush anytime


export '. window' '. window_refresh'
export '. section' '. section_replay' '. section_overwrite'
export '. node' '. node_overwrite' '. node_attribute' '. node_draw' '. node_refresh'
export '. node_tag' '. node_stick' '. node_unstick' '. node_drop'
export '. display'


#-------------------------------------------------------------------------------


method c supervisor_show
  arg_rw BrowserConnection c
  c:stream writeline "supervisor_show"

method c supervisor_hide
  arg_rw BrowserConnection c
  c:stream writeline "supervisor_hide"

method c supervisor_login user password
  arg_rw BrowserConnection c ; arg Str user password
  c:stream writeline "supervisor_login "+string:user+" "+string:password 

export '. supervisor_show' '. supervisor_hide' '. supervisor_login'


#-------------------------------------------------------------------------------


method c url_set url
  arg_rw BrowserConnection c ; arg Str url
  if (url parse (var Str path) (var Str options))
    c:stream writeline "url_set "+string:path+" "+string:options
  else
    c:stream writeline "url_set "+string:url+" [dq][dq]"

method c url_call url
  arg_rw BrowserConnection c ; arg Str url
  if not (url parse (var Str path) (var Str options))
    path := url ; options := ""
  if not (path eparse any "://" any) and (c:url_path eparse any:(var Str protocol) "://" any:(var Str server) "/" any)
    path := protocol+"://"+server+path    
  c:stream writeline "url_call "+string:path+" "+string:options

method c url_return
  arg_rw BrowserConnection c
  c:stream writeline "url_return"

export '. url_set' '. url_call' '. url_return'


method c focus_set hook id index options
  arg_rw BrowserConnection c ; arg Str hook id ; arg Int index ; arg Str options
  c:stream writeline "focus_set "+string:hook+" "+string:id+" "+string:index+" "+string:options

method c focus_get hook id index options
  arg_rw BrowserConnection c ; arg_w Str hook id ; arg_w Int index ; arg_w Str options
  hook := "" ; id := "" ; index := undefined ; options := ""
  c:stream writeline "focus_get"
  c:stream:readline parse hook id index options

method c focus_save
  arg_rw BrowserConnection c
  c:stream writeline "focus_save"

export '. focus_set' '. focus_get' '. focus_save'