source: tol/tolbase/lib/toltk/MenuManager.tcl @ 3844cff

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

refs #943, check if rank field is present in order to make it compatible with GuiTools 2.1

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

  • Property mode set to 100644
File size: 9.3 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 = GuiTools::MenuManager::getTypeLabelInfo( "%T" );
28      Set If( Card( aux ),
29              aux, GuiTools::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 = GuiTools::MenuManager::getEntryInfo( "%N" );
43      Set If( Card( aux ),
44              aux, GuiTools::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 = GuiTools::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  set SOA [ TclList2SetOfText $objSelection ]
68  set rvar "__checkEntryState__"
69  set tolExpr [ string map [ list %RV $rvar %N $name %S $SOA %G $group ] {
70    Real %RV = {
71      Set objAddress = %S;
72      Anything target = If( %G, {
73        EvalSet( objAddress, Anything( Text addr ) {
74          GetObjectFromAddress( addr )
75        } )
76      }, GetObjectFromAddress( objAddress[ 1 ] ) );
77      Real GuiTools::MenuManager::checkStateEntry( "%N", target )
78    }
79  } ]
80  tol::console eval $tolExpr
81  set info [ tol::info variable [ list Real $rvar ] ]
82  set value [ lindex $info 2 ]
83  tol::console stack release $rvar
84  return $value
85}
86
87proc ::MenuManager::invokeCommand { name objSelection group } {
88  variable typesSelected
89
90  set SOA [ TclList2SetOfText $objSelection ]
91  set rvar "__invokeCommand__"
92  set tolExpr [ string map [ list %RV $rvar %N $name %S $SOA %G $group ] {
93    Real %RV = {
94      Set objAddress = %S;
95      Anything target = If( %G, {
96        EvalSet( objAddress, Anything( Text addr ) {
97          GetObjectFromAddress( addr )
98        } )
99      }, GetObjectFromAddress( objAddress[ 1 ] ) );
100      Real GuiTools::MenuManager::invokeEntry( "%N", target )
101    }
102  } ]
103  tol::console eval $tolExpr
104  set info [ tol::info variable [ list Real $rvar ] ]
105  set value [ lindex $info 2 ]
106  tol::console stack release $rvar
107  return $value
108}
109
110proc ::MenuManager::checkIfMenuManagerIsLoaded { } {
111  set rvar "__checkIfMenuManagerIsLoaded__"
112  set tolExpr [ string map [ list %RV $rvar  ] {
113    Real %RV = ObjectExist( "NameBlock", "GuiTools::MenuManager" )
114  } ]
115  tol::console eval $tolExpr
116  set info [ tol::info variable [ list Real $rvar ] ]
117  set value [ lindex $info 2 ]
118  tol::console stack release $rvar
119  return [ expr { $value!=0 } ]
120}
121
122proc ::MenuManager::initTypesInfoFromSelection { selection } {
123  variable typesSelected
124
125  array unset typesSelected
126  array set typesSelected {
127    types {}
128  }
129  if { ![ checkIfMenuManagerIsLoaded ] } return
130  foreach addr $selection {
131    set type [ getTypeOfObject $addr ]
132    set typeOptionInfo [ getMenuOptionsForType $type ]
133    # registro el tipo solo si tiene informacion de menu asociada
134    if { [ llength $typeOptionInfo ] } {
135      if { ![ info exists typesSelected(objects,$type) ] } {
136        lappend typesSelected(types) $type
137        set typesSelected(labelInfo,$type) [ getLabelInfoForType $type ]
138        set typesSelected(entriesInfo,$type) $typeOptionInfo
139        foreach option $typeOptionInfo {
140          set name [ lindex $option 0 ]
141          set typesSelected(optionInfo,$name) $option
142          if { [ catch { lsearch $typesSelected(types,$name) $type } idx ] } {
143            set typesSelected(types,$name) [ list $type ]
144          } elseif { $idx == -1 } {
145            lappend typesSelected(types,$name) $type
146          }
147        }
148      }
149      lappend typesSelected(objects) $addr
150      lappend typesSelected(objects,$type) $addr
151    }
152  }
153  # busco las opciones que se aplican a toda la seleccion
154  set numberOfTypes [ llength $typesSelected(types) ]
155  set typesSelected(globalOptions) [ list ]
156  foreach optionIndex [ array names typesSelected types,* ] {
157    set optionName [ string range $optionIndex 6 end ]
158    if { [ llength $typesSelected(types,$optionName) ] == $numberOfTypes } {
159      lappend typesSelected(globalOptions) $typesSelected(optionInfo,$optionName)
160    }
161  }
162  return $typesSelected(types)
163}
164
165proc ::MenuManager::createSubMenuIfNeeded { targetMenu name } {
166  variable typesSelected
167
168  set path0 [ split $name "/" ]
169  set mm $targetMenu
170  set nn ""
171  set mapdot [ list . - ]
172  foreach n [ lrange $path0 0 end-1 ] {
173    #puts "n = $n"
174    # evito el caracter . en el nombre de widget
175    set n0 [ string map $mapdot $n ]
176    set mm0 ${mm}.mm$n0
177    #puts "mm0 = $mm0"
178    if { ![ info exists typesSelected(subMenu,inserted,$mm0) ] } {
179      if { [ winfo exists $mm0 ] } {
180        #puts "$mm0 existe"
181        $mm0 delete 0 end
182      } else {
183        menu $mm0 -tearoff 0
184      }
185      set nn [ expr { $nn eq "" ? $n : "${nn}/${n}" } ]
186      set labelInfo [ getLabelInfoForEntry $nn ]
187      foreach { name label image translate } $labelInfo break
188      set image0 [ ::ImageManager::getImageResourceId $image ]
189      if { $image0 ne "" } {
190        set image $image0
191      }
192      #puts "insertando menu $mm0 en $mm"
193      $mm add cascade -menu $mm0 \
194          -label [ expr { $translate ? [ msgcat::mc $label ] : $label } ] \
195          -image $image -compound [ expr { $image eq "" ? "none" : "left" } ]
196      set typesSelected(subMenu,inserted,$mm0) 1
197    }
198    set mm $mm0
199  }
200  #puts "retornando con mm  = $mm"
201  return $mm
202}
203
204proc ::MenuManager::insertEntries { menuWidget objSelection entriesInfo } {
205  set multiple [ expr { [ llength $objSelection ] > 1 } ]
206  # inserto las entries segun el orden inducido por el campo rank
207  if { [ llength [ lindex $entriesInfo 0 ] ] > 4 } {
208    # rank aparecio en la version 2.2 de GuiTools
209    set sortedEntriesInfo [ lsort -real -index 4 $entriesInfo ]
210  } else {
211    # se asume rank 0 para todos, el orden no cambia
212    set sortedEntriesInfo $entriesInfo
213  }
214  foreach entryInfo $sortedEntriesInfo {
215    foreach {name label image translate rank group} $entryInfo break
216    if { $group eq "" } {
217      # rank aparecio en la version 2.2 de GuiTools
218      set group $rank
219    }
220    if { $group ^ $multiple } continue
221    set mm [ createSubMenuIfNeeded $menuWidget $name ]
222    set state [ checkEntryState $name $objSelection $group ]
223    set entryLabel [ expr { $translate ? [ msgcat::mc $label ] : $label } ]
224    set image0 [ ::ImageManager::getImageResourceId $image ]
225    if { $image0 ne "" } {
226      set image $image0
227    }
228    $mm add command -label $entryLabel \
229        -command [ list ::MenuManager::invokeCommand $name $objSelection $group ] \
230        -state [ expr { $state ? "normal" : "disabled" } ] \
231        -image $image -compound [ expr { $image eq "" ? "none" : "left" } ]
232  }
233}
234
235proc ::MenuManager::insertEntriesForSelection { menuWidget selection } {
236  variable typesSelected
237
238  if { ![ llength [ initTypesInfoFromSelection $selection ] ] } return
239  set lenghtValidSelection [ llength $typesSelected(objects) ]
240  set lengthSelection [ llength $selection ]
241  if { $lengthSelection == $lenghtValidSelection } {
242    insertEntries $menuWidget \
243        $typesSelected(objects) $typesSelected(globalOptions)
244  }
245  # inserto las opciones especificas de cada tipo si es que hay mas de
246  # un tipo
247  if { ( $lengthSelection != $lenghtValidSelection ) ||
248       [ llength $typesSelected(types) ] > 1 } {
249    set mapdot [ list . - ]
250    foreach type $typesSelected(types) {
251      # type puede contener . por eso hay que reemplazarlo
252      set type0 [ string map $mapdot $type ]
253      set menuType $menuWidget.mtype$type0
254      if { ![ winfo exists $menuType ] } {
255        menu $menuType -tearoff 0
256      } else {
257        $menuType delete 0 end
258      }
259      foreach {label image translate} $typesSelected(labelInfo,$type) break 
260      set labelCascade [ expr { $translate ? [ msgcat::mc $label ] : $label } ]
261      set image0 [ ::ImageManager::getImageResourceId $image ]
262      if { $image0 ne "" } {
263        set image $image0
264      }
265      $menuWidget add cascade -label $labelCascade -menu $menuType \
266          -image $image -compound [ expr { $image eq "" ? "none" : "left" } ]
267      insertEntries $menuType \
268          $typesSelected(objects,$type) $typesSelected(entriesInfo,$type)
269    }
270  }
271}
Note: See TracBrowser for help on using the repository browser.