source: tol/tolbase/lib/toltk/prjmenu.tcl @ 193c473

1941-docker-image-to-testdevel
Last change on this file since 193c473 was 6d7779d, checked in by Jorge Pérez <josp.jorge@…>, 18 years ago

initial import

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@1 be4846ae-f051-483a-831f-b64e7d08527f

  • Property mode set to 100644
File size: 6.0 KB
Line 
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
8namespace 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
40if {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
246if { 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
Note: See TracBrowser for help on using the repository browser.