dataFormatHasChangedCommand now takes in an arg
[dyninst.git] / visiClients / barchart / src / barChartTcl.C
1 // barChartTcl.C
2
3 /* $Log: barChartTcl.C,v $
4 /* Revision 1.9  1996/01/10 02:24:25  tamches
5 /* dataFormatHasChangedCommand now takes in an arg
6 /* added getMetricColorNameCommand
7 /* hardcoded barColorNames here
8 /*
9  * Revision 1.8  1995/09/22 19:25:29  tamches
10  * removed warnings under g++ 2.7.0
11  *
12  * Revision 1.7  1994/11/06  10:24:59  tamches
13  * minor cleanups (especially comments)
14  *
15  * Revision 1.6  1994/10/14  10:29:33  tamches
16  * commented out diagnosted message when gracefully closing
17  *
18  * Revision 1.5  1994/10/13  00:52:38  tamches
19  * Minor additions to support a new command related to sorting
20  * of resources
21  *
22  * Revision 1.4  1994/10/10  23:08:44  tamches
23  * preliminary changes on the way to swapping the x and y axes
24  *
25  * Revision 1.3  1994/10/10  14:36:17  tamches
26  * fixed some resizing bugs
27  *
28  * Revision 1.2  1994/09/29  20:05:37  tamches
29  * minor cvs fixes
30  *
31  * Revision 1.1  1994/09/29  19:51:38  tamches
32  * initial implementation.
33  * Receiving point for visi lib callback routines.  Pretty much
34  * just calls the appropriate class member function in barChart.C
35  *
36 */
37
38 #include <iostream.h>
39
40 #include <tcl.h>
41 #include <tk.h>
42 #include "dg2.h" // for dataGrid[][]
43 #include "visi/h/visualization.h"
44 #include "barChart.h"
45
46 bool barChartIsValid = false;
47    // set to true ** after ** barChart::barChart
48    // until then, callbacks check this flag and do nothing
49
50 int Dg2NewDataCallback(int lastBucket) {
51    if (barChartIsValid) {
52       theBarChart->processNewData(lastBucket);
53       return TCL_OK;
54    }
55    else
56       return TCL_ERROR;
57 }
58
59 int resizeCallbackCommand(ClientData, Tcl_Interp *, int argc, char **argv) {
60    // called from barChart.tcl when it detects a resize; gives our C++ code
61    // a chance to process the resize, too.
62
63    // params: new width, new height
64    if (barChartIsValid && argc==3) {
65       theBarChart->processResizeWindow(atoi(argv[1]), atoi(argv[2]));
66       return TCL_OK;
67    }
68    else
69       return TCL_ERROR;
70 }
71
72 int exposeCallbackCommand(ClientData, Tcl_Interp *, int, char **) {
73    // called from barChart.tcl when it detects an expose; gives our C++ code
74    // a chance to process the expose, too.
75
76    if (barChartIsValid) {
77       theBarChart->processExposeWindow();
78       return TCL_OK;
79    }
80    else
81       return TCL_ERROR;
82 }
83
84 int resourcesAxisHasChangedCommand(ClientData, Tcl_Interp *, int argc, char **) {
85    // called from barChart.tcl when the x-axis layout has changed due to resize,
86    // insertion/deletion, etc; gives our C++ code a chance to update its
87    // internal structures.
88
89    // arg: new width
90
91    if (barChartIsValid && argc==2) {
92       theBarChart->RethinkMetricsAndResources();
93       return TCL_OK;
94    }
95    else
96       return TCL_ERROR;
97 }
98
99 int metricsAxisHasChangedCommand(ClientData, Tcl_Interp *, int argc, char **) {
100    // called from barChart.tcl when the y-axis layout has changed due to resize,
101    // insertion/deletion, etc; gives our C++ code a chance to update its
102    // internal structures.
103
104    // argument: new height (but currently unused)
105
106    if (barChartIsValid && argc==2) {
107       theBarChart->RethinkMetricsAndResources();
108       return TCL_OK;
109    }
110    else
111       return TCL_ERROR;
112 }
113
114 int newScrollPositionCommand(ClientData, Tcl_Interp *, int, char **argv) {
115    // called by tcl code when it's time to scroll the bars to a given value.
116    // argument: new scrollbar position, in pixels.  Note: this is a bit old;
117    // shouldn't we change to tk4.0's floating point representation???
118
119    if (barChartIsValid) {
120       int newPos = atoi(argv[1]);
121       theBarChart->processNewScrollPosition(newPos);
122       return TCL_OK;
123    }
124    else
125       return TCL_ERROR;
126 }
127
128 int dataFormatHasChangedCommand(ClientData, Tcl_Interp *, int argc, char **argv) {
129    // rethink current vs. average vs. total
130    assert(argc == 2);
131    if (barChartIsValid) {
132       char *dataFormatString = argv[1];
133       if (0==strcmp(dataFormatString, "Instantaneous"))
134          theBarChart->rethinkDataFormat(BarChart::Current);
135       else if (0==strcmp(dataFormatString, "Average"))
136          theBarChart->rethinkDataFormat(BarChart::Average);
137       else if (0==strcmp(dataFormatString, "Sum"))
138          theBarChart->rethinkDataFormat(BarChart::Total);
139       else
140          panic("barChart dataFormatHasChangedCommand: unrecognized argument");
141       return TCL_OK;
142    }
143    else
144       return TCL_ERROR;
145 }
146
147 int rethinkIndirectResourcesCommand(ClientData, Tcl_Interp *, int, char **) {
148    // rethink how things are sorted
149    if (barChartIsValid) {
150       theBarChart->rethinkIndirectResources();
151       return TCL_OK;
152    }
153    else
154       return TCL_ERROR;
155 }
156
157 int getMetricColorNameCommand(ClientData, Tcl_Interp *interp,
158                               int argc, char **argv) {
159    // argument: metric index
160    assert(argc==2);
161    unsigned index = atoi(argv[1]);
162
163    const string &result = theBarChart->getMetricColorName(index);
164    strcpy(interp->result, result.string_of());
165    return TCL_OK;
166 }
167
168 int launchBarChartCommand(ClientData, Tcl_Interp *, int argc, char **argv) {
169    // called just once to fix some information needed by drawBarsCommand, especially
170    // the (sub-)window in which to draw.
171
172    // parameters:
173    // 1) window name (tk-style; e.g. ".top.middle.bar") of the area in which the bars
174    //    are drawn.
175    // 2) do you want double-buffering? ("doublebuffer" or "nodoublebuffer")
176    // 3) do you want no-flicker?       ("noflicker" or "flicker")
177    //       [you automatically get noflicker with doublebuffer]
178    // 4) initial numMetrics
179    // 5) initial numResources
180    // 6) flush flag (0 or 1); use 1 during debugging only
181
182    // cout << "Welcome to launchBarChartCommand()" << endl;
183    
184    if (argc != 7)
185       panic("launchBarChartCommand() -- cannot create barchart (incorrect #args)");
186
187    char *wname = argv[1];
188    const int iNumMetrics   = atoi(argv[4]);
189    const int iNumResources = atoi(argv[5]);
190 //   const bool iFlushFlag = (0==strcmp("1", argv[6]));
191
192    // bar colors: (see /usr/lib/X11/rgb.txt)
193    vector<string> barColorNames;
194    barColorNames += "cornflower blue";
195    barColorNames += "medium sea green";
196    barColorNames += "hotpink";
197    barColorNames += "chocolate";
198    barColorNames += "orange";
199
200    theBarChart = new BarChart(wname, iNumMetrics, iNumResources, barColorNames);
201    assert(theBarChart);
202
203    barChartIsValid = true;
204    return TCL_OK;
205 }
206
207 void deleteLaunchBarChartCommand(ClientData) {
208    // cout << "Gracefully closing down barchart..." << endl;
209
210    barChartIsValid = false; // important!
211    delete theBarChart;
212 }
213
214 void deleteDummyProc(ClientData) { }
215    // do-nothing routine to be called when a command is deleted that
216    // doesn't require closing down...