initial implementation.
[dyninst.git] / visiClients / barchart / src / barChartTcl.C
1 // barChartTcl.C
2
3 // $Log: barChartTcl.C,v $
4 // Revision 1.1  1994/09/29 19:51:38  tamches
5 // initial implementation.
6 // Receiving point for visi lib callback routines.  Pretty much
7 // just calls the appropriate class member function in barChart.C
8 //
9
10 #include <iostream.h>
11
12 #include <tcl.h>
13 #include <tk.h>
14 #include "dg2.h" // for dataGrid[][]
15 #include "visi/h/visualization.h"
16 #include "barChart.h"
17
18 bool barChartIsValid = false;
19    // set to true ** after ** barChart::barChart
20    // until then, callbacks check this flag and do nothing
21
22 // findMostRecentBucket() is not necessary; I just found out that
23 // the parameter to Dg2NewDataCallback gives the bucket number
24 //int findMostRecentBucket() {
25 //   // Called by Dg2NewDataCallback
26 //
27 //   // Returns the LastBucketFilled value for the first Valid datagrid
28 //   // element we come across, which presumably is the same as returning
29 //   // the last bucket filled for the entire dataGrid (since the visi lib buffering
30 //   // ensures that a new-data-callback [Dg2NewDataCallback] wouldn't have been
31 //   // generated until every cell was filled with new bucket data)
32 //
33 //   for (unsigned m = 0; m < dataGrid.NumMetrics(); m++)
34 //      for (unsigned r = 0; r < dataGrid.NumResources(); r++)
35 //         if (dataGrid[m][r].Valid)
36 //            return dataGrid[m][r].LastBucketFilled();
37 //
38 //   return -1; // yikes -- no Valid datagrid elements (yet).  So we'll say that
39 //              // the last bucket filled was bucket -1
40 //}
41                
42 int Dg2NewDataCallback(int lastBucket) {
43    if (barChartIsValid) {
44       theBarChart->processNewData(lastBucket);
45       return TCL_OK;
46    }
47    else
48       return TCL_ERROR;
49 }
50
51 int resizeCallbackCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
52    // called from barChart.tcl when it detects a resize; gives our C++ code
53    // a chance to process the resize, too.
54
55    if (barChartIsValid) {
56       theBarChart->processResizeWindow();
57       return TCL_OK;
58    }
59    else
60       return TCL_ERROR;
61 }
62
63 int exposeCallbackCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
64    // called from barChart.tcl when it detects an expose; gives our C++ code
65    // a chance to process the expose, too.
66
67    if (barChartIsValid) {
68       theBarChart->processExposeWindow();
69       return TCL_OK;
70    }
71    else 
72       return TCL_ERROR;
73 }
74
75 int xAxisHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
76    // called from barChart.tcl when the x-axis layout has changed due to resize,
77    // insertion/deletion, etc; gives our C++ code a chance to update its
78    // internal structures.
79
80    if (barChartIsValid) {
81       //cout << "Welcome to xAxisHasChangedCommand" << endl;
82       theBarChart->RethinkMetricsAndResources();
83       //cout << "Leaving xAxisHasChangedCommand" << endl;
84
85       return TCL_OK;
86    }
87    else
88       return TCL_ERROR;
89 }
90
91 int yAxisHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
92    // called from barChart.tcl when the y-axis layout has changed due to resize,
93    // insertion/deletion, etc; gives our C++ code a chance to update its
94    // internal structures.
95
96    if (barChartIsValid) {
97       // cout << "Welcome to yAxisHasChangedCommand" << endl;
98       theBarChart->RethinkMetricsAndResources();
99       //cout << "Leaving yAxisHasChangedCommand" << endl;
100
101       return TCL_OK;
102    }
103    else
104       return TCL_ERROR;
105 }
106
107 int newScrollPositionCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
108    // called by tcl code when it's time to scroll the bars to a given value
109    if (barChartIsValid) {
110       int newPos = atoi(argv[1]);
111
112       theBarChart->processNewScrollPosition(newPos);
113       return TCL_OK;
114    }
115    else
116       return TCL_ERROR;
117 }
118
119 int dataFormatHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
120    if (barChartIsValid) {
121       theBarChart->rethinkDataFormat();
122       return TCL_OK;
123    }
124    else
125       return TCL_ERROR;
126 }
127
128
129 int launchBarChartCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
130    // called just once to fix some information needed by drawBarsCommand, especially
131    // the (sub-)window in which to draw.
132
133    // parameters:
134    // 1) window name (tk-style; e.g. ".top.middle.bar") of the area in which the bars are drawn
135    // 2) do you want double-buffering? ("doublebuffer" or "nodoublebuffer")
136    // 3) do you want no-flicker?       ("noflicker" or "flicker")
137    //       [you automatically get noflicker with doublebuffer]
138    // 4) initial numMetrics
139    // 5) initial numResources
140    // 6) flush flag (0 or 1); use 1 during debugging only
141
142    cout << "Welcome to launchBarChartCommand()" << endl;
143    
144    if (argc != 7)
145       panic("launchBarChartCommand() -- cannot create barchart (incorrect #args)");
146
147    char *wname = argv[1];
148    const int iNumMetrics = atoi(argv[4]);
149    const int iNumResources = atoi(argv[5]);
150    const bool iFlushFlag = (0==strcmp("1", argv[6]));
151    cout << "iFlushFlag is " << iFlushFlag << endl;
152    theBarChart = new BarChart(wname,
153                               0==strcmp("doublebuffer", argv[2]),
154                               0==strcmp("noflicker", argv[3]),
155                               iNumMetrics, iNumResources,
156                               iFlushFlag);
157    if (theBarChart == NULL)
158       panic("launchBarChartCommand() -- out of memory!");
159
160    barChartIsValid = true;
161    return TCL_OK;
162 }
163
164 void deleteLaunchBarChartCommand(ClientData cd) {
165    cout << "deleteLaunchBarChartCommand(): shutting down barChart internals" << endl;
166
167    barChartIsValid = false; // important!
168    delete theBarChart;
169 }
170
171 void deleteDummyProc(ClientData cd) { }
172    // do-nothing routine to be called when a command is deleted that
173    // doesn't require closing down...