1 /*
2  * Copyright (c) Tony Bybell 1999-2008.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  */
9 
10 #include <config.h>
11 #include <gtk/gtk.h>
12 #include "splay.h"
13 
14 #if WAVE_USE_GTK2
15 #define set_winsize(w,x,y) gtk_window_set_default_size(GTK_WINDOW(w),(x),(y))
16 void create_toolbar(GtkWidget *table);
17 #else
18 #define set_winsize(w,x,y) gtk_widget_set_usize(GTK_WIDGET(w),(x),(y))
19 #endif
20 
21 GtkWidget *notebook = NULL;
22 
23 void bwmaketree(void);
24 void bwlogbox(char *title, int width, ds_Tree *t, int display_mode);
25 void setup_dnd(GtkWidget *wid);
26 
27 static ds_Tree *selectedtree=NULL;
28 
29 static int is_active=0;
30 GtkCTree *ctree_main=NULL;
31 
select_row_callback(GtkWidget * widget,gint row,gint column,GdkEventButton * event,gpointer data)32 static void select_row_callback(GtkWidget *widget, gint row, gint column,
33         GdkEventButton *event, gpointer data)
34 {
35 (void)widget;
36 (void)column;
37 (void)event;
38 (void)data;
39 
40 ds_Tree *t=(ds_Tree *)gtk_clist_get_row_data(GTK_CLIST(ctree_main), row);
41 selectedtree=t;
42 
43 if(t->filename)
44         {
45 	/*
46 	printf("%s\n", t->fullname);
47         printf("%s -> '%s' %d-%d\n\n", t->item, t->filename, t->s_line, t->e_line);
48 	*/
49 
50 	bwlogbox(t->fullname, 640 + 8*8, t, 0);
51         }
52         else
53         {
54 	/*
55 	printf("%s\n", t->fullname);
56         printf("%s -> *MISSING*\n\n", t->item);
57 	*/
58         }
59 }
60 
unselect_row_callback(GtkWidget * widget,gint row,gint column,GdkEventButton * event,gpointer data)61 static void unselect_row_callback(GtkWidget *widget, gint row, gint column,
62         GdkEventButton *event, gpointer data)
63 {
64 (void)widget;
65 (void)row;
66 (void)column;
67 (void)event;
68 (void)data;
69 
70 /* ds_Tree *t=(ds_Tree *)gtk_clist_get_row_data(GTK_CLIST(ctree_main), row); */
71 selectedtree=NULL;
72 }
73 
treebox_is_active(void)74 int treebox_is_active(void)
75 {
76 return(is_active);
77 }
78 
79 
80 /***************************************************************************/
81 
82 static GtkWidget *window;
83 static GtkWidget *tree;
84 static GtkSignalFunc cleanup;
85 
86 
destroy_callback(GtkWidget * widget,GtkWidget * nothing)87 static void destroy_callback(GtkWidget *widget, GtkWidget *nothing)
88 {
89 (void)widget;
90 (void)nothing;
91 
92   is_active=0;
93   gtk_widget_destroy(window);
94   gtk_main_quit();
95 }
96 
97 
98 
99 /*
100  * mainline..
101  */
treebox(char * title,GtkSignalFunc func,GtkWidget * old_window)102 void treebox(char *title, GtkSignalFunc func, GtkWidget *old_window)
103 {
104 (void)old_window;
105 
106     GtkWidget *scrolled_win;
107     GtkWidget *frame2;
108     GtkWidget *table;
109     GtkCList  *clist;
110 #ifndef WAVE_USE_GTK2
111     GtkWidget *frameh;
112     GtkWidget *button5;
113     GtkWidget *hbox;
114 #endif
115 
116     if(is_active)
117 	{
118 	gdk_window_raise(window->window);
119 	return;
120 	}
121 
122     is_active=1;
123     cleanup=func;
124 
125     /* create a new modal window */
126     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
127     gtk_window_set_title(GTK_WINDOW (window), title);
128     gtk_signal_connect(GTK_OBJECT (window), "delete_event",
129                        (GtkSignalFunc) destroy_callback, NULL);
130     set_winsize(window, 640, 600);
131 
132 
133     table = gtk_table_new (256, 1, FALSE);
134     gtk_widget_show (table);
135 
136 #ifndef WAVE_USE_GTK2
137     frame2 = gtk_frame_new (NULL);
138     gtk_widget_show(frame2);
139 #else
140     frame2 = gtk_hpaned_new();
141     gtk_widget_show(frame2);
142 
143     notebook = gtk_notebook_new();
144     gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
145     gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), ~0);
146     gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), ~0);
147     gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), ~0);
148     gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
149 
150     gtk_widget_show(notebook);
151     gtk_paned_pack2(GTK_PANED(frame2), notebook, TRUE, TRUE);
152 #endif
153 
154     gtk_table_attach (GTK_TABLE (table), frame2, 0, 1, 0, 255,
155                         GTK_FILL | GTK_EXPAND,
156                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1);
157 
158     tree=gtk_ctree_new(1,0);
159     ctree_main=GTK_CTREE(tree);
160     gtk_clist_set_column_auto_resize (GTK_CLIST (tree), 0, TRUE);
161     gtk_widget_show(tree);
162 
163     clist=GTK_CLIST(tree);
164     gtk_signal_connect_object (GTK_OBJECT (clist), "select_row",
165                                GTK_SIGNAL_FUNC(select_row_callback),
166                                NULL);
167     gtk_signal_connect_object (GTK_OBJECT (clist), "unselect_row",
168                                GTK_SIGNAL_FUNC(unselect_row_callback),
169                                NULL);
170 
171     gtk_clist_freeze(clist);
172     gtk_clist_clear(clist);
173 
174     bwmaketree();
175     gtk_clist_thaw(clist);
176     selectedtree=NULL;
177 
178     scrolled_win = gtk_scrolled_window_new (NULL, NULL);
179 #ifndef WAVE_USE_GTK2
180     gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 300);
181 #else
182     gtk_widget_set_usize( GTK_WIDGET (scrolled_win), 150, 300);
183 #endif
184     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
185                                       GTK_POLICY_AUTOMATIC,
186                                       GTK_POLICY_AUTOMATIC);
187     gtk_widget_show(scrolled_win);
188     gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (tree));
189 
190 #ifndef WAVE_USE_GTK2
191     gtk_container_add (GTK_CONTAINER (frame2), scrolled_win);
192 #else
193     gtk_paned_pack1(GTK_PANED(frame2), scrolled_win, TRUE, TRUE);
194 #endif
195 
196 #ifndef WAVE_USE_GTK2
197     frameh = gtk_frame_new (NULL);
198     gtk_container_border_width (GTK_CONTAINER (frameh), 3);
199     gtk_widget_show(frameh);
200     gtk_table_attach (GTK_TABLE (table), frameh, 0, 1, 255, 256,
201                         GTK_FILL | GTK_EXPAND,
202                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1);
203 
204 
205     hbox = gtk_hbox_new (FALSE, 1);
206     gtk_widget_show (hbox);
207 
208     button5 = gtk_button_new_with_label (" Exit ");
209     gtk_container_border_width (GTK_CONTAINER (button5), 3);
210     gtk_signal_connect_object (GTK_OBJECT (button5), "clicked",
211 			       GTK_SIGNAL_FUNC(destroy_callback),
212 			       GTK_OBJECT (window));
213     gtk_widget_show (button5);
214     gtk_box_pack_start (GTK_BOX (hbox), button5, TRUE, TRUE, 0);
215 
216     gtk_container_add (GTK_CONTAINER (frameh), hbox);
217 #else
218     create_toolbar(table);
219 #endif
220 
221     gtk_container_add (GTK_CONTAINER (window), table);
222 
223     gtk_widget_show(window);
224     setup_dnd(window);
225 }
226 
227