python-2.5.2/win32/tcl/tix8.4/Event.tcl
changeset 0 ae805ac0140d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python-2.5.2/win32/tcl/tix8.4/Event.tcl	Fri Apr 03 17:19:34 2009 +0100
@@ -0,0 +1,217 @@
+# -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
+#
+#	$Id: Event.tcl,v 1.6 2004/04/09 21:37:01 hobbs Exp $
+#
+# Event.tcl --
+#
+#	Handles the event bindings of the -command and -browsecmd options
+#	(and various of others such as -validatecmd).
+#
+# Copyright (c) 1993-1999 Ioi Kim Lam.
+# Copyright (c) 2000-2001 Tix Project Group.
+# Copyright (c) 2004 ActiveState
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+
+#----------------------------------------------------------------------
+# Evaluate high-level bindings (-command, -browsecmd, etc):
+# with % subsitution or without (compatibility mode)
+#
+#
+# BUG : if a -command is intercepted by a hook, the hook must use
+#       the same record name as the issuer of the -command. For the time
+#	being, you must use the name "bind" as the record name!!!!!
+#
+#----------------------------------------------------------------------
+
+namespace eval ::tix {
+    variable event_flags ""
+    set evs [list % \# a b c d f h k m o p s t w x y A B E K N R S T W X Y]
+    foreach ev $evs {
+	lappend event_flags "%$ev"
+    }
+
+    # This is a "name stack" for storing the "bind" structures
+    #
+    # The bottom of the event stack is usually a raw event (generated by
+    # tixBind) but it may also be a programatically triggered (caused by
+    # tixEvalCmdBinding)
+    variable EVENT
+    set EVENT(nameStack)	""
+    set EVENT(stackLevel)	0
+}
+
+proc tixBind {tag event action} {
+    set cmd [linsert $::tix::event_flags 0 _tixRecordFlags $event]
+    append cmd "; $action; _tixDeleteFlags;"
+
+    bind $tag $event $cmd
+}
+
+proc tixPushEventStack {} {
+    variable ::tix::EVENT
+
+    set lastEvent [lindex $EVENT(nameStack) 0]
+    incr EVENT(stackLevel)
+    set thisEvent ::tix::_event$EVENT(stackLevel)
+
+    set EVENT(nameStack) [list $thisEvent $EVENT(nameStack)]
+
+    if {$lastEvent == ""} {
+	upvar #0 $thisEvent this
+	set this(type) <Application>
+    } else {
+	upvar #0 $lastEvent last
+	upvar #0 $thisEvent this
+
+	foreach name [array names last] {
+	    set this($name) $last($name)
+	}
+    }
+
+    return $thisEvent
+}
+
+proc tixPopEventStack {varName} {
+    variable ::tix::EVENT
+
+    if {$varName ne [lindex $EVENT(nameStack) 0]} {
+	error "unmatched tixPushEventStack and tixPopEventStack calls"
+    }
+    incr EVENT(stackLevel) -1
+    set EVENT(nameStack) [lindex $EVENT(nameStack) 1]
+    global $varName
+    unset $varName
+}
+
+
+# Events triggered by tixBind
+#
+proc _tixRecordFlags [concat event $::tix::event_flags] {
+    set thisName [tixPushEventStack]; upvar #0 $thisName this
+
+    set this(type) $event
+    foreach f $::tix::event_flags {
+	set this($f) [set $f]
+    }
+}
+
+proc _tixDeleteFlags {} {
+    variable ::tix::EVENT
+
+    tixPopEventStack [lindex $EVENT(nameStack) 0]
+}
+
+# programatically trigged events
+#
+proc tixEvalCmdBinding {w cmd {subst ""} args} {
+    global tixPriv tix
+    variable ::tix::EVENT
+
+    set thisName [tixPushEventStack]; upvar #0 $thisName this
+
+    if {$subst != ""} {
+	upvar $subst bind
+
+	if {[info exists bind(specs)]} {
+	    foreach spec $bind(specs) {
+		set this($spec) $bind($spec)
+	    }
+	}
+	if {[info exists bind(type)]} {
+	    set this(type) $bind(type)
+	}
+    }
+
+    if {[catch {
+	if {![info exists tix(-extracmdargs)]
+	    || [string is true -strict $tix(-extracmdargs)]} {
+	    # Compatibility mode
+	    set ret [uplevel \#0 $cmd $args]
+	} else {
+	    set ret [uplevel 1 $cmd]
+	}
+    } error]} {
+	if {[catch {tixCmdErrorHandler $error} error]} {
+	    # double fault: just print out 
+	    tixBuiltInCmdErrorHandler $error
+	}
+	tixPopEventStack $thisName
+	return ""
+    } else {
+	tixPopEventStack $thisName
+
+	return $ret
+    }
+}
+
+proc tixEvent {option args} {
+    global tixPriv
+    variable ::tix::EVENT
+    set varName [lindex $EVENT(nameStack) 0]
+
+    if {$varName == ""} {
+	error "tixEvent called when no event is being processed"
+    } else {
+	upvar #0 $varName event
+    }
+
+    switch -exact -- $option {
+	type {
+	    return $event(type)
+	}
+	value {
+	    if {[info exists event(%V)]} {
+		return $event(%V)
+	    } else {
+		return ""
+	    }
+	}
+	flag {
+	    set f %[lindex $args 0]
+	    if {[info exists event($f)]} {
+		return $event($f)
+	    }
+	    error "The flag \"[lindex $args 0]\" does not exist"
+	}
+	match {
+	    return [string match [lindex $args 0] $event(type)]
+	}
+	default {
+	    error "unknown option \"$option\""
+	}
+    }
+}
+
+# tixBuiltInCmdErrorHandler --
+#
+#	Default method to report command handler errors. This procedure is
+#	also called if double-fault happens (command handler causes error,
+#	then tixCmdErrorHandler causes error).
+#
+proc tixBuiltInCmdErrorHandler {errorMsg} {
+    global errorInfo tcl_platform
+    if {![info exists errorInfo]} {
+	set errorInfo "???"
+    }
+    if {$tcl_platform(platform) eq "windows"} {
+	bgerror "Tix Error: $errorMsg"
+    } else {
+	puts "Error:\n $errorMsg\n$errorInfo"
+    }
+}
+
+# tixCmdErrorHandler --
+#
+#	You can redefine this command to handle the errors that occur
+#	in the command handlers. See the programmer's documentation
+#	for details
+#
+if {![llength [info commands tixCmdErrorHandler]]} {
+    proc tixCmdErrorHandler {errorMsg} {
+	tixBuiltInCmdErrorHandler $errorMsg
+    }
+}
+