WippleWobble - A Mini Web Browser (for Windows)

GPS: RS inspired me with his COM on! - a tiny web browser code. I decided to extend the idea and make it more general.


 bind . <Escape> {
        exec [file nativename [info nameofexecutable]] $argv0 &
        exit
 }
 proc forceFocus {win} {
        catch {focus -force $win}
 }
 proc setOptions {} {
        option add *Button.pady 0
        option add *Button.padx 1
        option add *Button.borderWidth 1
 }
 proc loadLocation {win} {
        upvar #0 _${win}ar ar

        if {[catch {$ar(htm) navigate $ar(location)} res]} {
                return -code error $res        
        }
 }
 proc linkchanged {win id page} {
        upvar #0 _${win}ar ar

        $win.status config -text $page
 }
 proc buildInterface {win location} {
        upvar #0 _${win}ar ar

        #The default for new instances
        set ar(location) $location

        frame $win -class WippleWobble
        pack [frame $win.controls] -fill x

        pack [button $win.controls.backward -text "<<" \
                -command "\[set ::_${win}ar(htm)] goBack"] -side left
        pack [button $win.controls.forward -text ">>" \
                -command "\[set ::_${win}ar(htm)] goForward"] -side left

        pack [button $win.controls.stop -text "Stop" \
                -command "\[set ::_${win}ar(htm)] stop" -bg firebrick] -side left

        pack [entry $win.controls.e \
                -textvariable ::_${win}ar(location)] \
                -side left -fill x -expand 1

        bind $win.controls.e <Return> [list loadLocation $win]


        pack [button $win.controls.go -text Go \
                -command [list loadLocation $win] -bg darkgreen -fg white] -side left

        set htm [optcl::new -window $win.htm Shell.Explorer.2]
        pack $win.htm -fill both -side top -expand 1
        set ar(htm) $htm

        pack [label $win.status] -side bottom -anchor w

        optcl::bind $htm StatusTextChange [list linkchanged $win]

        $htm navigate $ar(location)        

        return $win
 } 

 proc debug {tok} {
        upvar #0 _${tok}ar ar

        console show
        tlview::viewtype [ optcl::class $ar(htm)]
 }

 proc main {argc argv} {
        wm title . "WippleWobble"
        package require optcl

        setOptions
        pack [frame .master] -fill both -expand 1

        #pass an empty parent for the . window
        pack [buildInterface .master.1 "www.google.com"] -side top -fill both -expand 1
        pack [buildInterface .master.2 "www.yahoo.com"] -side bottom -fill both -expand 1
        pack [button .debug -text Debug -command {debug .master.1}] -side bottom


        bind all <Enter> {forceFocus %W}
        bind all <ButtonPress-1> {forceFocus %W}
 }
 main $::argc $::argv