| 1 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 2 | # FILE : prjmenu.tcl |
|---|
| 3 | # PURPOSE : This file try to make easy the task of creating menus. Inspired in |
|---|
| 4 | # http://mini.net/tcl/827.html |
|---|
| 5 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | namespace eval prjmenu { |
|---|
| 9 | variable menus |
|---|
| 10 | } |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 14 | proc prjmenu::create { w mdesc } { |
|---|
| 15 | # |
|---|
| 16 | # PURPOSE: |
|---|
| 17 | # |
|---|
| 18 | # PARAMETERS: |
|---|
| 19 | # w: |
|---|
| 20 | # mdesc: |
|---|
| 21 | # |
|---|
| 22 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 23 | |
|---|
| 24 | variable menus |
|---|
| 25 | |
|---|
| 26 | |
|---|
| 27 | if {$w=="."} {set w2 ""} else {set w2 $w} |
|---|
| 28 | # se comprueba que no exista el menu |
|---|
| 29 | if { [info exists $w2.menubar] } { |
|---|
| 30 | } else { |
|---|
| 31 | frame $w2.menubar -bd 0 |
|---|
| 32 | pack $w2.menubar -side top -fill x -expand no |
|---|
| 33 | set menus($w) [menu $w2.menubar.menu -tearoff 0] |
|---|
| 34 | $w config -menu $w2.menubar.menu |
|---|
| 35 | foreach item $mdesc { |
|---|
| 36 | prjmenu::add $w "" $item |
|---|
| 37 | } |
|---|
| 38 | } |
|---|
| 39 | |
|---|
| 40 | if {0} { |
|---|
| 41 | if {$w=="."} {set w2 ""} else {set w2 $w} |
|---|
| 42 | # se comprueba que no exista el menu |
|---|
| 43 | if { [info exists $w2.menubar] } { |
|---|
| 44 | } else { |
|---|
| 45 | set menus($w) [menu $w2.menubar -tearoff 0] |
|---|
| 46 | $w config -menu $w2.menubar |
|---|
| 47 | foreach item $mdesc { |
|---|
| 48 | prjmenu::add $w "" $item |
|---|
| 49 | } |
|---|
| 50 | } |
|---|
| 51 | } |
|---|
| 52 | # comentado todo |
|---|
| 53 | # variable menus |
|---|
| 54 | |
|---|
| 55 | # if {$w=="."} {set w2 ""} else {set w2 $w} |
|---|
| 56 | # set menus($w) [menu $w2.menubar -tearoff 0] |
|---|
| 57 | # $w config -menu $w2.menubar |
|---|
| 58 | # foreach item $mdesc { |
|---|
| 59 | # prjmenu::add $w "" $item |
|---|
| 60 | # } |
|---|
| 61 | } |
|---|
| 62 | |
|---|
| 63 | |
|---|
| 64 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 65 | proc prjmenu::add { w m mdesc } { |
|---|
| 66 | # |
|---|
| 67 | # PURPOSE: |
|---|
| 68 | # |
|---|
| 69 | # PARAMETERS: |
|---|
| 70 | # w: |
|---|
| 71 | # m: |
|---|
| 72 | # mdesc: |
|---|
| 73 | # |
|---|
| 74 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 75 | variable menus |
|---|
| 76 | |
|---|
| 77 | if { $m == "" } { |
|---|
| 78 | set top $menus($w) |
|---|
| 79 | } else { |
|---|
| 80 | set top $menus($w,$m) |
|---|
| 81 | } |
|---|
| 82 | set _label [lindex $mdesc 0] |
|---|
| 83 | if { [string equal $_label "--"] } { |
|---|
| 84 | $top add separator |
|---|
| 85 | return |
|---|
| 86 | } |
|---|
| 87 | |
|---|
| 88 | # look for underline character position |
|---|
| 89 | set idxu -1 |
|---|
| 90 | set cur 0 |
|---|
| 91 | set escape 0 |
|---|
| 92 | set label "" |
|---|
| 93 | foreach ch [split $_label ""] { |
|---|
| 94 | if { $ch == "&" } { |
|---|
| 95 | if { $escape } { |
|---|
| 96 | append label & |
|---|
| 97 | set escape 0 |
|---|
| 98 | } else { |
|---|
| 99 | set idxu $cur |
|---|
| 100 | } |
|---|
| 101 | } elseif { $ch == "\\" } { |
|---|
| 102 | set escape 1 |
|---|
| 103 | } else { |
|---|
| 104 | if { $escape } { |
|---|
| 105 | append label "\\" |
|---|
| 106 | set escape 0 |
|---|
| 107 | } |
|---|
| 108 | append label $ch |
|---|
| 109 | } |
|---|
| 110 | incr cur |
|---|
| 111 | } |
|---|
| 112 | |
|---|
| 113 | # figure it out the type |
|---|
| 114 | array set options [lrange $mdesc 1 end] |
|---|
| 115 | if { [info exists options(-menu)] || |
|---|
| 116 | [info exists options(-post)] } { |
|---|
| 117 | set type cascade |
|---|
| 118 | } elseif { [info exists options(-value)] || |
|---|
| 119 | [info exists options(-variable)]} { |
|---|
| 120 | set type radio |
|---|
| 121 | } elseif { [info exists options(-onvalue)] || \ |
|---|
| 122 | [info exists options(-offvalue)] } { |
|---|
| 123 | set type check |
|---|
| 124 | } else { |
|---|
| 125 | set type command |
|---|
| 126 | } |
|---|
| 127 | # alias -cmd |
|---|
| 128 | if { [info exist options(-cmd)] } { |
|---|
| 129 | set options(-command) $options(-cmd) |
|---|
| 130 | unset options(-cmd) |
|---|
| 131 | } |
|---|
| 132 | switch $type { |
|---|
| 133 | cascade { |
|---|
| 134 | # specials menus |
|---|
| 135 | if { [string equal $label "Help"] } { |
|---|
| 136 | set idmenu help |
|---|
| 137 | } else { |
|---|
| 138 | regsub -all " " $label "_" id |
|---|
| 139 | set idmenu m$id |
|---|
| 140 | } |
|---|
| 141 | set menus($w,$label) $top.$idmenu |
|---|
| 142 | menu $menus($w,$label) -tearoff 0 |
|---|
| 143 | $top add cascade -label $label -menu $menus($w,$label) |
|---|
| 144 | if { [info exist options(-post)] } { |
|---|
| 145 | $menus($w,$label) configure \ |
|---|
| 146 | -postcommand "$options(-post) $menus($w,$label)" |
|---|
| 147 | } else { |
|---|
| 148 | foreach item $options(-menu) { |
|---|
| 149 | prjmenu::add $w $label $item |
|---|
| 150 | } |
|---|
| 151 | } |
|---|
| 152 | } |
|---|
| 153 | radio - |
|---|
| 154 | check - |
|---|
| 155 | command { |
|---|
| 156 | eval "$top add $type -label [list $label] [array get options]" |
|---|
| 157 | } |
|---|
| 158 | } |
|---|
| 159 | if { $idxu != -1 } { |
|---|
| 160 | $top entryconfigure last -underline $idxu |
|---|
| 161 | } |
|---|
| 162 | } |
|---|
| 163 | |
|---|
| 164 | |
|---|
| 165 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 166 | proc prjmenu::delete { w m name } { |
|---|
| 167 | # |
|---|
| 168 | # PURPOSE: |
|---|
| 169 | # |
|---|
| 170 | # PARAMETERS: |
|---|
| 171 | # w: |
|---|
| 172 | # m: |
|---|
| 173 | # name: |
|---|
| 174 | # |
|---|
| 175 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 176 | variable menus |
|---|
| 177 | |
|---|
| 178 | if { $m == "" } { |
|---|
| 179 | set top $menus($w) |
|---|
| 180 | } else { |
|---|
| 181 | set top $menus($w,$m) |
|---|
| 182 | } |
|---|
| 183 | set idx [$top index $name] |
|---|
| 184 | $top delete $idx |
|---|
| 185 | |
|---|
| 186 | # esto no esta ni bien ni completo. |
|---|
| 187 | } |
|---|
| 188 | |
|---|
| 189 | |
|---|
| 190 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 191 | proc prjmenu::state { w m name state} { |
|---|
| 192 | # |
|---|
| 193 | # PURPOSE: |
|---|
| 194 | # |
|---|
| 195 | # PARAMETERS: |
|---|
| 196 | # w: |
|---|
| 197 | # m: |
|---|
| 198 | # name: |
|---|
| 199 | # state: |
|---|
| 200 | # |
|---|
| 201 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 202 | variable menus |
|---|
| 203 | |
|---|
| 204 | if { $m == "" } { |
|---|
| 205 | set top $menus($w) |
|---|
| 206 | } else { |
|---|
| 207 | set top $menus($w,$m) |
|---|
| 208 | } |
|---|
| 209 | if { ![catch "set idx [$top index $name]"] } { |
|---|
| 210 | $top entryconfigure $idx -state $state |
|---|
| 211 | } |
|---|
| 212 | } |
|---|
| 213 | |
|---|
| 214 | |
|---|
| 215 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 216 | proc prjmenu::disable { w m name } { |
|---|
| 217 | # |
|---|
| 218 | # PURPOSE: |
|---|
| 219 | # |
|---|
| 220 | # PARAMETERS: |
|---|
| 221 | # w: |
|---|
| 222 | # m: |
|---|
| 223 | # name: |
|---|
| 224 | # |
|---|
| 225 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 226 | prjmenu::state $w $m $name disabled |
|---|
| 227 | } |
|---|
| 228 | |
|---|
| 229 | |
|---|
| 230 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 231 | proc prjmenu::enable { w m name } { |
|---|
| 232 | # |
|---|
| 233 | # PURPOSE: |
|---|
| 234 | # |
|---|
| 235 | # PARAMETERS: |
|---|
| 236 | # w: |
|---|
| 237 | # m: |
|---|
| 238 | # name: |
|---|
| 239 | # |
|---|
| 240 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 241 | prjmenu::state $w $m $name normal |
|---|
| 242 | } |
|---|
| 243 | |
|---|
| 244 | |
|---|
| 245 | # test description |
|---|
| 246 | if { 0 } { |
|---|
| 247 | package require Tk |
|---|
| 248 | package require msgcat |
|---|
| 249 | |
|---|
| 250 | catch {namespace import ::msgcat::*} |
|---|
| 251 | |
|---|
| 252 | proc Recent { m } { |
|---|
| 253 | $m delete 0 end |
|---|
| 254 | $m add command -label "File 1" -command "puts file1" |
|---|
| 255 | $m add command -label "File 2" -command "puts file2" |
|---|
| 256 | } |
|---|
| 257 | |
|---|
| 258 | set mdesc { |
|---|
| 259 | {&File -menu { |
|---|
| 260 | {&New -cmd "puts new"} |
|---|
| 261 | {&Open -cmd "puts open"} |
|---|
| 262 | -- |
|---|
| 263 | {E&xit -cmd "puts exit"}}} |
|---|
| 264 | {"&Recent files" -post Recent} |
|---|
| 265 | {&Options -menu { |
|---|
| 266 | {&Band -menu { |
|---|
| 267 | {&AM -variable banda} |
|---|
| 268 | {&FM -variable banda} |
|---|
| 269 | {&SW -variable banda}}} |
|---|
| 270 | {Check -onvalue 1 -offvalue 0}}} |
|---|
| 271 | {&Help -menu { |
|---|
| 272 | {&Content -cmd "puts Contenido"} |
|---|
| 273 | {&About -cmd "puts Acerca"}}} |
|---|
| 274 | {&Windows -cmd "puts Windows"}} |
|---|
| 275 | |
|---|
| 276 | if ![winfo exists .tol] {toplevel .tol} |
|---|
| 277 | prjmenu::create .tol $mdesc |
|---|
| 278 | |
|---|
| 279 | wm maxsize .tol [winfo vrootw .] 1 |
|---|
| 280 | wm geometry .tol 500x1 |
|---|
| 281 | } |
|---|
| 282 | |
|---|