source: tol/tolbase/lib/toltk/MenuManager.tcl @ b5ff1e8

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

if selection was single the single options where not displayed, also the entries for TOL types accept now an image attribute

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

  • Property mode set to 100644
File size: 7.9 KB
Line 
1namespace eval MenuManager {
2}
3
4proc MenuManager::getTypeOfObject { addr } {
5  set rvar "__getTypeOfObject__"
6  set tolExpr [ string map [ list %A $addr %RV $rvar ] {
7    Text %RV = {
8      Anything obj = GetObjectFromAddress( "%A" );
9      Text theGrammar = Grammar( obj );
10      Text theType = If( theGrammar == "NameBlock", {
11        Text theClass = ClassOf( obj );
12        If( theClass == "", "NameBlock", theClass )
13      }, theGrammar ) 
14    }
15  } ]
16  tol::console eval $tolExpr
17  set info [ tol::info variable [ list Text $rvar ] ]
18  set value [ string trim [ lindex $info 2 ] \" ]
19  tol::console stack release $rvar
20  return $value
21}
22
23proc MenuManager::getLabelInfoForType { type } {
24  set rvar "__getLabelForType__"
25  set tolExpr [ string map [ list %RV $rvar %T $type ] {
26    Set %RV = {
27      Set aux = MenuManager::getTypeLabelInfo( "%T" );
28      Set If( Card( aux ),
29              aux, MenuManager::getDefaultTypeLabelInfo( "%T" ) )
30    }
31  } ]
32  tol::console eval $tolExpr
33  set value [ TolObj2TclObj [ list Set $rvar ] ]
34  tol::console stack release $rvar
35  return $value
36}
37
38proc MenuManager::getLabelInfoForEntry { entryName } {
39  set rvar "__getLabelInfoForEntry__"
40  set tolExpr [ string map [ list %RV $rvar %N $entryName ] {
41    Set %RV = {
42      Set aux = MenuManager::getEntryInfo( "%N" );
43      Set If( Card( aux ),
44              aux, MenuManager::getDefaultEntryInfo( "%N" ) )
45    }
46  } ]
47  tol::console eval $tolExpr
48  set value [ TolObj2TclObj [ list Set $rvar ] ]
49  tol::console stack release $rvar
50  return $value
51}
52
53proc MenuManager::getMenuOptionsForType { type } {
54  set rvar "__getMenuOptionsForType__"
55  set tolExpr [ string map [ list %RV $rvar %T $type ] {
56    Set %RV = MenuManager::getTypeOptionsInfo( "%T" );
57  } ]
58  tol::console eval $tolExpr
59  set value [ TolObj2TclObj [ list Set $rvar ] ]
60  tol::console stack release $rvar
61  return $value
62}
63
64proc MenuManager::checkEntryState { name objSelection group } {
65  variable typesSelected
66
67  puts "MenuManager::checkEntryState $name $objSelection $group"
68
69  set SOA [ TclList2SetOfText $objSelection ]
70  set rvar "__checkEntryState__"
71  set tolExpr [ string map [ list %RV $rvar %N $name %S $SOA %G $group ] {
72    Real %RV = {
73      Set objAddress = %S;
74      Anything target = If( %G, {
75        EvalSet( objAddress, Anything( Text addr ) {
76          GetObjectFromAddress( addr )
77        } )
78      }, GetObjectFromAddress( objAddress[ 1 ] ) );
79      WriteLn( "%N" << target );
80      Real MenuManager::checkStateEntry( "%N", target )
81    }
82  } ]
83  tol::console eval $tolExpr
84  set info [ tol::info variable [ list Real $rvar ] ]
85  set value [ lindex $info 2 ]
86  tol::console stack release $rvar
87  return $value
88}
89
90proc MenuManager::invokeCommand { name objSelection group } {
91  variable typesSelected
92
93  set SOA [ TclList2SetOfText $objSelection ]
94  set rvar "__invokeCommand__"
95  set tolExpr [ string map [ list %RV $rvar %N $name %S $SOA %G $group ] {
96    Real %RV = {
97      Set objAddress = %S;
98      Anything target = If( %G, {
99        EvalSet( objAddress, Anything( Text addr ) {
100          GetObjectFromAddress( addr )
101        } )
102      }, GetObjectFromAddress( objAddress[ 1 ] ) );
103      Real MenuManager::invokeEntry( "%N", target )
104    }
105  } ]
106  tol::console eval $tolExpr
107  set info [ tol::info variable [ list Real $rvar ] ]
108  set value [ lindex $info 2 ]
109  tol::console stack release $rvar
110  return $value
111}
112
113proc MenuManager::checkIfMenuManagerIsLoaded { } {
114  set rvar "__checkIfMenuManagerIsLoaded__"
115  set tolExpr [ string map [ list %RV $rvar  ] {
116    Real %RV = ObjectExist( "NameBlock", "GuiTools::MenuManager" )
117  } ]
118  tol::console eval $tolExpr
119  set info [ tol::info variable [ list Real $rvar ] ]
120  set value [ lindex $info 2 ]
121  tol::console stack release $rvar
122  return [ expr { $value!=0 } ]
123}
124
125proc MenuManager::initTypesInfoFromSelection { selection } {
126  variable typesSelected
127
128  array unset typesSelected
129  array set typesSelected {
130    types {}
131  }
132  if { ![ checkIfMenuManagerIsLoaded ] } return
133  foreach addr $selection {
134    set type [ getTypeOfObject $addr ]
135    set typeOptionInfo [ getMenuOptionsForType $type ]
136    # registro el tipo solo si tiene informacion de menu asociada
137    if { [ llength $typeOptionInfo ] } {
138      if { ![ info exists typesSelected(objects,$type) ] } {
139        lappend typesSelected(types) $type
140        set typesSelected(labelInfo,$type) [ getLabelInfoForType $type ]
141        set typesSelected(entriesInfo,$type) $typeOptionInfo
142        foreach option $typeOptionInfo {
143          set name [ lindex $option 0 ]
144          set typesSelected(optionInfo,$name) $option
145          if { [ catch { lsearch $typesSelected(types,$name) $type } idx ] } {
146            set typesSelected(types,$name) [ list $type ]
147          } elseif { $idx == -1 } {
148            lappend typesSelected(types,$name) $type
149          }
150        }
151      }
152      lappend typesSelected(objects,$type) $addr
153    }
154  }
155  # busco las opciones que se aplican a toda la seleccion
156  set numberOfTypes [ llength $typesSelected(types) ]
157  set typesSelected(globalOptions) [ list ]
158  foreach optionIndex [ array names typesSelected types,* ] {
159    set optionName [ string range $optionIndex 6 end ]
160    if { [ llength $typesSelected(types,$optionName) ] == $numberOfTypes } {
161      lappend typesSelected(globalOptions) $typesSelected(optionInfo,$optionName)
162    }
163  }
164  return $typesSelected(types)
165}
166
167proc MenuManager::kk { } {
168  variable typesSelected
169
170  set numberOfTypes [ llength $typesSelected(types) ]
171  #set typesSelected(globalOptions) [ list ]
172  foreach optionIndex [ array names typesSelected types,* ] {
173    puts "optionIndex = $optionIndex"
174    set optionName [ string range $optionIndex 6 end ]
175    puts "optionName = $optionName"
176    if { [ llength $typesSelected(types,$optionName) ] == $numberOfTypes } {
177      lappend typesSelected(globalOptions) \
178          $typesSelected(optionInfo,$optionName)
179    }
180  }
181}
182
183proc MenuManager::createSubMenuIfNeeded { targetMenu name } {
184  set path0 [ split $name "/" ]
185  set mm $targetMenu
186  set nn ""
187  foreach n [ lrange $path0 0 end-1 ] {
188    set mm0 ${mm}.mm$n
189    if { [ winfo exists $mm0 ] } {
190      $mm0 delete 0 end
191    } else {
192      menu $mm0 -tearoff 0
193    }
194    set nn [ expr { $nn eq "" ? $n : "/$n" } ]
195    set labelInfo [ getLabelInfoForEntry $nn ]
196    foreach { name label image translate } $labelInfo break
197    $mm add cascade -menu $mm0 \
198        -label [ expr { $translate ? [ msgcat::mc $label ] : $label } ] \
199        -image $image
200    set mm $mm0
201  }
202  return $mm
203}
204
205proc MenuManager::insertEntries { menuWidget objSelection entriesInfo } {
206  set multiple [ expr { [ llength $objSelection ] > 1 } ]
207  foreach entryInfo $entriesInfo {
208    foreach {name label image translate group} $entryInfo break
209    if { $group ^ $multiple } continue
210    set mm [ createSubMenuIfNeeded $menuWidget $name ]
211    set state [ checkEntryState $name $objSelection $group ]
212    set entryLabel [ expr { $translate ? [ msgcat::mc $label ] : $label } ]
213    $mm add command -label $entryLabel \
214        -command [ list MenuManager::invokeCommand $name $objSelection $group ] \
215        -state [ expr { $state ? "normal" : "disabled" } ]
216  }
217}
218
219proc MenuManager::insertEntriesForSelection { menuWidget selection } {
220  variable typesSelected
221
222  if { ![ llength [ initTypesInfoFromSelection $selection ] ] } return
223  insertEntries $menuWidget $selection $typesSelected(globalOptions)
224  # inserto las opciones especificas de cada tipo si es que hay mas de
225  # un tipo
226  if { [ llength $typesSelected(types) ] > 1 } {
227    foreach type $typesSelected(types) {
228      set menuType $menuWidget.mtype$type
229      if { ![ winfo exists $menuType ] } {
230        menu $menuType -tearoff 0
231      } else {
232        $menuType delete 0 end
233      }
234      foreach {label image translate} $typesSelected(labelInfo,$type) break 
235      set labelCascade [ expr { $translate ? [ msgcat::mc $label ] : $label } ]
236      $menuWidget add cascade -label $labelCascade -menu $menuType
237      insertEntries $menuType \
238          $typesSelected(objects,$type) $typesSelected(entriesInfo,$type)
239    }
240  }
241}
Note: See TracBrowser for help on using the repository browser.