#!/usr/local/bin/wish
# -*- tcl -*-
# demo of trf features

wm withdraw .
wm title    . "Trf demonstration"

package require Trf

set fdata {
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
g2cOICAyfnCBwMQJkhc4Tv4EQePEAxUELkSsWLFCBQgCAAI8+MBixYoVK1asWLFixYoVK6yw
wgorrNBBIYLAcccdd9xxxx134KHIIopcAgAVO8DAgxFnOEEBCyussMIKK6ywwgospKAAAAAA
gEAKIqywwgorrLDCCiussMIKLYggAgspJADAKXH4McckCVDyxhx4SEKEFVbIEAYJJCxiBA5N
HMHCCiussMIKK6ywAgseSAAAAAAAkEAKIqywwgorMGHFMsTwUossOshyTC+wMHMKL80444Us
xzQTBC6VPINML0X8IMQLRiyRwxJRdOHECiussMIKK6ywAgsfVAAAAAAIIIEHLKwAhAis0AIN
NP68SBNNM6tUsUgTR6zQQQNsaKIHAwDAkQcccRBDTDTRHOMFEkLQAYMMP5CwRA4zoEFECyus
sMIKKoBgAAAAFOCBCkykYYUstBADTTOrTFHFDkessMIKK6zQAREFiALHJAeY8oYcbxxSiA66
7BLNMcNwgQMM5DjhhBM7eAEDDieAskQOL4ShRAAWJKBDGmmkkQYQXPDyCzTINJOMDE2AAQ88
7Nyywi3stHMLCx9QoQUIK6wAhjzzlHMMMtQU8cgP8EBCRAtltHDEERpEkQMXTvRwwyI5QOAB
C1KIkAYQLZSRxjfHNBNNL8a8csw5VtTQwwossMDCCius0EMaVpyzS/400ESDzCpTTFGME05w
scIKK6ywwgorrLDCCiuskEICAFCgQgcegBBCCDro4AIINXQADDHA9NMPML9EY8wvxkATzS+8
8AINL7aEo8AqwPBiiywQPADBBBJIMIEHHnjgAQgffPABCCCAkIIKA1DQwgorrMACCyuswAIL
K6ywwgorrLDCCiussMIKK6ywwgorrLDCCiussMIKK6ywwgossLCCCh300IMPPwBCD3oQBCHA
YAhAIEIRjHCCBoCAAixYwQpWsIIVrGAFK2DBB74AABV0oAMqAAACUqCCFaxgBStYwQpWIIIP
hMADLviACFZwBDDcwAhGCMMRnCCGKZwAA/4wwMASblCEIBRBA2M4wAdEsIIVrGAFK1jBClaw
ghWsYAUsCEEC+OACFbBgBStQAQj64IY35OEOd7jDHfDgByfUoQg3EAIJcpADIeAAB0X4wwHU
8AERsGAFK2BBChQAAAFQoAMsWMEKVrCCFaxgBStYwQpWIAIRqKEFK1iBCoBAhjnI4Q53uMMd
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
}


label .logo -anchor ne -bd 2 -relief raised \
	-image [image create photo -data $fdata]

entry  .input  -relief sunken -border 2 -textvariable input ;#-width 70
frame  .output -relief raised -border 2
button .quit   -text Quit -command exit
button .demo   -text Demo -command startAnimation

pack   .logo   -side left -expand 0 -fill both
pack   .input  -side top  -expand 1 -fill x -ipadx 1m -ipady 1m
pack   .output -side top  -expand 1 -fill both
pack   .quit   -side left -expand 0 -padx 2m -pady 2m
pack   .demo   -side left -expand 0 -padx 2m -pady 2m

foreach {r m t} {
    0    rep Input:
    1    zip {uuencode Zip:}
    2    hex Hex:
    3    b64 Base64:
    4    md5 {hex'd MD5 Hash:}
} {
    label  .output.l$m -anchor w -text $t
    label  .output.x$m -anchor e -text "__"
    entry  .output.$m  -relief sunken -border 2 -width 100 -textvariable out$m

    grid   .output.l$m -row $r -column 1 -sticky swen
    grid   .output.x$m -row $r -column 2 -sticky swen
    grid   .output.$m  -row $r -column 3 -sticky swen -ipadx 1m -ipady 1m
}


proc startAnimation {} {
    global input
    set    input ""

    animate 300 \
	    "Hello world, this is a demonstration \
of the Trf extension to tcl, a package for transforming \
data in various ways, as can be seen below"
}


proc animate {delay text} {
    global input

    set first [string range $text 0 0]
    set text  [string range $text 1 end]

    if {$first == {}} {
	return
    }

    after $delay [list animate $delay $text]

    append input $first
}


proc trf {args} {
    global input outhex outmd5 outb64 outzip outrep

    # do various transformations on the current input
    # executed for every change
    #
    # convert to HEX
    # convert into Base64
    # compute MD5 message digest (display in HEX)
    # compress using ZIP (display in UUencoded form)

    set temp [zip -mode compress -level 9 $input]
    set mtmp [md5 $input]

    set outrep $input
    set outhex [hex      -mode encode $input]
    set outb64 [base64   -mode encode $input]
    set outmd5 [hex      -mode encode $mtmp]
    set outzip [uuencode -mode encode $temp]

    set i  [string length $outrep]
    set zi [string length $temp]

    # count length of real hash and zip, not the encoded forms

    .output.xrep configure -text $i
    .output.xhex configure -text [string length $outhex]
    .output.xb64 configure -text [string length $outb64]
    .output.xmd5 configure -text [string length $mtmp]
    .output.xzip configure -text $zi

    if {$zi < $i} {
	# indicate real compression in interface
	.output.xzip configure -bg seagreen
	.output.xrep configure -bg [.output.xhex cget -bg]
    } else {
	.output.xzip configure -bg [.output.xhex cget -bg]
	.output.xrep configure -bg coral
    }
}


proc out {args} {
    catch {trf $args} msg
    if {$msg != {}} {puts "error > $msg"}
}

trace variable input w trf




focus        .input 
wm deiconify .
