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