diff gtk/dw.c @ 30:b1d7e8a28dfa

Added tree view functions and signal.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sat, 25 Aug 2001 05:39:33 +0000
parents 6a246b3bb14f
children 72675de7d229
line wrap: on
line diff
--- a/gtk/dw.c	Fri Aug 17 12:25:52 2001 +0000
+++ b/gtk/dw.c	Sat Aug 25 05:39:33 2001 +0000
@@ -82,6 +82,7 @@
 void _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data);
 void _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data);
 void _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data);
+void _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data);
 
 typedef struct
 {
@@ -98,7 +99,7 @@
 
 } SignalHandler;
 
-#define SIGNALMAX 13
+#define SIGNALMAX 14
 
 /* A list of signal forwarders, to account for paramater differences. */
 SignalList SignalTranslate[SIGNALMAX] = {
@@ -114,6 +115,7 @@
 	{ _container_select_event, "container-select" },
 	{ _container_context_event, "container-context" },
 	{ _item_select_event, "item-select" },
+	{ _tree_select_event, "tree-select" },
 	{ _set_focus_event, "set-focus" }
 };
 
@@ -344,6 +346,19 @@
 	}
 }
 
+void _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data)
+{
+	SignalHandler *work = (SignalHandler *)data;
+
+	if(work)
+	{
+		void (*treeselectfunc)(HWND, HWND, char *, void *) = work->func;
+		char *text = (char *)gtk_object_get_data(GTK_OBJECT(child), "text");
+
+		treeselectfunc(work->window, child, text, work->data);
+	}
+}
+
 void _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
 {
 	SignalHandler *work = (SignalHandler *)data;
@@ -977,7 +992,8 @@
 void dw_window_pointer(HWND handle, int pointertype)
 {
 	GdkCursor *cursor = gdk_cursor_new(pointertype);
-	gdk_window_set_cursor(handle->window, cursor);
+	if(handle && handle->window)
+		gdk_window_set_cursor(handle->window, cursor);
 	gdk_cursor_destroy(cursor);
 }
 
@@ -2424,6 +2440,7 @@
 	}
 	item = gtk_tree_item_new();
 	label = gtk_label_new(title);
+	gtk_object_set_data(GTK_OBJECT(item), "text", (gpointer)strdup(title));
 	hbox = gtk_hbox_new(FALSE, 2);
 	gdkpix = _find_pixmap(&gdkbmp, icon, hbox);
 	pixmap = gtk_pixmap_new(gdkpix, gdkbmp);
@@ -2439,7 +2456,14 @@
 		subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent));
 		if(!subtree)
 		{
+			void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "select-child-func");
+			void *work = (void *)gtk_object_get_data(GTK_OBJECT(tree), "select-child-data");
+
 			subtree = gtk_tree_new();
+
+			if(thisfunc && work)
+				gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc), work);
+
 			gtk_object_set_user_data(GTK_OBJECT(parent), subtree);
 			gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE);
 			gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
@@ -2455,6 +2479,49 @@
 	return item;
 }
 
+/*
+ * Removes all nodes from a tree.
+ * Parameters:
+ *       handle: Handle to the window (widget) to be cleared.
+ */
+void dw_tree_clear(HWND handle)
+{
+	GtkWidget *tree;
+	int _locked_by_me = FALSE;
+
+	DW_MUTEX_LOCK;
+	tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
+	if(!tree || !GTK_IS_TREE(tree))
+	{
+		DW_MUTEX_UNLOCK;
+		return;
+	}
+	gtk_tree_clear_items(GTK_TREE(tree), 0, 1000000);
+	DW_MUTEX_UNLOCK;
+}
+
+/*
+ * Removes a node from a tree.
+ * Parameters:
+ *       handle: Handle to the window (widget) to be cleared.
+ *       item: Handle to node to be deleted.
+ */
+void dw_tree_delete(HWND handle, HWND item)
+{
+	GtkWidget *tree;
+	int _locked_by_me = FALSE;
+
+	DW_MUTEX_LOCK;
+	tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
+	if(!tree || !GTK_IS_TREE(tree))
+	{
+		DW_MUTEX_UNLOCK;
+		return;
+	}
+	gtk_tree_remove_item(GTK_TREE(tree), item);
+	DW_MUTEX_UNLOCK;
+}
+
 int _dw_container_setup(HWND handle, unsigned long *flags, char **titles, int count, int separator, int extra)
 {
 	GtkWidget *clist;
@@ -4620,6 +4687,15 @@
 	{
 		thisname = "focus-in-event";
 	}
+	else if(GTK_IS_TREE(thiswindow) && strcmp(signame, "tree-select") == 0)
+	{
+		if(thisfunc)
+		{
+			gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-func", (gpointer)thisfunc);
+			gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-data", (gpointer)work);
+		}
+		thisname = "select-child";
+	}
 
 	if(!thisfunc || !thiswindow)
 	{