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