removed some warnings
[dyninst.git] / visiClients / tableVisi / src / tableVisiTcl.C
1 // tableVisiTcl.C
2 // Ariel Tamches
3
4 /*
5  * $Log: tableVisiTcl.C,v $
6  * Revision 1.5  1995/12/08 05:52:35  tamches
7  * removed some warnings
8  *
9  * Revision 1.4  1995/12/03 21:09:29  newhall
10  * changed units labeling to match type of data being displayed
11  *
12  * Revision 1.3  1995/11/15  01:07:15  tamches
13  * redrawing of a cell takes place as soon as new data arrives for it; we no
14  * longer redraw only last-common-bucket-among-all-mids
15  *
16  * Revision 1.2  1995/11/08 21:56:05  tamches
17  * when-idle routine does a tryFirst()
18  * fold, invalidmetrics, phasename callbacks gone since unused
19  * sigFigChangeCommand reads from tcl vrble SignificantDigits instead
20  *    of argv
21  * removed unInstallTableVisiCommands, since not useful
22  *
23  * Revision 1.1  1995/11/04 00:48:25  tamches
24  * First version of new table visi
25  *
26  */
27
28 #include <iostream.h>
29
30 #include "tclclean.h"
31 #include "tkclean.h"
32 #include "tkTools.h"
33
34 #include "tableVisi.h"
35 #include "visi/h/visualization.h"
36
37 #include "tableVisiTcl.h"
38
39 /* ************************************************************* */
40
41 extern tableVisi *theTableVisi; // our main data structure
42 extern bool xsynch_flag;
43 unsigned currFormat=0; // 0 --> current; 1 --> averages; 2 --> totals
44
45 /* ************************************************************* */
46
47 void tableWhenIdleDrawRoutine(ClientData) {
48    if (theTableVisi->tryFirst())
49       theTableVisi->draw(xsynch_flag);
50 }
51 tkInstallIdle tableDrawWhenIdle(&tableWhenIdleDrawRoutine);
52
53 /* ************************************************************* */
54
55 int Dg2NewDataCallback(int) {
56 //   cout << "Dg2NewDataCallback (c++)" << endl;
57    if (theTableVisi == NULL) { 
58       cout << "Dg2NewDataCallback tableVisi: missed an early sample since not yet initialized" << endl;
59       return TCL_OK;
60    }
61
62    const unsigned numMetrics = theTableVisi->getNumMetrics();
63    const unsigned numFoci = theTableVisi->getNumFoci();
64
65    for (unsigned metriclcv=0; metriclcv < numMetrics; metriclcv++) {
66       visi_GridHistoArray &metricValues = dataGrid[metriclcv];
67     
68       for (unsigned focuslcv=0; focuslcv < numFoci; focuslcv++) {
69          visi_GridCellHisto &theCell = metricValues[focuslcv];
70          // const unsigned bucketToUse = lastBucket;
71          const unsigned bucketToUse = theCell.LastBucketFilled();
72
73          if (!theCell.Valid)
74             theTableVisi->invalidateCell(metriclcv, focuslcv);
75          else if (currFormat==0) // current values
76             theTableVisi->setCellValidData(metriclcv, focuslcv,
77                                            theCell.Value(bucketToUse));
78          else if (currFormat==1) // average values
79             theTableVisi->setCellValidData(metriclcv, focuslcv,
80                                            dataGrid.AggregateValue(metriclcv,
81                                                                    focuslcv));
82          else if (currFormat==2) // total values
83             theTableVisi->setCellValidData(metriclcv, focuslcv,
84                                            dataGrid.SumValue(metriclcv, focuslcv));
85       }
86    }
87
88    tableDrawWhenIdle.install(NULL);
89    return TCL_OK;
90 }
91
92 int Dg2AddMetricsCallback(int) {
93    // completely rethink metrics and resources
94    // very ugly; necessary because the visilib interface
95    // is rather crude in this area.
96    // Nevertheless, an improved version of this routine can avoid
97    // rethinking everything, by making a pass over the dataGrid to
98    // _manually_ compute what has actually changed.
99
100    extern Tcl_Interp *mainInterp;
101    theTableVisi->clearMetrics(mainInterp);
102    unsigned newNumMetrics = dataGrid.NumMetrics();
103    for (unsigned metriclcv=0; metriclcv < newNumMetrics; metriclcv++)
104        if (currFormat==0) // current values
105             theTableVisi->addMetric(dataGrid.MetricName(metriclcv),
106                               dataGrid.MetricLabel(metriclcv));
107        else if (currFormat==1) // average values
108             theTableVisi->addMetric(dataGrid.MetricName(metriclcv),
109                               dataGrid.MetricAveLabel(metriclcv));
110        else if (currFormat==2) // total values
111             theTableVisi->addMetric(dataGrid.MetricName(metriclcv),
112                               dataGrid.MetricSumLabel(metriclcv));
113
114    theTableVisi->clearFoci(mainInterp);
115    unsigned newNumFoci = dataGrid.NumResources();
116    for (unsigned focuslcv=0; focuslcv < newNumFoci; focuslcv++)
117       theTableVisi->addFocus(dataGrid.ResourceName(focuslcv));
118
119    // now update the sorting, as applicable
120    char *sortMetricsStr = Tcl_GetVar(mainInterp, "sortMetrics", TCL_GLOBAL_ONLY);
121    bool sortMetricsFlag = atoi(sortMetricsStr);
122    if (sortMetricsFlag)
123       theTableVisi->sortMetrics();
124    else
125       theTableVisi->unsortMetrics();
126
127    char *sortFociStr = Tcl_GetVar(mainInterp, "sortFoci", TCL_GLOBAL_ONLY);
128    bool sortFociFlag = atoi(sortFociStr);
129    if (sortFociFlag)
130       theTableVisi->sortFoci();
131    else
132       theTableVisi->unsortFoci();
133
134    theTableVisi->resize(mainInterp);
135    tableDrawWhenIdle.install(NULL);
136
137    return TCL_OK;
138 }
139
140 //int Dg2Fold(int) {
141 //   cout << "welcome to Dg2Fold" << endl;
142 //   tableDrawWhenIdle.install(NULL);
143 //
144 //   return TCL_OK;
145 //}
146
147 //int Dg2InvalidMetricsOrResources(int) {
148 //   cout << "welcome to Dg2InvalidMetricsOrResources" << endl;
149 ////   myTclEval(MainInterp, "DgInvalidCallback");
150 //   tableDrawWhenIdle.install(NULL);
151 //
152 //   return TCL_OK;
153 //}
154
155 //int Dg2PhaseNameCallback(int) {
156 //   cout << "welcome to Dg2PhaseNameCallback" << endl;
157 ////   myTclEval(MainInterp, "DgPhaseCallback");
158 //   tableDrawWhenIdle.install(NULL);
159 //
160 //   return TCL_OK;
161 //}
162
163 /* ************************************************************* */
164
165 void dummyDeleteProc(ClientData) {}
166
167 int tableVisiNewVertScrollPositionCommand(ClientData, Tcl_Interp *interp,
168                                           int argc, char **argv) {
169    // The arguments will be one of:
170    // 1) moveto [fraction]
171    // 2) scroll [num-units] unit   (num-units is always either -1 or 1)
172    // 3) scroll [num-pages] page   (num-pages is always either -1 or 1)
173    // we let processScrollCallback handle 'em
174
175    float newFirst;
176    bool anyChanges = processScrollCallback(interp, argc, argv,
177                                            ".vertScrollbar",
178                                            theTableVisi->get_offset_y(),
179                                            theTableVisi->get_total_cell_y_pix(),
180                                            theTableVisi->get_visible_y_pix(),
181                                            newFirst);
182    
183    if (anyChanges)
184       anyChanges = theTableVisi->adjustVertSBOffset(interp, newFirst);
185
186    if (anyChanges)
187       tableDrawWhenIdle.install(NULL);
188
189    return TCL_OK;
190 }
191
192 int tableVisiNewHorizScrollPositionCommand(ClientData, Tcl_Interp *interp,
193                                            int argc, char **argv) {
194    // The arguments will be one of:
195    // 1) moveto [fraction]
196    // 2) scroll [num-units] unit   (num-units is always either -1 or 1)
197    // 3) scroll [num-pages] page   (num-pages is always either -1 or 1)
198    // we let processScrollCallback handle 'em
199
200    float newFirst;
201    bool anyChanges = processScrollCallback(interp, argc, argv,
202                                            ".horizScrollbar",
203                                            theTableVisi->get_offset_x(),
204                                            theTableVisi->get_total_cell_x_pix(),
205                                            theTableVisi->get_visible_x_pix(),
206                                            newFirst);
207    
208    if (anyChanges)
209       anyChanges = theTableVisi->adjustHorizSBOffset(interp, newFirst);
210
211    if (anyChanges)
212       tableDrawWhenIdle.install(NULL);
213
214    return TCL_OK;
215 }
216
217 int tableVisiConfigureCommand(ClientData, Tcl_Interp *interp,
218                               int, char **) {
219    assert(theTableVisi->tryFirst());
220    theTableVisi->resize(interp); // adjusts scrollbar
221    tableDrawWhenIdle.install(NULL);
222
223    return TCL_OK;
224 }
225
226 int tableVisiExposeCommand(ClientData, Tcl_Interp *,
227                            int, char **) {
228    assert(theTableVisi->tryFirst());
229    tableDrawWhenIdle.install(NULL);
230
231    return TCL_OK;
232 }
233
234 int updateNamesCommand(ClientData, Tcl_Interp *interp,
235                        int argc, char **argv) {
236    assert(argc==2);
237 //   cout << "welcome to updateNamesCommand: arg is " << argv[1] << endl;
238
239    assert(theTableVisi->tryFirst());
240
241    if (theTableVisi->setFocusNameMode(interp, (bool)atoi(argv[1])))
242       tableDrawWhenIdle.install(NULL);
243
244    return TCL_OK;
245 }
246
247 int sigFigChangeCommand(ClientData, Tcl_Interp *interp,
248                         int argc, char **) {
249    assert(argc == 1);
250
251    char *sigFigStr = Tcl_GetVar(interp, "SignificantDigits", TCL_GLOBAL_ONLY);
252    if (sigFigStr == NULL)
253       tclpanic(interp, "could not find vrble SignificantDigits");
254
255    int newNumSigFigs = atoi(sigFigStr);
256
257    assert(theTableVisi->tryFirst());
258
259    if (theTableVisi->setSigFigs(newNumSigFigs))
260       tableDrawWhenIdle.install(NULL);
261
262    return TCL_OK;
263 }
264
265 int sortMetricsCommand(ClientData, Tcl_Interp *,
266                        int, char **) {
267    theTableVisi->sortMetrics();
268    if (theTableVisi->tryFirst())
269       tableDrawWhenIdle.install(NULL);
270    return TCL_OK;
271 }
272
273 int unsortMetricsCommand(ClientData, Tcl_Interp *,
274                        int, char **) {
275    theTableVisi->unsortMetrics();
276    if (theTableVisi->tryFirst())
277       tableDrawWhenIdle.install(NULL);
278    return TCL_OK;
279 }
280
281 int sortFociCommand(ClientData, Tcl_Interp *,
282                        int, char **) {
283    theTableVisi->sortFoci();
284    if (theTableVisi->tryFirst())
285       tableDrawWhenIdle.install(NULL);
286    return TCL_OK;
287 }
288
289 int unsortFociCommand(ClientData, Tcl_Interp *,
290                        int, char **) {
291    theTableVisi->unsortFoci();
292    if (theTableVisi->tryFirst())
293       tableDrawWhenIdle.install(NULL);
294    return TCL_OK;
295 }
296
297 int formatChangedCommand(ClientData, Tcl_Interp *interp,
298                          int, char **) {
299    char *dataFormatStr = Tcl_GetVar(interp, "DataFormat", TCL_GLOBAL_ONLY);
300    if (dataFormatStr == NULL)
301       tclpanic(interp, "could not find DataFormat tcl vrble");
302
303    int dataFormat = atoi(dataFormatStr);
304    currFormat = dataFormat;
305
306    for(unsigned i =0; i < dataGrid.NumMetrics(); i++){
307        if (currFormat==0) // current values
308             theTableVisi->changeUnitsLabel(i, dataGrid.MetricLabel(i));
309        else if (currFormat==1) // average values
310             theTableVisi->changeUnitsLabel(i, dataGrid.MetricAveLabel(i));
311        else // total values
312             theTableVisi->changeUnitsLabel(i, dataGrid.MetricSumLabel(i));
313    }
314
315    Dg2AddMetricsCallback(0);
316
317    return TCL_OK;
318 }
319
320 void installTableVisiCommands(Tcl_Interp *interp) {
321    Tcl_CreateCommand(interp, "horizScrollbarNewScrollPosition",
322                      tableVisiNewHorizScrollPositionCommand,
323                      NULL, dummyDeleteProc);
324    Tcl_CreateCommand(interp, "vertScrollbarNewScrollPosition",
325                      tableVisiNewVertScrollPositionCommand,
326                      NULL, dummyDeleteProc);
327
328    Tcl_CreateCommand(interp, "tableVisiConfigure",
329                      tableVisiConfigureCommand,
330                      NULL, dummyDeleteProc);
331    Tcl_CreateCommand(interp, "tableVisiExpose",
332                      tableVisiExposeCommand,
333                      NULL, dummyDeleteProc);
334
335    Tcl_CreateCommand(interp, "updateNames",
336                      updateNamesCommand,
337                      NULL, dummyDeleteProc);
338
339    Tcl_CreateCommand(interp, "sigFigChange",
340                      sigFigChangeCommand,
341                      NULL, dummyDeleteProc);
342
343    Tcl_CreateCommand(interp, "sortMetrics",
344                      sortMetricsCommand,
345                      NULL, dummyDeleteProc);
346    Tcl_CreateCommand(interp, "unsortMetrics",
347                      unsortMetricsCommand,
348                      NULL, dummyDeleteProc);
349
350    Tcl_CreateCommand(interp, "sortFoci",
351                      sortFociCommand,
352                      NULL, dummyDeleteProc);
353    Tcl_CreateCommand(interp, "unsortFoci",
354                      unsortFociCommand,
355                      NULL, dummyDeleteProc);
356
357    Tcl_CreateCommand(interp, "formatChanged",
358                      formatChangedCommand,
359                      NULL, dummyDeleteProc);
360 }