You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

399 lines
9.9 KiB

# -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
#
# $Id: Tix.tcl,v 1.14 2008/03/17 23:01:10 hobbs Exp $
#
# Tix.tcl --
#
# This file implements the Tix application context class
#
# 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.
#
tixClass tixAppContext {
-superclass {}
-classname TixAppContext
-method {
cget configure addbitmapdir filedialog getbitmap getimage
option platform resetoptions setbitmap initstyle
}
-flag {
-binding -debug -extracmdargs -filedialog -fontset -grabmode
-haspixmap -libdir -scheme -schemepriority -percentsubst
}
-readonly {
-haspixmap
}
-configspec {
{-binding TK}
{-debug 0}
{-extracmdargs 1}
{-filedialog ""}
{-fontset WmDefault}
{-grabmode global}
{-haspixmap 0}
{-libdir ""}
{-percentsubst 0}
{-scheme WmDefault}
{-schemepriority 21}
}
-alias {
}
}
proc tixAppContext:Constructor {w} {
upvar #0 $w data
global tix_priv tix_library tixOption
if {[info exists data(initialized)]} {
error "tixAppContext has already be initialized"
} else {
set data(initialized) 1
}
set data(et) [string equal $tix_library ""]
set data(image) 0
# These options were set when Tix was loaded
#
set data(-binding) $tix_priv(-binding)
set data(-debug) $tix_priv(-debug)
set data(-fontset) $tix_priv(-fontset)
set data(-scheme) $tix_priv(-scheme)
set data(-schemepriority) $tix_priv(-schemepriority)
if {![info exists tix_priv(isSafe)]} {
set data(-libdir) [file normalize $tix_library]
}
set tixOption(prioLevel) $tix_priv(-schemepriority)
# Compatibility stuff: the obsolete name courier_font has been changed to
# fixed_font
set tixOption(fixed_font) Courier
set tixOption(courier_font) $tixOption(fixed_font)
# Enable/Disable Intrinsics debugging
#
set tix_priv(debug) [string is true -strict $data(-debug)]
tixAppContext:BitmapInit $w
tixAppContext:FileDialogInit $w
# Clean up any error message generated by the above loop
set ::errorInfo ""
}
proc tixAppContext:initstyle {w} {
# Do the init stuff here that affects styles
upvar #0 $w data
global tix_priv
if {![info exists tix_priv(isSafe)]} {
tixAppContext:config-fontset $w $data(-fontset)
tixAppContext:config-scheme $w $data(-scheme)
}
tixAppContext:BitmapInit $w
tixAppContext:FileDialogInit $w
# Force the "." window to accept the new Tix options
#
set noconfig [list -class -colormap -container -menu -screen -use -visual]
set noconfig [lsort $noconfig]
foreach spec [. configure] {
set flag [lindex $spec 0]
if {[llength $spec] != 5
|| [lsearch -exact -sorted $noconfig $flag] != -1} {
continue
}
set name [lindex $spec 1]
set class [lindex $spec 2]
set value [option get . $name $class]
catch {. configure $flag $value}
}
}
#----------------------------------------------------------------------
# Configurations
#
#----------------------------------------------------------------------
proc tixAppContext:resetoptions {w scheme fontset {schemePrio ""}} {
upvar #0 $w data
if {! $data(et)} {
global tixOption
option clear
if {$schemePrio != ""} {
set tixOption(prioLevel) $schemePrio
}
tixAppContext:config-scheme $w $scheme
tixAppContext:config-fontset $w $fontset
}
}
proc tixAppContext:StartupError {args} {
bgerror [join $args "\n"]
}
proc tixAppContext:config-fontset {w value} {
upvar #0 $w data
global tix_priv tixOption
set data(-fontset) $value
#-----------------------------------
# Initialization of options database
#-----------------------------------
# Load the fontset
#
if {!$data(et)} {
set prefDir [file join $data(-libdir) pref]
set fontSetFile [file join $prefDir $data(-fontset).fsc]
if {[file exists $fontSetFile]} {
source $fontSetFile
tixPref:InitFontSet:$data(-fontset)
tixPref:SetFontSet:$data(-fontset)
} else {
tixAppContext:StartupError \
" Error: cannot use fontset \"$data(-fontset)\"" \
" Using default fontset "
tixSetDefaultFontset
}
} else {
if [catch {
tixPref:InitFontSet:$data(-fontset)
tixPref:SetFontSet:$data(-fontset)
}] {
# User chose non-existent fontset
#
tixAppContext:StartupError \
" Error: cannot use fontset \"$data(-fontset)\"" \
" Using default fontset "
tixSetDefaultFontset
}
}
}
proc tixAppContext:config-scheme {w value} {
upvar #0 $w data
global tix_priv
set data(-scheme) $value
# Load the color scheme
#
if {!$data(et)} {
set schemeName [file join [file join $data(-libdir) pref] \
$data(-scheme).csc]
if {[file exists $schemeName]} {
source $schemeName
tixPref:SetScheme-Color:$data(-scheme)
} else {
tixAppContext:StartupError \
" Error: cannot use color scheme \"$data(-scheme)\"" \
" Using default color scheme"
tixSetDefaultScheme-Color
}
} else {
if [catch {tixPref:SetScheme-Color:$data(-scheme)}] {
# User chose non-existent color scheme
#
tixAppContext:StartupError \
" Error: cannot use color scheme \"$data(-scheme)\"" \
" Using default color scheme"
tixSetDefaultScheme-Color
}
}
}
#----------------------------------------------------------------------
# Private methods
#
#----------------------------------------------------------------------
proc tixAppContext:BitmapInit {w} {
upvar #0 $w data
# See whether we have pixmap extension
#
set data(-haspixmap) true
# Dynamically set the bitmap directory
#
if {! $data(et)} {
set data(bitmapdirs) [list [file join $data(-libdir) bitmaps]]
} else {
set data(bitmapdirs) ""
}
}
proc tixAppContext:FileDialogInit {w} {
upvar #0 $w data
if {$data(-filedialog) == ""} {
set data(-filedialog) [option get . fileDialog FileDialog]
}
if {$data(-filedialog) == ""} {
set data(-filedialog) tixFileSelectDialog
}
}
#----------------------------------------------------------------------
# Public methods
#----------------------------------------------------------------------
proc tixAppContext:addbitmapdir {w bmpdir} {
upvar #0 $w data
if {[lsearch $data(bitmapdirs) $bmpdir] == -1} {
lappend data(bitmapdirs) $bmpdir
}
}
proc tixAppContext:getimage {w name} {
upvar #0 $w data
global tix_priv
if {[info exists data(img:$name)]} {
return $data(img:$name)
}
if {![info exists tix_priv(isSafe)]} {
foreach dir $data(bitmapdirs) {
foreach {ext type} {
.xpm pixmap
.gif photo
.ppm photo
.xbm bitmap
"" bitmap
} {
set file [file join $dir $name$ext]
if {[file exists $file]
&& ![catch {
set img tiximage$data(image)
set data(img:$name) \
[image create $type $img -file $file]
}]} {
incr data(image)
break
}
}
if {[info exists data(img:$name)]} {
return $data(img:$name)
}
}
}
if {![info exists data(img:$name)]} {
catch {
set img tiximage$data(image)
# This is for compiled-in images
set data(img:$name) [image create pixmap $img -id $name]
} err
if {[string match internal* $err]} {
error $err
} else {
incr data(image)
}
}
if {[info exists data(img:$name)]} {
return $data(img:$name)
} else {
error "image file \"$name\" cannot be found"
}
}
proc tixAppContext:getbitmap {w bitmapname} {
upvar #0 $w data
global tix_priv
if {[info exists data(bmp:$bitmapname)]} {
return $data(bmp:$bitmapname)
} else {
set ext [file extension $bitmapname]
if {$ext == ""} {
set ext .xbm
}
# This is the fallback value. If we can't find the bitmap in
# the bitmap directories, then use the name of the bitmap
# as the default value.
#
set data(bmp:$bitmapname) $bitmapname
if {[info exists tix_priv(isSafe)]} {
return $data(bmp:$bitmapname)
}
foreach dir $data(bitmapdirs) {
if {$ext eq ".xbm" &&
[file exists [file join $dir $bitmapname.xbm]]} {
set data(bmp:$bitmapname) \
@[file join $dir $bitmapname.xbm]
break
}
if {[file exists [file join $dir $bitmapname]]} {
set data(bmp:$bitmapname) @[file join $dir $bitmapname]
break
}
}
return $data(bmp:$bitmapname)
}
}
proc tixAppContext:filedialog {w {type tixFileSelectDialog}} {
upvar #0 $w data
if {$type == ""} {
set type $data(-filedialog)
}
if {![info exists data(filedialog,$type)]} {
set data(filedialog,$type) ""
}
if {$data(filedialog,$type) == "" || \
![winfo exists $data(filedialog,$type)]} {
set data(filedialog,$type) [$type .tixapp_filedialog_$type]
}
return $data(filedialog,$type)
}
proc tixAppContext:option {w action {option ""} {value ""}} {
global tixOption
if {$action eq "get"} {
if {$option == ""} {return [lsort [array names tixOption]]}
return $tixOption($option)
}
}
proc tixAppContext:platform {w} {
return $::tcl_platform(platform)
}
proc tixDebug {message {level "1"}} {
set debug [tix cget -debug]
if {![string is true -strict $debug]} { return }
if {$debug > 0} {
# use $level here
if {[catch {fconfigure stderr}]} {
# This will happen under PYTHONW.EXE or frozen Windows apps
proc tixDebug args {}
} else {
puts stderr $message
}
}
}
if {![llength [info commands toplevel]]} {
interp alias {} toplevel {} frame
}