+
+proc parser-control-failed-expected {w base emsg lno ei fulldesc newdata} {
+ set eb .err_$base
+
+ set line [lindex [split $ei "\n"] 0]
+ debug "parser-control-failed-expected: $w $base: $lno: $emsg\n $line"
+
+ parser-control-failed-core $w $base \
+ white red 1 \
+ "err: [string trim $emsg]: \"$line\"" \
+ "at line $lno: $emsg" \
+ $fulldesc $newdata
+
+ $eb.text.text tag add error $lno.0 $lno.end
+ $eb.text.text see $lno.0
+}
+proc parser-control-failed-unexpected {w base emsg ei} {
+ global errorInfo
+ parser-control-failed-core $w $base \
+ black yellow 1 \
+ $emsg $emsg "Details and stack trace:" $ei
+}
+
+proc reparse {base varname old fulldesc okshow noneshow parse ok} {
+ upvar #0 $varname var
+ manyset [errexpect-catch {
+ uplevel 1 $parse
+ if {[string length [string trim $var]]} {
+ parser-control-ok .ctrl.$base $base $okshow
+ } else {
+ parser-control-none .ctrl.$base $base $noneshow
+ }
+ }] failed emsg lno ei
+ if {$failed} {
+ parser-control-failed-expected .ctrl.$base $base \
+ $emsg $lno $ei $fulldesc $var
+ set var $old
+ uplevel 1 $parse
+ } else {
+ uplevel 1 $ok
+ }
+}
+
+#---------- main user interface ----------
+
+proc widgets-setup {} {
+ global canvas debug pirate ocean
+
+ frame .f -border 1 -relief groove
+ set canvas .f.c
+ canvas $canvas
+ pack $canvas -expand 1 -fill both
+ pack .f -expand 1 -fill both -side left
+
+ frame .ctrl
+ pack .ctrl -side right
+
+ debug "BBOX [$canvas bbox all]"
+
+ panner::canvas-scroll-bbox .f.c
+ panner::create .ctrl.pan .f.c 120 120 $debug
+
+ pack .ctrl.pan -side top -pady 10 -padx 5
+ frame .ctrl.zoom
+ pack .ctrl.zoom -side top
+
+ button .ctrl.zoom.out -text - -font {Courier 16} -command {zoom /2}
+ button .ctrl.zoom.in -text + -font {Courier 16} -command {zoom *2}
+ pack .ctrl.zoom.out .ctrl.zoom.in -side left
+
+ parser-control-create .ctrl.acquire \
+ acquire Acquire \
+ "Clipboard parsing error" \
+
+ pack .ctrl.acquire -side top -pady 2
+
+ parser-control-create .ctrl.notes \
+ notes "Reload notes" \
+ "Vessel notes loading report" \
+
+ pack .ctrl.notes -side top -pady 2
+
+ wm geometry . 1024x480
+ wm title . "where-vessels - $pirate on the $ocean ocean"
+}
+
+proc zoom {extail} {
+ global scale canvas
+ set nscale [expr "\$scale $extail"]
+ debug "ZOOM $scale $nscale"
+ if {$nscale < 1 || $nscale > 200} return
+ set scale $nscale
+ draw
+}
+
+proc invoke_acquire {} {
+ global clipboard errorInfo
+ set old $clipboard
+
+ if {[catch {
+ set clipboard [clipboard get]
+ } emsg]} {
+ parser-control-failed-unexpected .ctrl.acquire acquire \
+ $emsg "fetching clipboard:\n\n$errorInfo"
+ return
+ }
+
+ reparse acquire \
+ clipboard $old "Clipboard contents:" { acquired ok } { no vessels } {
+ parse-clipboard
+ } {
+ display-note-infos
+ }
+ draw
+}
+
+proc invoke_notes {} {
+ global notes_data errorInfo notes_loc
+ set old $notes_data
+
+ if {[catch {
+ load-notes
+ } emsg]} {
+ parser-control-failed-unexpected .ctrl.notes notes \
+ $emsg "loading $notes_loc:\n\n$errorInfo"
+ return
+ }
+
+ reparse notes \
+ notes_data $old "Vessel notes:" "loaded ok" { no notes } {
+ parse-notes
+ parse-clipboard
+ } {
+ display-note-infos
+ }
+ draw
+}
+
+#---------- main program ----------
+
+parseargs
+argdefaults
+httpclientsetup where-vessels
+load-chart
+widgets-setup
+
+set notes_data {}
+after idle invoke_notes