removed call to dm->enableResourceCreationNotification, which was being
[dyninst.git] / paradyn / src / UIthread / UIwhere.C
1 /* 
2  * UIwhere.C
3  * code related to displaying the where axes lives here
4  */
5 /* $Log: UIwhere.C,v $
6 /* Revision 1.9  1995/04/01 22:21:40  karavan
7 /* removed call to dm->enableResourceCreationNotification, which was being
8 /* made on every resource notification.
9 /*
10  * Revision 1.8  1995/02/16  08:20:50  markc
11  * Changed Boolean to bool
12  * Changed wait loop code for igen messages
13  *
14  * Revision 1.7  1995/01/26  17:59:03  jcargill
15  * Changed igen-generated include files to new naming convention; fixed
16  * some bugs compiling with gcc-2.6.3.
17  *
18  * Revision 1.6  1994/11/04  20:11:45  karavan
19  * changed the name of some frames in the main window, affecting status
20  * and resource Display frame parents.
21  *
22  * Revision 1.5  1994/11/03  19:55:55  karavan
23  * added call to dag::setRowSpacing to improve appearance of resource displays
24  *
25  * Revision 1.4  1994/11/03  06:41:19  karavan
26  * took out those pesty debug printfs
27  *
28  * Revision 1.3  1994/11/03  06:16:16  karavan
29  * status display and where axis added to main window and the look cleaned
30  * up a little bit.  Added option to ResourceDisplayObj class to specify
31  * a parent window for an RDO with the constructor.
32  *
33  * Revision 1.2  1994/11/01  05:44:24  karavan
34  * changed resource selection process to support multiple focus selection
35  * on a single display
36  *
37  * Revision 1.1  1994/10/25  17:58:43  karavan
38  * Added support for Resource Display Objects, which display multiple resource
39  * Abstractions
40  * */
41
42 /*
43  * Copyright (c) 1993, 1994 Barton P. Miller, Jeff Hollingsworth,
44  *     Bruce Irvin, Jon Cargille, Krishna Kunchithapadam, Karen
45  *     Karavanic, Tia Newhall, Mark Callaghan.  All rights reserved.
46  * 
47  * This software is furnished under the condition that it may not be
48  * provided or otherwise made available to, or used by, any other
49  * person, except as provided for by the terms of applicable license
50  * agreements.  No title to or ownership of the software is hereby
51  * transferred.  The name of the principals may not be used in any
52  * advertising or publicity related to this software without specific,
53  * written prior authorization.  Any use of this software must include
54  * the above copyright notice.
55  *
56  */
57
58 #include "string.h"
59 #include "UIglobals.h"
60 #include "dataManager.thread.h"
61 #include "../DMthread/DMresource.h"
62 #include "../pdMain/paradyn.h"
63 #include "dag.h"
64
65 List<resourceDisplayObj *> resourceDisplayObj::allRDOs;
66 tokenHandler tokenClerk; 
67 int resourceDisplayObj::rdoCount = 0;
68 List<stringHandle> uim_knownAbstractions;
69 class abstraction;
70
71 /* 
72  *  resourceAddedCB
73  *  This callback function invoked by dataManager whenever a new 
74  *  resource has been defined.  Maintains where axis display.
75  *  Creates dag for abstraction if none exists.
76 */
77 void resourceAddedCB (performanceStream *ps , 
78                       resource *parent, 
79                       resource *newResource, 
80                       char *name)
81 {
82   stringHandle rname;
83   List<resourceDisplayObj *> tmp;
84
85   rname = newResource->getAbstraction()->getName();
86 #if UIM_DEBUG
87   printf ("resourceAddedCB %s\n", name);
88 #endif
89   // add this abstraction to all existing resourceDisplayObjs
90   tmp = resourceDisplayObj::allRDOs;
91   while (*tmp) {    
92     (*tmp)->addResource (newResource, parent, name, rname);
93     tmp++;
94   }
95 }
96
97 /* initWhereAxis
98  * initialization, including mapping to the screen, of a where axis
99  * returns 0 if error, token otherwise
100  */
101 int initWhereAxis (dag *wheredag, stringHandle abs, int rdoToken, 
102                    int dagToken, char *pwin, int mapflag) 
103 {
104   char tcommand[250];
105   char winname[100];
106   sprintf (winname, "%s.dag.dag%s", pwin, (char *)abs);
107   sprintf (tcommand, "initRDOdag %s %s", pwin, (char *)abs);
108   if (Tcl_VarEval (interp, tcommand, 0) == TCL_ERROR) {
109     printf ("NOWHEREDAG:: %s\n", interp->result);
110     return 0; 
111   }
112   wheredag->createDisplay (winname);
113   sprintf (tcommand, "addDefaultWhereSettings %s %d",
114            wheredag->getCanvasName(), dagToken);
115   if (Tcl_VarEval (interp, tcommand, 0) == TCL_ERROR) {
116     printf ("ERROR ADDING Where Bindings %s\n", interp->result);
117     return 0;
118   }
119   if (mapflag) {
120     sprintf (tcommand, "mapRDOdag %d %d %s %s", rdoToken, dagToken,
121              pwin, (char *)abs);
122 #if UIM_DEBUG
123     printf ("%s\n", tcommand);
124 #endif
125     if (Tcl_VarEval (interp, tcommand, 0) == TCL_ERROR) {
126       printf ("CANTMAPDAG:: %s\n", interp->result);
127       return 0; 
128     }
129   }
130   return 1;
131 }
132
133 dag * 
134 resourceDisplayObj::addAbstraction (stringHandle newabs) 
135 {
136   List<dag *> tptr;
137   int retVal, dagToken;
138   dag *newdag;
139   tptr = dags;
140   if (tptr.find (newabs))
141     return (dag *) NULL;
142   newdag = new dag(interp);
143   numdags++;
144   dagToken = tokenClerk.getToken (newdag);
145 #if UIM_DEBUG
146   printf ("adding %d to activeDags\n", dagToken);
147 #endif
148   ActiveDags[dagToken] = newdag;
149
150   // initialize display for this abstraction 
151   retVal = initWhereAxis (newdag, newabs, token, dagToken, parentwin,
152                           (numdags == 1));
153   if (retVal < 0) {
154     printf ("Unable to initialize where axis display\n");
155     delete newdag;
156     return (dag *)NULL;
157   }
158   newdag->setRowSpacing(40);
159   dags.add (newdag, newabs);
160   if (numdags == 1) 
161     topdag = newdag;
162   uim_knownAbstractions.add (newabs);
163   return newdag;
164 }
165
166 resourceDisplayObj::resourceDisplayObj (int baseflag, int &success, 
167                                         const char *pwin)
168 {
169   numdags = 0;  
170   status = DISPLAYED;   
171   topdag = NULL;
172   base = baseflag;
173   token = rdoCount;
174   rdoCount++;
175   sprintf (parentwin, "%s", pwin);
176   sprintf (tbuf, "initRDO %d %s {Paradyn Where Axis Display} 0",
177            token, parentwin);
178   if (Tcl_VarEval (interp, tbuf, 0) == TCL_ERROR) {
179     sprintf (tbuf, "Can't initialize RDO: %s", interp->result);
180     uim_server->showError(26, tbuf);
181     success = 0; 
182   } else {
183     allRDOs.add(this, (void *)token);
184     success = 1;
185   }
186 }
187
188 resourceDisplayObj::resourceDisplayObj (int baseflag, int &success) 
189 {
190   numdags = 0;  
191   status = DISPLAYED;   
192   topdag = NULL;
193   base = baseflag;
194   token = rdoCount;
195   rdoCount++;
196   sprintf (parentwin, ".parent.where%d", token);
197
198   sprintf (tbuf, "initRDO %d %s {Paradyn Where Axis Display} 1",
199            token, parentwin);
200   if (Tcl_VarEval (interp, tbuf, 0) == TCL_ERROR) {
201     sprintf (tbuf, "Can't initialize RDO: %s", interp->result);
202     uim_server->showError(26, tbuf);
203     success = 0; 
204   } else {
205     allRDOs.add(this, (void *)token);
206     success = 1;
207   }
208 }
209
210 /* 
211  * add a single resource to the appropriate dag within this rDO,
212  * creating the dag if none found for the resource's abstraction
213 */
214 void
215 resourceDisplayObj::addResource (resource *newres, resource *parent, 
216                                  char *name, stringHandle abs)
217
218   int nodeID;
219   dag *adag;
220   char *label;
221   stringHandle parname;
222   List<dag *> tptr;
223
224   // find dag for this abstraction; if none, create one
225   tptr = dags;
226   adag = tptr.find (abs);
227   if (adag == NULL) {
228     adag = this->addAbstraction(abs);
229 #if UIM_DEBUG
230     printf ("addResource: abs name %s not found, added\n", (char *)abs);
231 #endif
232   }
233   nodeID = (int) Tk_GetUid(name);
234   label = P_strrchr(name, '/'); label++; 
235   if (parent == uim_rootRes) {
236     adag->CreateNode (nodeID, 1, label, 1, (void *)newres);
237   }
238   else {
239     adag->CreateNode (nodeID, 0, label, 1, (void *)newres);
240     parname = parent->getFullName();
241     adag->AddEdge ((int) Tk_GetUid((char *) parname), nodeID, 1);
242   }
243 }
244
245 int
246 resourceDisplayObj::cycle (char *oldab)
247 {
248   int newtoken;
249   List<stringHandle> tmp;
250   stringHandle *firstab;
251   stringHandle *newab = NULL;
252   dag *newdag;
253
254   // if there's only one dag, do nothing
255   if (numdags <= 1)
256     return 1;
257   // locate next dag to display
258   // first get next abstraction
259   
260   tmp += uim_knownAbstractions;
261   firstab = (stringHandle *) *tmp;
262   while (*tmp) {    
263     if (!strcmp((char *)(*tmp), oldab)) {
264       tmp++;
265       if (*tmp)
266         newab = (stringHandle *) *tmp;
267       else
268         newab = firstab;
269       break;
270     }
271     tmp++;
272   }
273   if (newab == NULL)
274     return 0;
275
276   // get token for new dag
277   newdag = dags.find(newab);
278   topdag = newdag;
279   newtoken = tokenClerk.reportToken(newdag);
280   if (newtoken < 0)
281     return 0;
282   // change displayed dag to newdag
283   sprintf (tbuf, "unmapRDOdag %s %s", parentwin, (char *)oldab);
284 #if UIM_DEBUG
285   printf ("%s\n", tbuf);
286 #endif
287   if (Tcl_VarEval (interp, tbuf, 0) == TCL_ERROR) {
288     printf ("CANTUNMAPDAG:: %s\n", interp->result);
289     return 0; 
290   }
291   sprintf (tbuf, "mapRDOdag %d %d %s %s", token, newtoken,
292            parentwin, (char *)newab);
293 #if UIM_DEBUG
294   printf ("%s\n", tbuf);
295 #endif
296   if (Tcl_VarEval (interp, tbuf, 0) == TCL_ERROR) {
297     printf ("CANTMAPDAG:: %s\n", interp->result);
298     return 0;
299   } 
300   return 1;
301 }
302  
303 int
304 tokenHandler::getToken (void *obj) 
305 {
306   tokenRec *newRec;
307   newRec = new tokenRec;
308   newRec->token = counter++;
309   newRec->object = obj;
310   store.add (newRec, (void *)newRec->token);
311   return newRec->token;
312 }
313
314 int
315 tokenHandler::reportToken (void *obj)
316 {
317   List<tokenRec *> tmp;
318   tmp = store;
319   while (*tmp) {
320     if ((*tmp)->object == obj)
321       return (*tmp)->token;
322     else 
323       tmp++;
324   }
325 #if UIM_DEBUG
326   printf ("object not found by tokenclerk\n");
327 #endif
328   return -1;
329 }
330
331 tokenRec *
332 tokenHandler::translateToken (int token)
333 {
334   return store.find ((void *)token);
335 }
336
337 bool
338 tokenHandler::invalidate (int token)
339 {
340   return store.remove((void *)token);
341 }
342
343
344 int initMainWhereDisplay ()
345 {
346   resourceDisplayObj *newRec;
347   int alliswell = 0;
348   newRec = new resourceDisplayObj(1, alliswell, ".parent.where");
349   if (!alliswell) {
350     //handle error in constructor
351 #if UIM_DEBUG
352     printf ("error in constructor\n");
353 #endif
354     delete newRec;
355   }
356   return alliswell;
357 }
358