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