Updated processing of pd_flag variable so that startup logic is shared
[dyninst.git] / visiClients / tableVisi / src / tableVisi.h
1 /*
2  * Copyright (c) 1996-1999 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 // tableVisi.h
43 // Ariel Tamches
44
45 /*
46  * $Log: tableVisi.h,v $
47  * Revision 1.9  2000/07/28 17:23:01  pcroth
48  * Updated #includes to reflect util library split
49  *
50  * Revision 1.8  1999/07/13 17:16:11  pcroth
51  * Fixed ordering problem of destroying GUI and destructing static variable
52  * pdLogo::all_logos.  On NT, the static variable is destroyed before the
53  * GUI, but a callback for the GUI ends up referencing the variable causing
54  * an access violation error.
55  *
56  * Revision 1.7  1999/03/13 15:24:05  pcroth
57  * Added support for building under Windows NT
58  *
59  * Revision 1.6  1996/08/16 21:36:58  tamches
60  * updated copyright for release 1.1
61  *
62  * Revision 1.5  1995/12/22 22:43:08  tamches
63  * selection
64  * deletion
65  * sort foci by value
66  *
67  * Revision 1.4  1995/12/19 00:44:39  tamches
68  * changeUnitsLabel now takes in a string &, not char *
69  *
70  * Revision 1.3  1995/12/03 21:09:27  newhall
71  * changed units labeling to match type of data being displayed
72  *
73  * Revision 1.2  1995/11/08  21:47:04  tamches
74  * removed some unused members
75  *
76  * Revision 1.1  1995/11/04 00:45:19  tamches
77  * First version of new table visi
78  *
79  */
80
81 #ifndef _TABLE_VISI_H_
82 #define _TABLE_VISI_H_
83
84 #include "common/h/String.h"
85 #include "common/h/Vector.h"
86 #include "minmax.h"
87
88 #include "tcl.h"
89 #include "tk.h"
90 #include "tkTools.h"
91
92 #include "tvMetric.h"
93 #include "tvFocus.h"
94 #include "tvCell.h"
95
96 class tableVisi {
97  private:
98    vector<tvMetric> metrics;
99    vector<tvFocus> foci;
100    vector<unsigned> indirectMetrics; // for sorting
101    vector<unsigned> indirectFoci;    // for sorting
102    vector< vector<tvCell> > cells;   // array[metrics] of array[foci]
103    bool focusLongNameMode;
104    unsigned numSigFigs;
105    char conversionString[100]; // e.g. "%.5g" if numSigFigs is currently 5
106
107  public:
108    enum selection {rowOnly, colOnly, cell, none};
109
110  private:
111    selection theSelection;
112    // The value of "theSelection" guides how to interpret the following 2 vrbles;
113    // in particular, one or both may be undefined.  Question: should these be
114    // in sorted or "real" order.  Currently, it's sorted.
115    unsigned selectedRow;
116    unsigned selectedCol;
117
118    Tk_Window theTkWindow;
119    Display *theDisplay; // needed only in the destructor
120    Pixmap offscreenPixmap;
121    XColor *backgroundColor; // for erasing the offscreen pixmap...
122    GC backgroundGC;         // ...same
123    XColor *highlightedBackgroundColor; // for drawing selected cells...
124    GC highlightedBackgroundGC;         // ...same
125
126    int offset_x, offset_y; // <= 0
127    int all_cells_width, all_cells_height; // # pixels needed in horiz, vert sb's
128
129    Tk_Font      metricNameFont;
130    Tk_Font      metricUnitsFont;
131    Tk_Font      focusNameFont;
132    Tk_Font      cellFont;
133    Tk_FontMetrics       metricNameFontMetrics;
134    Tk_FontMetrics       metricUnitsFontMetrics;
135    Tk_FontMetrics       focusNameFontMetrics;
136    Tk_FontMetrics       cellFontMetrics;
137    unsigned maxFocusNamePixWidth; // max of foci[].getNamePixWidth()
138
139    XColor *lineColor; GC lineColorGC;
140    XColor *metricNameColor; GC metricNameGC;
141    XColor *metricUnitsColor; GC metricUnitsGC;
142    XColor *focusNameColor; GC focusNameGC;
143    XColor *cellColor; GC cellGC;
144
145  private:
146
147    void updateConversionString();
148    void double2string(char *, double) const;
149
150    Tk_Font myTkGetFont(Tcl_Interp*, const string &fontName) const;
151    XColor *myTkGetColor(Tcl_Interp *, const string &colorName) const;
152    void resizeScrollbars(Tcl_Interp *);
153    bool adjustHorizSBOffset(Tcl_Interp *interp);
154    bool adjustVertSBOffset(Tcl_Interp *interp);
155
156    // private metric helper functions
157    void drawMetricNames(Drawable) const;
158    void drawMetricVertLine(Drawable, int x) const;
159    unsigned getMetricAreaPixHeight() const;
160    unsigned getMetricNameBaseline() const; // assumes 0 is top y coord of metric area
161    unsigned getMetricUnitsBaseline() const; // assumes 0 is top y coord of metric area
162    bool xpix2col(int x, unsigned &theColumn) const;
163       // sets theColumn and returns true iff the pixel is within some column.
164       // note that x should _not_ be adjusted for scrollbar; we take care of that
165    int metric2xpix(unsigned theColumn) const;
166       // returns the x coord where this column starts.  Do not adjust for the
167       // scrollbar; we do that for you.
168
169    // private focus helper functions
170    void drawFocusNames(Drawable) const;
171    void drawFocusHorizLine(Drawable, int y) const;
172    unsigned getFocusLinePixHeight() const;
173    unsigned getVertPixFocusTop2Baseline() const;
174    unsigned getHorizPixBeforeFocusName() const {return 3;}
175    unsigned getFocusAreaPixWidth() const;
176    bool ypix2row(int y, unsigned &theRow) const;
177       // sets therow and returns true iff the y coord is w/in some row.
178       // note that y should _not_ be adjusted for scrollbar; we take care of that.
179    int focus2ypix(unsigned theRow) const;
180       // returns the y coord where this row starts.  Do not adjust for the scrollbar;
181       // we do that for you.
182
183    // private cell helper functions
184    void drawCells(Drawable) const;
185    void drawCells1Col(Drawable, int middle_x, int top_y,
186                       const vector<tvCell> &thisMetricCells) const;
187    unsigned getVertPixCellTop2Baseline() const;
188
189    // helper function for drawing
190    void drawHighlightBackground(Drawable) const;
191
192    // helper functions for sorting
193    void sortMetrics(int left, int right);
194    int partitionMetrics(int left, int right);
195
196    void sortFoci(int left, int right);
197    void sortFociByValues(const vector<tvCell> &theMetricColumn, int left, int right);
198    int partitionFoci(int left, int right);
199    int partitionFociByValues(const vector<tvCell> &, int left, int right);
200
201  public:
202    tableVisi(Tcl_Interp *interp,
203              Tk_Window iTkWindow,
204              const string &metricNameFontName,
205              const string &metricUnitsFontName,
206              const string &focusFontName,
207              const string &cellFontName,
208              const string &iLineColorName,
209              const string &iMetricColorName,
210              const string &iMetricUnitsColorName,
211              const string &iFocusColorName,
212              const string &cellColorName,
213              const string &backgroundColorName,
214              const string &highlightedBackgroundColorName,
215              unsigned iSigFigs
216              );
217   ~tableVisi();
218
219    bool tryFirst();
220    void resize(Tcl_Interp *); // does not redraw
221
222    void draw(bool xsynch) const;
223
224    unsigned getNumMetrics() const {return metrics.size();}
225    unsigned getNumFoci()    const {return foci.size();}
226
227    void clearMetrics(Tcl_Interp *interp);
228    void clearFoci(Tcl_Interp *interp);
229
230    void addMetric(unsigned iVisiLibMetId,
231                   const string &metricName, const string &metricUnits);
232    void addFocus(unsigned iVisiLibFocusId, const string &focusName);
233    void changeUnitsLabel(unsigned which, const string &new_name);
234
235    // The following routines should be followed by a call to resize(), in order
236    // to make the scrollbars, etc. coherent again:
237    void deleteMetric(unsigned theColumn); // theColumn is in sorted order
238    void deleteFocus(unsigned theRow); // theRow is in sorted order
239
240    void sortMetrics(); // may change selectedCol, as appropriate.
241    void unsortMetrics(); // may change selectedCol, as appropriate.
242
243    void sortFoci(); // may change selectedRow, as appropriate
244    bool sortFociByValues(); // may change selectedRow, as appropriate
245       // If a column (metric) is selected, sort all foci according to that col.
246       // Returns true iff successful (if exactly 1 metric col was selected)
247    void unsortFoci(); // may change selectedRow, as appopriate
248
249    bool setFocusNameMode(Tcl_Interp *interp, bool longNameMode);
250       // returns true iff any changes
251
252    bool setSigFigs(unsigned);
253       // returns true iff any changes.  Can change column widths.
254
255    void invalidateCell(unsigned theMetric, unsigned theFocus);
256       // theMetric and theFocus are _not_ in sorted order; they're the real thing
257    void setCellValidData(unsigned theMetric, unsigned theFocus, double data);
258       // theMetric and theFocus are _not_ in sorted order; they're the real thing
259
260    int get_offset_x() const {return offset_y;}
261    int get_offset_y() const {return offset_y;}
262
263    int get_total_cell_x_pix() const {return all_cells_width;}
264    int get_total_cell_y_pix() const {return all_cells_height;}
265
266    int get_visible_x_pix() const {return Tk_Width(theTkWindow);}
267    int get_visible_y_pix() const {return Tk_Height(theTkWindow);}
268
269    bool adjustHorizSBOffset(Tcl_Interp *, float newFirst);
270    bool adjustVertSBOffset(Tcl_Interp *, float newFirst);
271
272    bool processClick(int x, int y);
273       // make a row, col, or cell selection or unselection, based on coords relative
274       // to the upper-left pixel of the table (i.e. _not_ adjusted for scrollbar
275       // settings; we do that for you)
276       // returns true iff any changes were made, in which case outside code should
277       // probably launch a redraw operation...
278    selection getSelection() const {return theSelection;}
279    unsigned getSelectedMetId() const {
280       assert(theSelection == cell || theSelection == colOnly);
281       return col2MetId(selectedCol);
282    }
283    unsigned getSelectedCol() const {
284       assert(theSelection == cell || theSelection == colOnly);
285       return selectedCol;
286    }
287
288    unsigned getSelectedResId() const {
289       assert(theSelection == cell || theSelection == rowOnly);
290       return row2ResId(selectedRow);
291    }
292    unsigned getSelectedRow() const {
293       assert(theSelection == cell || theSelection == rowOnly);
294       return selectedRow;
295    }
296
297    unsigned col2MetId(unsigned col) const {
298       return metrics[indirectMetrics[col]].getVisiLibId();
299    }
300    unsigned row2ResId(unsigned row) const {
301       return foci[indirectFoci[row]].getVisiLibId();
302    }
303
304    unsigned metric2MetId(unsigned theMetric) const {
305       return metrics[theMetric].getVisiLibId();
306    }
307    unsigned focus2ResId(unsigned theFocus) const {
308       return foci[theFocus].getVisiLibId();
309    }
310
311    void deleteSelection();
312
313    void ReleaseResources( void );
314 };
315
316 #endif