Minor additions to support a new command related to sorting
[dyninst.git] / visiClients / barchart / barChartTcl.C
1 // barChartTcl.C
2
3 /* $Log: barChartTcl.C,v $
4 /* Revision 1.5  1994/10/13 00:52:38  tamches
5 /* Minor additions to support a new command related to sorting
6 /* of resources
7 /*
8  * Revision 1.4  1994/10/10  23:08:44  tamches
9  * preliminary changes on the way to swapping the x and y axes
10  *
11  * Revision 1.3  1994/10/10  14:36:17  tamches
12  * fixed some resizing bugs
13  *
14  * Revision 1.2  1994/09/29  20:05:37  tamches
15  * minor cvs fixes
16  *
17  * Revision 1.1  1994/09/29  19:51:38  tamches
18  * initial implementation.
19  * Receiving point for visi lib callback routines.  Pretty much
20  * just calls the appropriate class member function in barChart.C
21  *
22 */
23
24 #include <iostream.h>
25
26 #include <tcl.h>
27 #include <tk.h>
28 #include "dg2.h" // for dataGrid[][]
29 #include "visi/h/visualization.h"
30 #include "barChart.h"
31
32 bool barChartIsValid = false;
33    // set to true ** after ** barChart::barChart
34    // until then, callbacks check this flag and do nothing
35
36 int Dg2NewDataCallback(int lastBucket) {
37    if (barChartIsValid) {
38       theBarChart->processNewData(lastBucket);
39       return TCL_OK;
40    }
41    else
42       return TCL_ERROR;
43 }
44
45 int resizeCallbackCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
46    // called from barChart.tcl when it detects a resize; gives our C++ code
47    // a chance to process the resize, too.
48
49    // params: new width, new height
50    if (barChartIsValid && argc==3) {
51       theBarChart->processResizeWindow(atoi(argv[1]), atoi(argv[2]));
52       return TCL_OK;
53    }
54    else
55       return TCL_ERROR;
56 }
57
58 int exposeCallbackCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
59    // called from barChart.tcl when it detects an expose; gives our C++ code
60    // a chance to process the expose, too.
61
62    if (barChartIsValid) {
63       theBarChart->processExposeWindow();
64       return TCL_OK;
65    }
66    else 
67       return TCL_ERROR;
68 }
69
70 int resourcesAxisHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
71    // called from barChart.tcl when the x-axis layout has changed due to resize,
72    // insertion/deletion, etc; gives our C++ code a chance to update its
73    // internal structures.
74
75    // arg: new width
76
77    if (barChartIsValid && argc==2) {
78       theBarChart->RethinkMetricsAndResources();
79
80       return TCL_OK;
81    }
82    else
83       return TCL_ERROR;
84 }
85
86 int metricsAxisHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
87    // called from barChart.tcl when the y-axis layout has changed due to resize,
88    // insertion/deletion, etc; gives our C++ code a chance to update its
89    // internal structures.
90
91    // argument: new height
92
93    if (barChartIsValid && argc==2) {
94       theBarChart->RethinkMetricsAndResources();
95
96       return TCL_OK;
97    }
98    else
99       return TCL_ERROR;
100 }
101
102 int newScrollPositionCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
103    // called by tcl code when it's time to scroll the bars to a given value
104    if (barChartIsValid) {
105       int newPos = atoi(argv[1]);
106
107       theBarChart->processNewScrollPosition(newPos);
108       return TCL_OK;
109    }
110    else
111       return TCL_ERROR;
112 }
113
114 int dataFormatHasChangedCommand(ClientData cd, Tcl_Interp *interp, int argc, char **argv) {
115    if (barChartIsValid) {
116       theBarChart->rethinkDataFormat();
117       return TCL_OK;
118    }
119    else
120       return TCL_ERROR;
121 }
122
123 int rethinkIndirectResourcesCommand(ClientData, Tcl_Interp *, int argc, char **argv) {
124    if (barChartIsValid) {
125       theBarChart->rethinkIndirectResources();
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
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...