Fixing wayward constness and general tidy-up.
[dyninst.git] / paradyn / tcl / mets.tcl
1 # $Id: mets.tcl,v 1.20 1998/03/03 23:09:48 wylie Exp $
2 # this file contains procedures used in prompting user for metric/resource
3 # choices for a visualization.  When the resource hierarchy display is 
4 # complete, this will be changed and will only be used to get the metric
5 # choices directly.
6 # getMetsAndRes (bottom of this file) is the entry-point.
7 #
8
9 proc acceptMetChoices {threadid numMetrics metIndexes2Id} {
10     # Called by sendAllSelections, below.  Fills in tclSelectedMetrics($threadid).
11     # NOTE a new requirement: tclSelectedMetrics($threadid) MUST contain metric ids,
12     #      not metric indexes!
13     global tclSelectedMetrics metmenuCB
14
15     set tclSelectedMetrics($threadid) ""
16     #puts stderr "welcome to acceptMetChoices; threadid=$threadid; metIndexes2Id=$metIndexes2Id"
17
18     for {set i 0} {$i < $numMetrics} {incr i} {
19         if {$metmenuCB($threadid$i) > 0} {
20             set theMetricId [lindex $metIndexes2Id $i]
21             lappend tclSelectedMetrics($threadid) $theMetricId
22         }       
23     }
24     
25     return [llength $tclSelectedMetrics($threadid)]  
26 }
27
28 # sendAllSelections
29 # processes and returns to VISIthread metric and resource selections
30 # returns 1 if no metrics selected, 2 if no focus selected, 0 if OK
31
32 proc sendAllSelections {visiToken threadid numMetrics metIndexes2Id} {
33     # Called by endSelection, below.
34
35     global tclSelectedMetrics
36
37     # Fill in tclSelectedMetrics($threadid):
38     #puts stderr "Welcome to sendAllSelections; metIndexes2Id=$metIndexes2Id"
39     if {[acceptMetChoices $threadid $numMetrics "$metIndexes2Id"] == 0} {
40         return 1
41     }
42
43     #puts stderr "sendAllSelections: about to call uimpd processVisiSelection with tclSelectedMetrics for this threadid of:"
44     #puts stderr $tclSelectedMetrics($threadid)
45
46     if [uimpd processVisiSelection $tclSelectedMetrics($threadid)] {
47         uimpd sendVisiSelections $visiToken 0
48         return 0
49     } else {
50         return 2
51     }
52 }
53
54 # endSelection
55 # handles cancel and done buttons for resource/metric selection
56 # note: must still call sendVisiSelections on cancel so reply msg is sent to 
57 #       requesting VISI thread
58 proc endSelection {visiToken cancelflag threadid numMetrics metIndexes2Id} {
59     # If cancelflag is false, this routine calls sendAllSelections, above.
60     # If all's well, it then deletes the window.
61
62     #puts stderr "welcome to endSelection; metIndexes2Id=$metIndexes2Id"
63
64     if $cancelflag {
65         uimpd sendVisiSelections $visiToken 1
66         set x 0
67     } else {
68         set x [sendAllSelections $visiToken $threadid $numMetrics "$metIndexes2Id"]
69     }
70
71     set win .metmenunew$threadid
72     if {$x == 1} {
73         $win.top.msg configure -text \
74                 "Please select one or more metrics or press cancel"
75                 #
76                 # I think we should use showError here. It does not
77                 # make sense to have several equivalent routines to
78                 # display error messages
79                 #
80     } elseif {$x == 2} {
81         $win.top.msg configure -text \
82                 "Please select a focus on the where axis or press cancel"
83     } else {
84         destroy $win
85     }
86
87
88 proc clearMetSelects {threadid numMetrics metIndexes2Id} {
89     global metmenuCB metSelected selectedMetricNames
90
91     #puts stderr "welcome to clearMetSelects; metIndexes2Id=$metIndexes2Id"
92
93     for {set i 0} {$i < $numMetrics} {incr i} {
94       set metricId [lindex $metIndexes2Id $i]
95       set selectedMetricNames($metricId) 0
96       set metmenuCB($threadid$i) 0
97     }
98     set metSelected($threadid) 0
99
100     set w .metmenunew$threadid
101     $w.bot.b0 configure -state disabled
102 }
103
104 #
105 # metSelectedProc
106 # Counts how many metrics have been selected
107 # This value, stored in metSelected, is used in
108 # order to enable and disable the DONE button
109 # (i.e. DONE button is enabled iff metSelected>0)
110 #
111
112 proc metSelectedProc {i threadid numMetrics metIndexes2Id} {
113     # new: metSelected is an array indexed by window-name
114     #      (so things don't get messed up when >1 window is open
115     #      at a time)
116     global metSelected metmenuCB
117     global selectedMetricNames
118     #puts stderr "welcome to metSelectedProc; metIndexes2Id=$metIndexes2Id"
119
120     set metricId [lindex $metIndexes2Id $i]
121
122     if {$metmenuCB($threadid$i)>0} {
123       incr metSelected($threadid)
124       set selectedMetricNames($metricId) 1
125     } else {
126       incr metSelected($threadid) -1
127       set selectedMetricNames($metricId) 0
128     }
129
130     set w .metmenunew$threadid
131     if {$metSelected($threadid)>0} {
132       $w.bot.b0 configure -state normal 
133     } else {
134       $w.bot.b0 configure -state disabled
135     }
136 }
137
138 # getMetsAndRes 
139 # called from  UIM::chooseMetricsandResources
140 # Metric/Resource selection starts here!
141
142 proc getMetsAndRes {metsAndResID requestingThread numMetrics metIndexes2Id} {
143     # requestingThread can help us identify specific visis
144     #puts stderr "welcome to getMetsAndRes; metIndexes2Id=$metIndexes2Id"
145
146     global metricNamesById
147     global metSelected metmenuCB
148
149     set w .metmenunew$requestingThread
150     if {[winfo exists $w]} {
151        # puts stderr "Window $w already exists --> this visi already has a pending metric selection..."
152
153        # Simulate a cancel here.
154        uimpd sendVisiSelections $metsAndResID 1
155
156        return
157     }
158
159     # toplevel window
160     toplevel $w  -bd 0
161     wm title $w "Paradyn Metrics Menu"
162     wm iconname $w "PD Metrics Menu"
163     wm geometry $w +425+100
164     focus $w
165
166     mkFrame $w.top {top fill expand} -relief raised -border 1
167     mkMessage $w.top.msg "" {top expand padx 20 pady 20} \
168             -aspect 1000 -text "Select Metrics and Focus(es) below" \
169             -font { Times 12 bold } 
170    
171     set metSelected($requestingThread) 0
172     if {$numMetrics == 0} {
173         set msg3 "No Metrics Currently Defined"
174         mkMessage $w.top.nometsmsg $msg3 {top expand} \
175                 -font { Times 12 normal }
176     } else {
177         frame $w.top.1 
178         frame $w.top.2
179         frame $w.top.3
180         if { [expr $numMetrics % 3] > 0} {
181             set colSize [expr (($numMetrics/3) + 1)]
182         } else {
183             set colSize [expr ($numMetrics/3)]
184         }
185         set colNum 1
186         set cCnt 1
187
188         for {set i 0} {$i < $numMetrics} {incr i} {
189             set metricId [lindex $metIndexes2Id $i]
190             set metricName $metricNamesById($metricId)
191
192             global selectedMetricNames
193             if {[array names selectedMetricNames $metricId] == ""} {
194                set selectedMetricNames($metricId) 0
195             }
196             set initiallySet $selectedMetricNames($metricId)
197             set metmenuCB($requestingThread$i) $initiallySet
198
199             checkbutton $w.top.$colNum.cb$i  -width 20 -anchor w -padx 2 \
200                     -variable metmenuCB($requestingThread$i) \
201                     -text $metricName \
202                     -command "metSelectedProc $i $requestingThread $numMetrics {$metIndexes2Id}"
203
204             if {$metmenuCB($requestingThread$i) > 0} {
205               incr metSelected($requestingThread)
206             }
207
208             pack $w.top.$colNum.cb$i -side top
209             if { $cCnt >= $colSize} { 
210                 incr colNum
211                 set cCnt 1
212             } else {
213                 incr cCnt
214             }
215         }
216         pack $w.top.1 $w.top.2 $w.top.3 -side left -fill both -expand 1
217     }
218
219     # buttons
220     mkFrame $w.bot {bottom fill expand} -relief raised -borderwidth 4
221
222     button $w.bot.b0 -text "ACCEPT" -width 12 \
223             -command "endSelection $metsAndResID 0 $requestingThread $numMetrics {$metIndexes2Id}"
224
225     button $w.bot.b1 -text "CLEAR" -width 12 \
226             -command "clearMetSelects $requestingThread $numMetrics {$metIndexes2Id}"
227
228     button $w.bot.b2 -text "CANCEL" -width 12 \
229             -command "endSelection $metsAndResID 1 $requestingThread $numMetrics {$metIndexes2Id}"
230
231     if {$metSelected($requestingThread)==0} {
232       $w.bot.b0 configure -state disabled
233     } 
234
235     pack $w.bot.b0 $w.bot.b1 $w.bot.b2 -side left -padx 20 -expand 1 \
236             -pady 4
237 }