1
/* $Id: tvnodes.c,v 1.4 2008/03/03 23:03:38 arif Exp $ $Revision: 1.4 $ */
2
/* vim:set shiftwidth=4 ts=8: */
4
/**********************************************************
5
* This software is part of the graphviz package *
6
* http://www.graphviz.org/ *
8
* Copyright (c) 1994-2004 AT&T Corp. *
9
* and is licensed under the *
10
* Common Public License, Version 1.0 *
13
* Information and Software Systems Research *
14
* AT&T Research, Florham Park NJ *
15
**********************************************************/
21
#include "selection.h"
23
static char buf [255];
26
tv_filter* create_tv_filter()
29
f=(tv_filter*)malloc(sizeof(tv_filter));
33
void init_tv_nodes(tv_nodes* TV_Nodes)
37
TV_Nodes->activepage=-1;
38
TV_Nodes->firstnodeid=0;
39
TV_Nodes->pagecount=0;
40
TV_Nodes->recordperpage=22;
41
TV_Nodes->page_data_index=0;
44
TV_Nodes->initial_Y=12;
45
TV_Nodes->chkSelected_X=5;
46
TV_Nodes->IDLabel_X=10;
47
TV_Nodes->chkVisible_X=55;
48
TV_Nodes->chkHighlighted_X=85;
49
TV_Nodes->Data1_X=105;
50
TV_Nodes->Data2_X=305;
51
TV_Nodes->page_data_node_index=0;
55
for (i=0;i < MAX_NODE_PER_PAGE ;i ++)
57
TV_Nodes->TV_Node[i].chkHighlighted=NULL;
58
TV_Nodes->TV_Node[i].chkSelected=NULL;
59
TV_Nodes->TV_Node[i].chkVisible=NULL;
60
TV_Nodes->TV_Node[i].Data1=NULL;
61
TV_Nodes->TV_Node[i].Data2=NULL;
62
TV_Nodes->TV_Node[i].IDLabel=NULL;
64
TV_Nodes->initialized=1;
67
void clear_tv_filter(tv_filter* TV_Filter)
69
TV_Filter->highlighted=-1;
70
TV_Filter->visible=-1;
71
TV_Filter->min_data1=NULL;
72
TV_Filter->max_data1=NULL;
73
TV_Filter->min_data2=NULL;
74
TV_Filter->max_data2=NULL;
80
extern int set_filter(tv_filter* TV_Filter,char* MinData1,char* MaxData1,char* MinData2,char* MaxData2,char* Filter_String,int selected,int visible,int highlighted)
82
TV_Filter->selected=selected;
83
TV_Filter->highlighted=highlighted;
84
TV_Filter->visible=visible;
85
TV_Filter->min_data1=MinData1;
86
TV_Filter->max_data1=MaxData1;
87
TV_Filter->min_data2=MinData2;
88
TV_Filter->max_data2=MaxData2;
89
TV_Filter->filter_string=Filter_String;
93
int reverse_selection()
96
for (i; i < view->Topview->Nodecount ; i ++)
98
if (((custom_object_data*)AGDATA(view->Topview->Nodes[i].Node))->Selected )
99
deselect_node(view->g[view->activeGraph],view->Topview->Nodes[i].Node);
101
select_node(view->g[view->activeGraph],view->Topview->Nodes[i].Node);
103
for (i=0; i < view->Topview->Edgecount ; i ++)
105
if (((custom_object_data*)AGDATA(view->Topview->Edges[i].Edge))->Selected )
106
deselect_edge(view->g[view->activeGraph],view->Topview->Edges[i].Edge);
108
select_edge(view->g[view->activeGraph],view->Topview->Edges[i].Edge);
111
int validate_node(tv_node* TV_Node)
113
static btree_node* n=0;
117
// n=tree_from_filter_string("([IP=\"^10.*\",min=\"0\",max=\"0\"])");
118
// get attributes from graph
119
data_attr1=agget(view->g[view->activeGraph],"DataAttribute1");
120
data_attr2=agget(view->g[view->activeGraph],"DataAttribute2");
123
if (TV_Nodes.filtered)
126
if((MP_Flag==1) || (!n))
128
n=tree_from_filter_string(TV_Nodes.filter.filter_string);
130
buf=agget(view->Topview->Nodes[TV_Node->index].Node,data_attr1);
133
if (strcmp(TV_Nodes.filter.min_data1,buf))
137
if (data_attr1 && TV_Nodes.filter.max_data1 && agget(view->Topview->Nodes[TV_Node->index].Node,data_attr1))
139
if (strcmp(agget(view->Topview->Nodes[TV_Node->index].Node,data_attr1),TV_Nodes.filter.min_data1))
142
//string data checks attr2
143
if (data_attr2 && TV_Nodes.filter.min_data2 && agget(view->Topview->Nodes[TV_Node->index].Node,data_attr2))
145
if (strcmp(TV_Nodes.filter.min_data2, agget(view->Topview->Nodes[TV_Node->index].Node,data_attr2) ))
148
if (data_attr2 && TV_Nodes.filter.max_data2 && agget(view->Topview->Nodes[TV_Node->index].Node,data_attr2))
150
if (agget(view->Topview->Nodes[TV_Node->index].Node,data_attr2),TV_Nodes.filter.min_data2)
153
if (strlen(TV_Nodes.filter.filter_string)>0)
154
valid=evaluate_expresions (TV_Node,n);
155
//if show only highlighted
156
if (TV_Nodes.filter.highlighted >= 0)
158
if(((custom_object_data*)AGDATA(view->Topview->Nodes[TV_Node->index].Node))->Highlighted!= TV_Nodes.filter.highlighted)
161
//if show only visibles
162
if (TV_Nodes.filter.visible >= 0)
164
if(((custom_object_data*)AGDATA(view->Topview->Nodes[TV_Node->index].Node))->Visible!= TV_Nodes.filter.visible)
167
//if show only selected
168
if (TV_Nodes.filter.selected >= 0)
170
if(((custom_object_data*)AGDATA(view->Topview->Nodes[TV_Node->index].Node))->Selected!= TV_Nodes.filter.selected)
179
int update_node_gui_objects(tv_node* TV_Node)
186
// get attributes from graph
187
data_attr1=agget(view->g[view->activeGraph],"DataAttribute1");
188
data_attr2=agget(view->g[view->activeGraph],"DataAttribute2");
190
//create if objects are null
191
layout=(GtkLayout*)glade_xml_get_widget(xml, "layoutTVData");
193
if (!TV_Node->chkSelected)
195
TV_Node->chkSelected=(GtkCheckButton*)gtk_check_button_new();
196
gtk_layout_put (layout,(GtkWidget*)TV_Node->chkSelected,LOCATION_X_CHKSELECTED,TV_Nodes.Y);
198
gtk_widget_show((GtkWidget*)TV_Node->chkSelected);
199
gtk_toggle_button_set_active((GtkToggleButton*)TV_Node->chkSelected,((custom_object_data*)AGDATA(view->Topview->Nodes[TV_Node->index].Node))->Selected);
202
if (!TV_Node->IDLabel)
204
TV_Node->IDLabel=(GtkLabel*)gtk_label_new("");
205
gtk_layout_put (layout,(GtkWidget*)TV_Node->IDLabel,LOCATION_X_IDLABEL,TV_Nodes.Y);
207
sprintf(buf, "%d", TV_Node->index);
208
gtk_label_set_text (TV_Node->IDLabel,buf);
209
gtk_widget_show((GtkWidget*)TV_Node->IDLabel);
212
if (!TV_Node->chkVisible)
214
TV_Node->chkVisible=(GtkCheckButton*)gtk_check_button_new();
215
gtk_layout_put (layout,(GtkWidget*)TV_Node->chkVisible,LOCATION_X_CHKVISIBLE,TV_Nodes.Y);
218
gtk_widget_show((GtkWidget*)TV_Node->chkVisible);
219
gtk_toggle_button_set_active((GtkToggleButton*)TV_Node->chkVisible,((custom_object_data*)AGDATA(view->Topview->Nodes[TV_Node->index].Node))->Visible);
221
if (!TV_Node->chkHighlighted)
223
TV_Node->chkHighlighted=(GtkCheckButton*)gtk_check_button_new();
224
gtk_layout_put (layout,(GtkWidget*)TV_Node->chkHighlighted,LOCATION_X_CHKHIGHLIGHTED,TV_Nodes.Y);
226
gtk_widget_show((GtkWidget*)TV_Node->chkHighlighted);
227
gtk_toggle_button_set_active((GtkToggleButton*)TV_Node->chkHighlighted,((custom_object_data*)AGDATA(view->Topview->Nodes[TV_Node->index].Node))->Highlighted);
233
TV_Node->Data1=(GtkEntry*)gtk_entry_new();
234
gtk_layout_put (layout,(GtkWidget*)TV_Node->Data1,LOCATION_X_DATA1,TV_Nodes.Y);
235
gtk_widget_set_size_request((GtkWidget*)TV_Node->Data1,300,23);
240
gtk_entry_set_text (TV_Node->Data1,agget(view->Topview->Nodes[TV_Node->index].Node,data_attr1));
243
gtk_entry_set_text (TV_Node->Data1,"");
244
gtk_widget_show((GtkWidget*)TV_Node->Data1);
249
TV_Node->Data2=(GtkEntry*)gtk_entry_new();
250
gtk_layout_put (layout,(GtkWidget*)TV_Node->Data2,LOCATION_X_DATA2,TV_Nodes.Y);
251
gtk_widget_set_size_request((GtkWidget*)TV_Node->Data2,300,23);
255
gtk_entry_set_text (TV_Node->Data2,agget(view->Topview->Nodes[TV_Node->index].Node,data_attr2));
258
gtk_entry_set_text (TV_Node->Data2,"");
259
gtk_widget_show((GtkWidget*)TV_Node->Data2);
265
extern int tv_nodes_last_page()
267
if (TV_Nodes.activepage<TV_Nodes.pagecount)
268
return tv_nodes_goto_page(TV_Nodes.pagecount);
272
extern int tv_nodes_first_page()
274
if (TV_Nodes.activepage>0)
275
return tv_nodes_goto_page(0);
280
extern int tv_nodes_goto_page(int page)
286
if ((page >=0) && page <= TV_Nodes.pagecount)
288
if(TV_Nodes.general_purpose_flag==1)
290
update_TV_data_from_gui();
291
TV_Nodes.general_purpose_flag=0;
293
TV_Nodes.activepage=page;
294
TV_Nodes.page_data_node_index=TV_Nodes.page_history[TV_Nodes.activepage];
295
TV_Nodes.page_data_index=0;
296
TV_Nodes.firstnodeid=TV_Nodes.page_data_node_index;
297
TV_Nodes.Y=TV_Nodes.initial_Y;
302
while ((TV_Nodes.page_data_index < TV_Nodes.recordperpage)&&(TV_Nodes.page_data_node_index < view->Topview->Nodecount))
304
tvn=&TV_Nodes.TV_Node[TV_Nodes.page_data_index];
305
tvn->index=TV_Nodes.page_data_node_index;
306
if(view->Topview->Nodes[TV_Nodes.page_data_node_index].valid==1)
308
TV_Nodes.page_data_index++;
309
update_node_gui_objects(tvn);
310
TV_Nodes.Y=TV_Nodes.Y+TV_Nodes.Y_Gap;
312
TV_Nodes.page_data_node_index++;
314
lblTVPage=(GtkLabel*)glade_xml_get_widget(xml, "lblTVPage");
315
sprintf(buf,"(%i / %i)", TV_Nodes.activepage+1,TV_Nodes.pagecount+1);
316
gtk_label_set_text(lblTVPage,buf);
317
spn=(GtkSpinButton*)glade_xml_get_widget(xml, "spnTVGotopage");
318
gtk_spin_button_set_value(spn,page+1);
326
extern int tv_nodes_prior_page()
328
if (TV_Nodes.activepage >0)
330
return tv_nodes_goto_page(TV_Nodes.activepage -1);
337
extern int tv_nodes_next_page()
339
if (TV_Nodes.activepage < TV_Nodes.pagecount)
341
return tv_nodes_goto_page(TV_Nodes.activepage +1);
346
extern void execute_tv_nodes()
349
gtk_widget_hide(glade_xml_get_widget(xml, "frmTVNodes"));
350
gtk_widget_show(glade_xml_get_widget(xml, "frmTVNodes"));
351
// gtk_window_set_keep_above (glade_xml_get_widget(xml, "frmTVNodes"),1);
352
if(TV_Nodes.initialized < 1)
354
init_tv_nodes(&TV_Nodes);
357
prepare_page_history();
358
TV_Nodes.general_purpose_flag=1;
359
tv_nodes_next_page();
363
static int hide_data_widgets()
366
for (i=0;i < MAX_NODE_PER_PAGE ;i ++)
368
if (TV_Nodes.TV_Node[i].chkHighlighted)
370
gtk_widget_hide((GtkWidget*)TV_Nodes.TV_Node[i].chkHighlighted);
371
gtk_widget_hide((GtkWidget*)TV_Nodes.TV_Node[i].chkSelected);
372
gtk_widget_hide((GtkWidget*)TV_Nodes.TV_Node[i].chkVisible);
373
gtk_widget_hide((GtkWidget*)TV_Nodes.TV_Node[i].Data1);
374
gtk_widget_hide((GtkWidget*)TV_Nodes.TV_Node[i].Data2);
375
gtk_widget_hide((GtkWidget*)TV_Nodes.TV_Node[i].IDLabel);
382
extern int reset_page_History()
384
/* if(TV_Nodes.page_history_count > 0)
386
free(TV_Nodes.page_history);
387
TV_Nodes.page_history_count=0;
389
TV_Nodes.page_history_count=0;
390
TV_Nodes.page_history=realloc(TV_Nodes.page_history,sizeof(int) * TV_Nodes.page_history_count);
395
static int push_to_page_history(int index)
397
TV_Nodes.page_history_count++;
398
TV_Nodes.page_history=realloc(TV_Nodes.page_history,sizeof(int) * TV_Nodes.page_history_count);
399
TV_Nodes.page_history[TV_Nodes.page_history_count-1]=index;
402
static int pop_from_page_history()
404
if(TV_Nodes.page_history_count > 0)
407
return_value=TV_Nodes.page_history[TV_Nodes.page_history_count-1];
408
TV_Nodes.page_history_count--;
409
TV_Nodes.page_history=realloc(TV_Nodes.page_history,sizeof(int) * TV_Nodes.page_history_count);
415
extern int prepare_page_history()
422
TV_Nodes.pagecount=0;
423
TV_Nodes.activepage=-1;
424
reset_page_History();
425
push_to_page_history(0);
427
for (i;i < view->Topview->Nodecount ; i++)
430
if(validate_node(&tvn))
433
view->Topview->Nodes[i].valid=1;
436
view->Topview->Nodes[i].valid=0;
437
if (count== TV_Nodes.recordperpage)
439
push_to_page_history(i+1);
440
TV_Nodes.pagecount++;
444
spn=(GtkSpinButton*)glade_xml_get_widget(xml, "spnTVGotopage");
445
gtk_spin_button_set_value(spn,0);
446
gtk_spin_button_set_range(spn,0,TV_Nodes.pagecount+1);
449
lblTVPage=(GtkLabel*)glade_xml_get_widget(xml, "lblTVPage");
450
sprintf(buf,"(%i / %i)", 1,TV_Nodes.pagecount+1);
451
gtk_label_set_text(lblTVPage,buf);
452
set_data_attributes();
456
static int set_data_attributes()
462
// get attributes from graph
463
data_attr1=agget(view->g[view->activeGraph],"DataAttribute1");
464
data_attr2=agget(view->g[view->activeGraph],"DataAttribute2");
467
agattr(view->g[view->activeGraph],AGRAPH,"DataAttribute1","DATA1");
468
agattr(view->g[view->activeGraph],AGNODE,"DATA1","");
472
agattr(view->g[view->activeGraph],AGRAPH,"DataAttribute2","DATA2");
473
agattr(view->g[view->activeGraph],AGNODE,"DATA2","");
476
data_attr1=agget(view->g[view->activeGraph],"DataAttribute1");
477
data_attr2=agget(view->g[view->activeGraph],"DataAttribute2");
479
lblData1=(GtkLabel*)glade_xml_get_widget(xml, "lblTVData1");
480
lblData2=(GtkLabel*)glade_xml_get_widget(xml, "lblTVData2");
481
gtk_label_set_text (lblData1,data_attr1);
482
gtk_label_set_text (lblData2,data_attr2);
487
extern int update_TV_data_from_gui()
493
// get attributes from graph
494
data_attr1=agget(view->g[view->activeGraph],"DataAttribute1");
495
data_attr2=agget(view->g[view->activeGraph],"DataAttribute2");
497
for (i;i < TV_Nodes.recordperpage ; i++)
499
index=TV_Nodes.TV_Node[i].index;
500
if (index < view->Topview->Nodecount)
503
if(gtk_toggle_button_get_active((GtkToggleButton*)TV_Nodes.TV_Node[i].chkSelected))
505
if (!((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Selected)
506
select_node(view->g[view->activeGraph],view->Topview->Nodes[index].Node);
510
if (((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Selected)
511
deselect_node(view->g[view->activeGraph],view->Topview->Nodes[index].Node);
514
if(gtk_toggle_button_get_active((GtkToggleButton*)TV_Nodes.TV_Node[i].chkVisible))
516
if (!((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Visible)
517
((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Visible=1;
521
if (((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Visible)
522
((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Visible=0;
524
// apply if Highlighted
525
if(gtk_toggle_button_get_active((GtkToggleButton*)TV_Nodes.TV_Node[i].chkHighlighted))
527
if (!((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Highlighted)
528
((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Highlighted=1;
532
if (((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Highlighted)
533
((custom_object_data*)AGDATA(view->Topview->Nodes[index].Node))->Highlighted=0;
536
agset((void*)view->Topview->Nodes[index].Node,data_attr1,(char*)gtk_entry_get_text (TV_Nodes.TV_Node[i].Data1));
538
agset(view->Topview->Nodes[index].Node,data_attr2,(char*)gtk_entry_get_text (TV_Nodes.TV_Node[i].Data2));
547
extern int apply_filter_from_gui()
553
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterSel1")))
555
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterSel2")))
557
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterSel3")))
560
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterVisible1")))
562
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterVisible2")))
564
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterVisible3")))
567
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterHigh1")))
569
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterHigh2")))
571
if(gtk_toggle_button_get_active((GtkToggleButton*)glade_xml_get_widget(xml,"rbTVFilterHigh3")))
573
set_filter(&TV_Nodes.filter,
574
(char*)gtk_entry_get_text ((GtkEntry*)glade_xml_get_widget(xml,"edtTVFilterMinData1") ),
575
(char*)gtk_entry_get_text ((GtkEntry*)glade_xml_get_widget(xml,"edtTVFilterMaxData1") ),
576
(char*)gtk_entry_get_text ((GtkEntry*)glade_xml_get_widget(xml,"edtTVFilterMinData2") ),
577
(char*)gtk_entry_get_text ((GtkEntry*)glade_xml_get_widget(xml,"edtTVFilterMaxData2") ),
578
(char*)gtk_entry_get_text ((GtkEntry*)glade_xml_get_widget(xml,"edtTVFilterString") ),
579
selected,visible,highlighted);
581
prepare_page_history();
582
tv_nodes_next_page();
587
extern int tv_select_all()
592
for (i;i < view->Topview->Nodecount ; i++)
595
if(validate_node(&tvn))
597
select_node(view->g[view->activeGraph],view->Topview->Nodes[i].Node);
600
apply_filter_from_gui();
604
extern int tv_unselect_all()
609
for (i;i < view->Topview->Nodecount ; i++)
612
if(validate_node(&tvn))
614
deselect_node(view->g[view->activeGraph],view->Topview->Nodes[i].Node);
617
apply_filter_from_gui();
621
extern int tv_highligh_all()
625
for (i;i < view->Topview->Nodecount ; i++)
628
if(validate_node(&tvn))
630
((custom_object_data*)AGDATA(view->Topview->Nodes[i].Node))->Highlighted=1;
633
apply_filter_from_gui();
638
extern int tv_unhighligh_all()
642
for (i;i < view->Topview->Nodecount ; i++)
645
if(validate_node(&tvn))
647
((custom_object_data*)AGDATA(view->Topview->Nodes[i].Node))->Highlighted=0;
650
apply_filter_from_gui();
654
extern int tv_show_all()
658
for (i;i < view->Topview->Nodecount ; i++)
661
if(validate_node(&tvn))
663
((custom_object_data*)AGDATA(view->Topview->Nodes[i].Node))->Visible=1;
666
apply_filter_from_gui();
672
extern int tv_hide_all()
676
for (i;i < view->Topview->Nodecount ; i++)
679
if(validate_node(&tvn))
681
((custom_object_data*)AGDATA(view->Topview->Nodes[i].Node))->Visible=0;
684
apply_filter_from_gui();