choosing sig figs is no longer a slider widget; it is a bunch of menu
[dyninst.git] / visiClients / tableVisi / tcl / tableVisi.tcl
1 # tableVisi.tcl
2 # Ariel Tamches
3
4 #
5 # $Log: tableVisi.tcl,v $
6 # Revision 1.2  1995/11/08 21:15:33  tamches
7 # choosing sig figs is no longer a slider widget; it is a bunch of menu
8 # choices
9 #
10 # Revision 1.1  1995/11/04 00:43:12  tamches
11 # First version of new table visi
12 #
13 #
14
15 proc initializeTableVisi {} {
16    if {[winfo depth .] > 1} {
17    #  . config -bg grey
18      option add *Background grey
19      option add *activeBackground LightGrey
20      option add *activeForeground black
21      option add *Scale.activeForeground grey
22    } else {
23      option add *Background white
24      option add *Foreground black
25    }
26    
27    option add *Visi*font *-New*Century*Schoolbook-Bold-R-*-18-*
28    option add *Data*font *-Helvetica-*-r-*-12-* 
29    option add *MyMenu*font *-New*Century*Schoolbook-Bold-R-*-14-*
30    
31    # Create the title bar, menu bar, and logo at the top:
32    frame .top
33    pack .top -side top -fill x
34    
35    frame .top.left 
36    pack .top.left -side left -fill both -expand true
37    
38    label .top.left.title -relief raised -text "Table Visualization" \
39          -font *-New*Century*Schoolbook-Bold-R-*-14-* \
40          -foreground white -background HotPink2
41    pack .top.left.title -side top -fill both -expand true
42    
43    # Menus:
44    
45    frame .top.left.menubar -class MyMenu -borderwidth 2 -relief raised
46    pack .top.left.menubar -side top -fill x
47    
48    menubutton .top.left.menubar.file -text "File" -menu .top.left.menubar.file.m
49    menu .top.left.menubar.file.m -selectcolor cornflowerblue
50    .top.left.menubar.file.m add command -label "Close Table" -command {destroy .}
51    
52    menubutton .top.left.menubar.acts -text "Actions" -menu .top.left.menubar.acts.m
53    menu .top.left.menubar.acts.m  -selectcolor cornflowerblue
54    .top.left.menubar.acts.m add command -label "Add Entries" -command AddEntry
55    .top.left.menubar.acts.m add command -label "Delete Selected Entry" -command DelEntry -state disabled
56    
57    menubutton .top.left.menubar.opts -text "View" -menu .top.left.menubar.opts.m
58    menu .top.left.menubar.opts.m  -selectcolor cornflowerblue
59
60    global LongNames
61    set LongNames 1
62    .top.left.menubar.opts.m add check -label "Long Names" -variable LongNames -command {updateNames $LongNames}
63    .top.left.menubar.opts.m add separator
64
65    global DataFormat
66    set DataFormat 0
67    .top.left.menubar.opts.m add radio -label "Current Values" \
68            -variable DataFormat \
69            -value 0 -command formatChanged
70    .top.left.menubar.opts.m add radio -label "Average Values" \
71            -variable DataFormat \
72            -value 1 -command formatChanged
73    .top.left.menubar.opts.m add radio -label "Total Values" \
74            -variable DataFormat \
75            -value 2 -command formatChanged
76    .top.left.menubar.opts.m add separator
77    global sortMetrics
78    set sortMetrics 0
79    .top.left.menubar.opts.m add radio -label "Don't Sort Metrics" \
80            -variable sortMetrics -value 0 -command unsortMetrics
81    .top.left.menubar.opts.m add radio -label "Sort Metrics (ascending)" \
82            -variable sortMetrics -value 1 -command sortMetrics
83    .top.left.menubar.opts.m add separator
84    global sortFoci
85    set sortFoci 0
86    .top.left.menubar.opts.m add radio -label "Don't Sort Foci" \
87            -variable sortFoci -value 0 -command unsortFoci
88    .top.left.menubar.opts.m add radio -label "Sort Foci (ascending)" \
89            -variable sortFoci -value 1 -command sortFoci
90    
91    # significant digits at the end of the View menu (?)
92    global SignificantDigits
93    set SignificantDigits 3
94
95    .top.left.menubar.opts.m add separator
96    .top.left.menubar.opts.m add radio -label "1 significant digit" \
97            -variable SignificantDigits -value 1 -command "sigFigChange "
98    .top.left.menubar.opts.m add radio -label "2 significant digit" \
99            -variable SignificantDigits -value 2 -command "sigFigChange "
100    .top.left.menubar.opts.m add radio -label "3 significant digit" \
101            -variable SignificantDigits -value 3 -command "sigFigChange "
102    .top.left.menubar.opts.m add radio -label "4 significant digit" \
103            -variable SignificantDigits -value 4 -command "sigFigChange "
104    .top.left.menubar.opts.m add radio -label "5 significant digit" \
105            -variable SignificantDigits -value 5 -command "sigFigChange "
106    .top.left.menubar.opts.m add radio -label "6 significant digit" \
107            -variable SignificantDigits -value 6 -command "sigFigChange "
108    .top.left.menubar.opts.m add radio -label "7 significant digit" \
109            -variable SignificantDigits -value 8 -command "sigFigChange "
110    .top.left.menubar.opts.m add radio -label "8 significant digit" \
111            -variable SignificantDigits -value 8 -command "sigFigChange "
112
113    #  Add menu bar to display
114    pack .top.left.menubar.file .top.left.menubar.acts .top.left.menubar.opts \
115         -side left -padx 4
116    
117    #  Logo:
118    label .top.logo -relief raised \
119                      -bitmap @/p/paradyn/core/paradyn/tcl/logo.xbm \
120                      -foreground HotPink2
121    pack .top.logo -side right
122
123    # Horizontal Scrollbar
124    scrollbar .horizScrollbar -orient horizontal \
125            -background gray -activebackground gray -relief sunken \
126            -command horizScrollbarNewScrollPosition
127    pack .horizScrollbar -side bottom -fill x
128
129    # Vertical Scrollbar:
130    scrollbar .vertScrollbar -orient vertical \
131            -background gray -activebackground gray -relief sunken \
132            -command vertScrollbarNewScrollPosition
133    pack .vertScrollbar -side left -fill y -expand false
134
135    # Body (drawn by C++ code -- metrics, units, foci, cells):
136    frame .body -width 400 -height 220
137    pack  .body -fill both -expand true
138
139    bind .body <Configure> {tableVisiConfigure}
140    bind .body <Expose>    {tableVisiExpose}
141
142    wm minsize . 300 200
143    wm title . "Table Visualization"
144 }
145    
146 #  AddEntry -- Ask paradyn to start a new curve
147 proc AddEntry {} {
148   Dg start "*" "*"
149 }
150
151 #  DelEntry -- Ask paradyn to stop a curve
152 proc DelEntry {} {
153   puts stderr "Delete Entry not yet implemented"
154 }
155
156 #  Called by visi library when histos have folded
157 #    we just update the status line and keep on going
158 #proc DgFoldCallback {} {
159 #  UpdateStatus 
160 #}
161
162 #
163 #  DgPhaseStartCallback -- visi calls this when a phase has started
164 #
165 proc DgPhaseStartCallback {phaseId} {
166    puts stderr "welcome to DgPhaseStartCallback (tcl code)"
167    return
168 }
169
170 #
171 #  DgPhaseEndCallback -- visi calls this when a phase has started
172 #
173 proc DgPhaseEndCallback {phaseId} {
174    puts stderr "welcome to DgPhaseEndCallback (tcl code)"
175    return
176 }
177
178 #
179 #  DgPhaseDataCallback -- visi calls this when a phase has started
180 #
181 proc DgPhaseDataCallback {} {
182    puts stderr "welcome to DgPhaseEndCallback (tcl code)"
183    return
184 }
185
186 #
187 #  Update the status line
188 #
189 proc UpdateStatus {} {
190   global DataFormat W
191   global Callbacks UpdateLimit lastBucket
192
193   set bw [Dg binwidth]
194
195   .status.label configure -text [format "Time: %-10s  Format: %s" [TimeLabel [expr int($bw * $lastBucket)]] $DataFormat]
196 }
197
198 #
199 #  GetValue asks visi library for the data value for the met/res pair 
200 #    we ask visi for the data in the correct DataFormat
201 #
202 #proc GetValue {m r bucket} {
203 #  global DataFormat
204 #  global numMetrics numResources
205 #
206 #   if {![Dg valid $m $r] || ![Dg enabled $m $r]} {
207 #      # there is a hole in valid datagrid entries -- happens all the time
208 #      return ""
209 #   }
210 #
211 #   if {[string match $DataFormat Instantaneous]} {
212 #      return [Dg value $m $r $bucket]
213 #   } elseif {[string match $DataFormat Average]} {
214 #      return [Dg aggregate $m $r]
215 #   } elseif {[string match $DataFormat Sum]} {
216 #      return [Dg sum $m $r]
217 #   } else {
218 #      puts stderr "GetValue: unknown data format: $DataFormat"
219 #      return 0
220 #   }
221 #}
222
223 #
224 # DgValidCallback -- visi calls this when curve becomes valid
225 #
226 #proc DgValidCallback {m} {
227 #  return
228 #  puts stderr "Bucket $m is now valid"
229 #}
230
231 set UpdateCounter 0
232 set UpdateLimit 1
233
234 # TimeToUpdate - returns true (1) iff it is time to redraw
235 #                the status (amount of time) at the bottom of the screen
236 proc TimeToUpdate {} {
237   global UpdateCounter UpdateLimit
238
239   if {$UpdateCounter <= 0} {
240     set UpdateCounter [expr $UpdateLimit / [Dg binwidth]]
241     return 1
242   } else {
243     set UpdateCounter [expr $UpdateCounter - 1]
244     return 0
245   }
246 }
247
248 set Callbacks 0
249
250 #
251 #  DgDataCallback -- visi calls this command when new data is available
252 #    we fill in all of the data labels with the new data values
253 #
254 #proc DgDataCallback {bucket} {
255 #   global Callbacks
256 #
257 #   incr Callbacks
258 #   if {[TimeToUpdate]} {
259 #      DataUpdate $bucket
260 #      UpdateStatus
261 #   }
262 #}
263
264 #
265 #  TimeLabel -- given a time value in seconds, format a nice label
266 #
267 #  note: If called often, this routine should be rewritten in C++.
268 proc TimeLabel {val} {
269   if {($val > 60) && ($val < 3600)} {
270     set min [expr $val / 60]
271     set sec [expr $val - ($min * 60)]
272     return [format "%d m %d s" $min $sec]
273   }
274   if {$val < 60} {
275     return [format "%d s" $val]
276   }
277   if {$val > 3600} {
278     set hr [expr $val / 3600]
279     set left [expr $val - ($hr * 3600)]
280     set min [expr $left / 60]
281     set sec [expr $left - ($min * 60)]
282     return [format "%d h %d m %d s" $hr $min $sec]
283   }
284   return "$val s"
285 }
286
287 initializeTableVisi