minor cleanups (especially comments)
[dyninst.git] / visiClients / barchart / src / barChartTcl.C
1 // barChartTcl.C
2
3 /* $Log: barChartTcl.C,v $
4 /* Revision 1.7  1994/11/06 10:24:59  tamches
5 /* minor cleanups (especially comments)
6 /*
7  * Revision 1.6  1994/10/14  10:29:33  tamches
8  * commented out diagnosted message when gracefully closing
9  *
10  * Revision 1.5  1994/10/13  00:52:38  tamches
11  * Minor additions to support a new command related to sorting
12  * of resources
13  *
14  * Revision 1.4  1994/10/10  23:08:44  tamches
15  * preliminary changes on the way to swapping the x and y axes
16  *
17  * Revision 1.3  1994/10/10  14:36:17  tamches
18  * fixed some resizing bugs
19  *
20  * Revision 1.2  1994/09/29  20:05:37  tamches
21  * minor cvs fixes
22  *
23  * Revision 1.1  1994/09/29  19:51:38  tamches
24  * initial implementation.
25  * Receiving point for visi lib callback routines.  Pretty much
26  * just calls the appropriate class member function in barChart.C
27  *
28 */
29
30 #include <iostream.h>
31
32 #include <tcl.h>
33 #include <tk.h>
34 #include "dg2.h" // for dataGrid[][]
35 #include "visi/h/visualization.h"
36 #include "barChart.h"
37
38 bool barChartIsValid = false;
39    // set to true ** after ** barChart::barChart
40    // until then, callbacks check this flag and do nothing
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    // params: new width, new height
56    if (barChartIsValid && argc==3) {
57       theBarChart->processResizeWindow(atoi(argv[1]), atoi(argv[2]));
58       return TCL_OK;
59    }
60    else
61       return TCL_ERROR;
62 }
63
64 int exposeCallbackCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
65    // called from barChart.tcl when it detects an expose; gives our C++ code
66    // a chance to process the expose, too.
67
68    if (barChartIsValid) {
69       theBarChart->processExposeWindow();
70       return TCL_OK;
71    }
72    else
73       return TCL_ERROR;
74 }
75
76 int resourcesAxisHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
77    // called from barChart.tcl when the x-axis layout has changed due to resize,
78    // insertion/deletion, etc; gives our C++ code a chance to update its
79    // internal structures.
80
81    // arg: new width
82
83    if (barChartIsValid && argc==2) {
84       theBarChart->RethinkMetricsAndResources();
85
86       return TCL_OK;
87    }
88    else
89       return TCL_ERROR;
90 }
91
92 int metricsAxisHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
93    // called from barChart.tcl when the y-axis layout has changed due to resize,
94    // insertion/deletion, etc; gives our C++ code a chance to update its
95    // internal structures.
96
97    // argument: new height
98
99    if (barChartIsValid && argc==2) {
100       theBarChart->RethinkMetricsAndResources();
101
102       return TCL_OK;
103    }
104    else
105       return TCL_ERROR;
106 }
107
108 int newScrollPositionCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
109    // called by tcl code when it's time to scroll the bars to a given value
110    if (barChartIsValid) {
111       int newPos = atoi(argv[1]);
112
113       theBarChart->processNewScrollPosition(newPos);
114       return TCL_OK;
115    }
116    else
117       return TCL_ERROR;
118 }
119
120 int dataFormatHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
121    if (barChartIsValid) {
122       theBarChart->rethinkDataFormat();
123       return TCL_OK;
124    }
125    else
126       return TCL_ERROR;
127 }
128
129 int rethinkIndirectResourcesCommand(ClientData, Tcl_Interp *, int argc, char **argv) {
130    if (barChartIsValid) {
131       theBarChart->rethinkIndirectResources();
132       return TCL_OK;
133    }
134    else
135       return TCL_ERROR;
136 }
137
138 int launchBarChartCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
139    // called just once to fix some information needed by drawBarsCommand, especially
140    // the (sub-)window in which to draw.
141
142    // parameters:
143    // 1) window name (tk-style; e.g. ".top.middle.bar") of the area in which the bars are drawn
144    // 2) do you want double-buffering? ("doublebuffer" or "nodoublebuffer")
145    // 3) do you want no-flicker?       ("noflicker" or "flicker")
146    //       [you automatically get noflicker with doublebuffer]
147    // 4) initial numMetrics
148    // 5) initial numResources
149    // 6) flush flag (0 or 1); use 1 during debugging only
150
151    // cout << "Welcome to launchBarChartCommand()" << endl;
152    
153    if (argc != 7)
154       panic("launchBarChartCommand() -- cannot create barchart (incorrect #args)");
155
156    char *wname = argv[1];
157    const int iNumMetrics   = atoi(argv[4]);
158    const int iNumResources = atoi(argv[5]);
159    const bool iFlushFlag = (0==strcmp("1", argv[6]));
160
161    theBarChart = new BarChart(wname,
162                               0==strcmp("doublebuffer", argv[2]),
163                               0==strcmp("noflicker", argv[3]),
164                               iNumMetrics, iNumResources,
165                               iFlushFlag);
166    if (theBarChart == NULL)
167       panic("launchBarChartCommand() -- out of memory!");
168
169    barChartIsValid = true;
170    return TCL_OK;
171 }
172
173 void deleteLaunchBarChartCommand(ClientData cd) {
174    // cout << "Gracefully closing down barchart..." << endl;
175
176    barChartIsValid = false; // important!
177    delete theBarChart;
178 }
179
180 void deleteDummyProc(ClientData cd) { }
181    // do-nothing routine to be called when a command is deleted that
182    // doesn't require closing down...