File: menu.tcl

package info (click to toggle)
tkdvi 0.3.1-1.2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny, sarge
  • size: 1,440 kB
  • ctags: 715
  • sloc: ansic: 5,833; sh: 2,955; tcl: 1,918; makefile: 106
file content (104 lines) | stat: -rw-r--r-- 2,799 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# menu.tcl -- Make TkDVI menu bars.
# Copyright  1999 Anselm Lingnau.
# See file COPYING for conditions on use and distribution.
# $Id: menu.tcl,v 1.3 2000/07/05 08:47:36 lingnau Exp $
#
# This code borrows heavily from Brent Welch's book. Thanks Brent!

package provide tkdvi::menu 1.0

namespace eval tkdvi::menu {
    proc menubar {name {top {}}} {
	variable Menu
	set m [menu $name]
	foreach b [option get $m menulist {}] {
	    if [catch {menu $m.$b}] {
		menu $m.$b -font fixed
	    }
	    set label [option get $m.$b text {}]
	    set ul [string first & $label]
	    regsub {&} $label {} label
	    set cmd [list $m add cascade -label $label -menu $m.$b]
	    if [catch $cmd t] {
		eval $cmd {-font fixed}
	    }
	    if {$ul >= 0} {
		$m entryconfigure end -underline $ul
	    }
	    define $m.$b $top
	}
    }
    proc define {menu {top {}}} {
	variable Menu
	foreach e [option get $menu entrylist {}] {
	    if {$e == "-"} {
		$menu add separator
		continue
	    }
	    set onv 1
	    set offv 0
	    set l [option get $menu l_$e {}]
	    set ul [string first & $l]
	    regsub {&} $l {} l
	    set c [option get $menu c_$e {}]
	    set v [option get $menu v_$e {}]
	    set onv [option get $menu onv_$e {}]
	    set offv [option get $menu offv_$e {}]
	    set accel [option get $menu a_$e {}]
	    regsub -all {%T} $c $top c
	    regsub -all {%M} $c $menu c
	    regsub -all {%T} $v $top v
	    regsub -all {%M} $v $menu v
	    switch -- [option get $menu t_$e {}] {
		check {
		    $menu add checkbutton -label $l -variable $v
		    if {$c != {}} {
			$menu entryconfigure end -command $c
		    }
		    if {$onv != {}} {
			$menu entryconfigure end -onvalue $onv
		    }
		    if {$offv != {}} {
			$menu entryconfigure end -offvalue $offv
		    }
		}
		radio {
		    $menu add radiobutton -label $l -variable $v -value $e
		}
		cascade {
		    set sub [option get $menu m_$e {}]
		    set post [option get $menu p_$e {}]
		    if {$post != {}} {
			regsub -all {%T} $post $top post
			regsub -all {%S} $post $menu.$sub post
			set submenu [menu $menu.$sub -postcommand $post]
			$menu add cascade -label $l -menu $submenu
		    } elseif {[string length $sub] != 0} {
			set submenu [menu $menu.$sub]
			regsub -all {%S} $c $submenu c
			$menu add cascade -label $l -command $c -menu $submenu
			define $submenu $top
		    }
		}
		default {
		    $menu add command -label $l -command $c
		}
	    }
	    if {$ul >= 0} {
		$menu entryconfigure end -underline $ul
	    }
	    if {[string length $accel] > 0} {
		$menu entryconfigure end -accelerator $accel
	    }
	    set Menu($l) [list $menu [$menu index end]]
	}
    }
    proc finditem {title} {
	variable Menu
	set result {}
	foreach i [array names Menu $title] {
	    set result [concat $result $Menu($i)]
	}
	return $result
    }
}