changed params to PhaseDef
[dyninst.git] / visiClients / phaseTable / tcl / phasetbl.tcl
1 #
2 # $Log: phasetbl.tcl,v $
3 # Revision 1.4  1996/03/11 17:44:49  newhall
4 # changed params to PhaseDef
5 #
6 # Revision 1.3  1996/02/23  17:49:07  tamches
7 # starting a phase now properly sends "with pc/with visis" flags
8 #
9 # Revision 1.2  1996/02/11 21:22:40  tamches
10 # Now have a "Phase" menu just like the main paradyn window does.
11 # Dimmed the help menu since not yet implemented
12 #
13 # Revision 1.1  1995/12/15 22:01:56  tamches
14 # first version of phaseTable
15 #
16 #
17
18 if {[string match [winfo depth .] color] == 1} {
19   # always defaults to bisque so reset it to grey
20   . config -bg grey
21    option add *Background grey
22   option add *activeBackground LightGrey
23   option add *activeForeground black
24   option add *Scale.activeForeground grey
25 } else {
26   option add *Background white
27   option add *Foreground black
28 }
29
30 option add *Visi*font *-New*Century*Schoolbook-Bold-R-*-18-*
31 option add *Data*font *-Helvetica-*-r-*-12-* 
32 option add *MyMenu*font *-New*Century*Schoolbook-Bold-R-*-14-*
33 option add *title*font *-New*Century*Schoolbook-Bold-R-*-18-*
34 option add *phaseName*font *-New*Century*Schoolbook-Bold-R-*-14-*
35 option add *phaseStart*font *-New*Century*Schoolbook-Bold-R-*-14-*
36 option add *phaseEnd*font *-New*Century*Schoolbook-Bold-R-*-14-*
37
38 proc getWindowWidth {wName} {
39    # warning!  This routine will return an old number if an important
40    # event (i.e. resize) happened but idle routines haven't yet kicked in.
41    # --> *** In such cases, be sure to grab the latest information directly
42    #         from the event structure instead of calling this routine!!!!
43
44    set result [winfo width $wName]
45    if {$result == 1} {
46       # hack for a window that hasn't yet been mapped
47       set result [winfo reqwidth $wName]
48    }
49
50    return $result
51 }
52
53 proc getWindowHeight {wName} {
54    # warning!  This routine will return an old number if an important
55    # event (i.e. resize) happened but idle routines haven't yet kicked in.
56    # --> *** In such cases, be sure to grab the latest information directly
57    #         from the event structure instead of calling this routine!!!!
58
59    set result [winfo height $wName]
60    if {$result == 1} {
61       # hack for a window that hasn't yet been mapped
62       set result [winfo reqheight $wName]
63    }
64
65    return $result
66 }
67
68 set W .table
69
70 #
71 #  Create the overall frame
72 #
73 frame $W -class Visi -width 4i -height 2i
74
75 #
76 #  Create the title bar, menu bar, and logo at the top
77 #
78 frame $W.top
79 pack $W.top -side top -fill x
80
81 frame $W.top.left 
82 pack $W.top.left -side left -fill both -expand 1
83
84 label $W.top.left.title -relief raised -text "Phase Table" \
85       -foreground white -background Green4
86
87 pack $W.top.left.title -side top -fill both -expand true
88
89 #
90 #  Create the menubar as a frame with many menu buttons
91 #
92 frame $W.top.left.menubar -class MyMenu -borderwidth 2 -relief raised
93 pack $W.top.left.menubar -side top -fill x
94
95 #
96 #  File menu
97
98 menubutton $W.top.left.menubar.file -text "File" -menu $W.top.left.menubar.file.m
99 menu $W.top.left.menubar.file.m
100 $W.top.left.menubar.file.m add command -label "Close" -command Shutdown
101
102 #
103 #  Actions menu
104 #
105
106 menubutton $W.top.left.menubar.phase -text "Phase" \
107         -menu $W.top.left.menubar.phase.m
108 menu $W.top.left.menubar.phase.m
109 $W.top.left.menubar.phase.m add command -label "Start" -command "PhaseDef <null> 0 0"
110 $W.top.left.menubar.phase.m add command -label "Start with Perf Consultant" \
111         -command "PhaseDef <null> 1 0"
112 $W.top.left.menubar.phase.m add command -label "Start with Visis" \
113         -command "PhaseDef <null> 0 1" -state disabled
114 $W.top.left.menubar.phase.m add command -label "Start" \
115         -command "PhaseDef <null> 1 1" -state disabled
116
117 #
118 #  Help menu
119 #
120 menubutton $W.top.left.menubar.help -text "Help" -menu $W.top.left.menubar.help.m -state disabled
121 menu $W.top.left.menubar.help.m
122 $W.top.left.menubar.help.m add command -label "General" -command "NotImpl"
123 $W.top.left.menubar.help.m add command -label "Context" -command "NotImpl"
124 #$W.top.left.menubar.help.m disable 0
125 #$W.top.left.menubar.help.m disable 1
126
127 #
128 #  Build the menu bar and add to display
129 #
130 pack $W.top.left.menubar.file $W.top.left.menubar.phase -side left -padx 2
131 pack $W.top.left.menubar.help -side right 
132
133 makeLogo $W.top.logo paradynLogo raised 2 HotPink4
134 pack $W.top.logo -side right
135
136
137 frame $W.left 
138 pack   $W.left -side left -fill both -expand true
139
140 #
141 # Left portion of middle: phase name, name canvas
142 #
143 label $W.left.phaseName -text "Phase Name" -foreground Blue 
144 pack  $W.left.phaseName -side top -expand false
145 # expand is false; if the window is made taller, we don't want the extra height
146
147 canvas $W.left.dataCanvas -relief groove \
148         -width 1.3i -height 0.9i
149 pack   $W.left.dataCanvas -side left -fill both -expand true
150
151
152 #
153 # Middle portion of middle: phase start time, data canvas
154 #
155
156 frame $W.middle 
157 pack  $W.middle -side left -fill both -expand true 
158
159 label $W.middle.phaseStart -text "Start Time" -foreground Blue 
160 pack   $W.middle.phaseStart -side top -fill x -expand false
161
162 canvas $W.middle.dataCanvas -relief groove \
163         -width 1.3i -height 0.9i
164 pack  $W.middle.dataCanvas -side top -fill both -expand true 
165
166 #
167 # Right portion of middle: phase end time, data canvas
168 #
169
170 frame $W.right 
171 pack  $W.right -side right -fill both -expand true
172
173 label $W.right.phaseEnd -text "End Time" -foreground Blue 
174 pack   $W.right.phaseEnd -side top -fill x -expand false
175
176
177 canvas $W.right.dataCanvas -relief groove \
178         -width 1.3i -height 0.9i
179 pack  $W.right.dataCanvas -side top -fill both -expand true
180
181
182 #
183 # display everything
184 #
185 pack append . $W {fill expand frame center}
186 wm minsize . 250 100
187 wm title . "Phase Table"
188
189 #
190 #  Helper function for "Close" menu option
191 #
192 proc Shutdown {} {
193   destroy .
194 }
195
196 #
197 #  Issue a warning about missing function
198 #
199 proc NotImpl {} {
200 }
201
202 #
203 #  Called by visi library when histos have folded
204 #
205 proc DgFoldCallback {} {
206
207 }
208
209 #
210 #  Called by visi library when met/res space changes
211 #
212 proc DgConfigCallback {} {
213
214 }
215
216 #
217 # DgValidCallback -- visi calls this when curve becomes valid
218 #
219 proc DgValidCallback {m} {
220   return
221 }
222
223 #
224 #  DgDataCallback -- visi calls this command when new data is available
225 #
226 proc DgDataCallback {bucket} {
227
228 }
229 set xOffset 10 
230 set yOffset 5
231 set widthChange 20
232
233 proc NameUpdate {phaseId} {
234    global W
235    global xOffset 
236    global yOffset 
237    global widthChange
238
239    set theCanvas $W.left.dataCanvas
240
241    set theText [Dg phasename $phaseId] 
242    set yOffset [expr  5 + $phaseId * $widthChange]
243    $theCanvas create text $xOffset $yOffset\
244         -anchor nw \
245         -fill black \
246         -font *-Helvetica-*-r-*-12-* \
247         -justify center \
248         -tag dataTag \
249         -text $theText 
250
251
252    return
253 }
254
255 proc StartUpdate {phaseId} {
256    global W
257    global xOffset 
258    global yOffset 
259    global widthChange
260
261    set theCanvas $W.middle.dataCanvas
262
263    set yOffset [expr  5 + $phaseId * $widthChange]
264    set theText [TimeLabel [expr int([Dg phasestartT $phaseId])]  ] 
265    $theCanvas create text $xOffset $yOffset\
266         -anchor nw \
267         -fill black \
268         -font *-Helvetica-*-r-*-12-* \
269         -justify center \
270         -tag dataTag \
271         -text $theText 
272    return
273 }
274
275 proc EndUpdate {phaseId} {
276    global W
277    global xOffset 
278    global yOffset 
279    global widthChange
280
281    set theCanvas $W.right.dataCanvas
282    
283    # puts stderr "in EndUpdate phaseId and phaseend"
284    # puts stderr $phaseId 
285    set result [Dg phaseendT $phaseId]
286    # puts stderr $result 
287    if {$result == -1} return
288    set theText [TimeLabel [expr int([Dg phaseendT $phaseId])]  ]
289    set yOffset [expr  5 + $phaseId * $widthChange]
290    $theCanvas create text $xOffset $yOffset\
291         -anchor nw \
292         -fill black \
293         -font *-Helvetica-*-r-*-12-* \
294         -justify center \
295         -tag dataTag \
296         -text $theText 
297
298 #   set yOffset [expr $yOffset + 20]
299    return
300 }
301
302 #
303 #  DgPhaseStartCallback -- visi calls this when a phase has started
304 #
305 proc DgPhaseStartCallback {phaseId} {
306    
307    NameUpdate $phaseId
308    StartUpdate $phaseId
309    return
310 }
311
312 #
313 #  DgPhaseEndCallback -- visi calls this when a phase has started
314 #
315 proc DgPhaseEndCallback {phaseId} { 
316    EndUpdate $phaseId
317    return
318 }
319
320 #
321 #  DgPhaseDataCallback -- visi calls this when a phase has started
322 #
323 proc DgPhaseDataCallback {} {
324    
325    set max [expr int([Dg numphases])]
326    for {set phasecount 0} {$phasecount < $max} {incr phasecount} {
327        NameUpdate $phasecount
328        StartUpdate $phasecount
329        if {$phasecount < [expr $max - 1]} {
330            EndUpdate  $phasecount
331        }
332    }
333    
334    return
335 }
336
337
338
339 #
340 #  TimeLabel -- given a time value in seconds, format a nice label
341 #
342 #  note: If called often, this routine should be rewritten in C++.
343 proc TimeLabel {val} {
344   if {($val > 60) && ($val < 3600)} {
345     set min [expr $val / 60]
346     set sec [expr $val - ($min * 60)]
347     return [format "%d m %d s" $min $sec]
348   }
349   if {$val < 60} {
350     return [format "%d s" $val]
351   }
352   if {$val > 3600} {
353     set hr [expr $val / 3600]
354     set left [expr $val - ($hr * 3600)]
355     set min [expr $left / 60]
356     set sec [expr $left - ($min * 60)]
357     return [format "%d h %d m %d s" $hr $min $sec]
358   }
359   return "$val s"
360 }
361
362
363 #
364 # PhaseDef: ask paradyn to start a new phase
365 #
366 proc PhaseDef {phaseName withPC withVisis} {
367
368   Dg phase $phaseName $withPC $withVisis
369
370 }