8
/* bind model nodes and client IDs/descriptors */
10
char ILrec_name[] = "ILrec";
12
/* for mapping unsigned long IDs to model edges */
18
void ilfreemapsym(Dict_t *dict, void *obj, Dtdisc_t *argdisc)
22
disc = (edgemapdisc_t*)argdisc;
23
agfree(disc->view->model.main,obj);
26
void *ilmakeobjfn(Dict_t *dict, void *obj, Dtdisc_t *argdisc)
31
Dtdisc_t IL_dict_id_disc = {
32
offsetof(Agedge_t,base.tag.id), /* use id as key */
33
sizeof(unsigned long), /* key size */
34
-1, /* use holder objects */
36
NIL(Dtfree_f), /*ilfreemapsym,*/
43
/* trivial ID discipline */
44
static void *idopen(Agraph_t *g) {return NIL(void*);}
45
static long idmap(void *state, int objtype, char *str, unsigned long *id, int createflag) {*id = (unsigned long)str; return TRUE;}
46
static long idalloc(void *state, int objtype, unsigned long id) {return TRUE;}
47
static void idfree(void *state, int objtype, unsigned long id){}
48
static char *idprint(void *state, int objtype, unsigned long id){return NILstr;}
49
static void idclose(void *state) {}
50
static Agiddisc_t iddisc = { idopen,
57
Agdisc_t IL_graph_id_disc = {0, &iddisc, 0};
59
engview_t *il_open_view(ILengine_t *engine, ILview_t *client, Agdesc_t desc, unsigned int *recsize)
67
model = agopen(NILstr, desc, &IL_graph_id_disc);
68
rv = agalloc(model,recsize[IL_RECSIZE_VIEW]);
72
for (i = 0; i < IL_RECSIZE_N; i++)
73
rv->recsize[i] = recsize[i];
75
rv->model.main = model;
76
for (i = 0; i < IL_N_OPS; i++) {
77
rv->model.v[i] = agidsubg(rv->model.main,id++,TRUE);
78
rv->model.e[i] = agidsubg(rv->model.main,id++,TRUE);
81
disc = agalloc(model,sizeof(*disc));
82
disc->base = IL_dict_id_disc;
84
rv->model.e_dict = dtopen((Dtdisc_t*)disc,Dttree);
89
void il_close_view(engview_t *view)
94
Dtdisc_t *edgemapdisc;
100
for (n = agfstnode(G); n; n = nn) {
101
for (e = agfstout(n); e; e = ne) {
104
/* this is done in clear_callbacks */
105
/* il_close_edge(view, espec); */
106
il_register_edge_callback(view, espec, IL_DEL);
110
il_register_node_callback(view, nspec, IL_DEL);
111
/* il_close_node(view, il_node(n)); */
113
(void) il_issue_callbacks(view);
115
view->client->pvt = NIL(void*);
116
edgemapdisc = dtdisc(view->model.e_dict,NIL(Dtdisc_t*),0);
117
dtclose(view->model.e_dict);
118
agfree(G,edgemapdisc);
124
Agnode_t *il_open_node(engview_t *view, ILnode_t *client)
130
model = view->model.main;
131
n = agidnode(model,(unsigned long)client,TRUE);
132
desc = (engnode_t *)agbindrec(n,ILrec_name,view->recsize[IL_RECSIZE_NODE],TRUE);
133
desc->client = client;
137
Agnode_t *il_find_node(engview_t *view, ILnode_t *node)
139
return agidnode(view->model.main,(unsigned long)node,FALSE);
142
void il_close_node(engview_t *view, ILnode_t *node)
146
if ((n = il_find_node(view,node)))
147
agdelete(view->model.main,n);
151
Agedge_t *il_open_edge(engview_t *view, ILedge_t *client)
158
model = view->model.main;
159
u = il_find_node(view,(ILnode_t*)(client->tail.term));
160
v = il_find_node(view,(ILnode_t*)(client->head.term));
161
if (u && v && ((e = agidedge(u,v,(unsigned long)client,TRUE)))) {
162
assert (AGID(e) == (unsigned long)client);
163
desc = (engedge_t *)agbindrec(e,ILrec_name,view->recsize[IL_RECSIZE_EDGE],TRUE);
164
desc->client = client; /* shallow copy OK for most */
165
dtinsert(view->model.e_dict,e);
166
#if 0 /* suspected of memory leak */
167
/* OLD DEBUG CODE TO REMOVE SOMEDAY */
171
il_find_edge(view,probe);
172
probe = (ILedge_t*) (~(unsigned long)0);
173
il_find_edge(view,probe);
175
f = il_find_edge(view,probe);
184
Agedge_t *il_find_edge(engview_t *view, ILedge_t *edge)
186
static Agedge_t template; /* static to avoid purify warnings */
188
template.base.tag.id = (unsigned long) edge;
189
return (Agedge_t*)dtsearch(view->model.e_dict,&template);
192
void il_close_edge(engview_t *view, ILedge_t *edge)
196
if ((e = il_find_edge(view, edge))) {
197
/* do not call il_freeshape on edge->pos because
198
* it is the client's responsibility */
200
il_freeshape(agheap(view->model.main),edge->pos);
201
edge->pos = NIL(ilshape_t*);
203
dtdelete(view->model.e_dict,e);
204
agdelete(view->model.main,e);
205
assert(il_find_edge(view,edge) == NILedge);
209
ILnode_t *ilnextnode(ILview_t *view, ILnode_t *spec)
215
model_n = il_find_node(view->pvt,spec);
216
if (model_n) model_n = agnxtnode(model_n);
218
else model_n = agfstnode(ilmodel(view));
219
if (model_n) rv = (ILnode_t*)ilmdlobj_to_spec(view,(Agobj_t*)model_n);
220
else rv = NIL(ILnode_t*);
224
ILedge_t *ilnextedge(ILview_t *view, ILnode_t *endpoint, ILedge_t *spec)
230
model_n = il_find_node(view->pvt,endpoint);
231
if (model_n == NILnode) rv = NIL(ILedge_t*);
234
model_e = il_find_edge(view->pvt,spec);
235
if (model_e) model_e = agnxtedge(model_e, model_n);
237
else model_e = agfstedge(model_n);
238
if (model_e) rv = (ILedge_t*)ilmdlobj_to_spec(view,(Agobj_t*)model_e);
239
else rv = NIL(ILedge_t*);