diff gtk/dw.c @ 60:61869769c050

Sync with the latest DW code.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 29 Nov 2001 15:10:39 +0000
parents 1ed95c8ec2ff
children a6801a2260af
line wrap: on
line diff
--- a/gtk/dw.c	Wed Nov 21 23:39:41 2001 +0000
+++ b/gtk/dw.c	Thu Nov 29 15:10:39 2001 +0000
@@ -965,10 +965,13 @@
 
 	DW_MUTEX_LOCK;
 	gtk_widget_show(handle);
-	gdk_window_raise(GTK_WIDGET(handle)->window);
-	gdk_flush();
-	gdk_window_show(GTK_WIDGET(handle)->window);
-	gdk_flush();
+	if(GTK_WIDGET(handle)->window)
+	{
+		gdk_window_raise(GTK_WIDGET(handle)->window);
+		gdk_flush();
+		gdk_window_show(GTK_WIDGET(handle)->window);
+		gdk_flush();
+	}
 	defaultitem = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "defaultitem");
 	if(defaultitem)
 		gtk_widget_grab_focus(defaultitem);
@@ -1777,6 +1780,8 @@
 		DW_MUTEX_UNLOCK;
 		return FALSE;
 	}
+	gtk_tree_set_view_mode(GTK_TREE(tree), GTK_TREE_VIEW_ITEM);
+	gtk_tree_set_selection_mode(GTK_TREE(tree), GTK_SELECTION_SINGLE);
 	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tmp), tree);
 	/* Set the selection mode */
 	gtk_tree_set_selection_mode (GTK_TREE(tree), GTK_SELECTION_SINGLE);
@@ -2077,7 +2082,7 @@
  *       id: An ID to be used with WinWindowFromID() or 0L.
  *       multi: Multiple select TRUE or FALSE.
  */
-HWND dw_listbox_new(unsigned long id, int multi)
+HWND dw_listbox_new(unsigned long id, int multi)
 {
 	GtkWidget *tmp, *list;
 	int _locked_by_me = FALSE;
@@ -2109,7 +2114,7 @@
  */
 void dw_window_set_icon(HWND handle, unsigned long id)
 {
-	GdkBitmap *bitmap;
+	GdkBitmap *bitmap = NULL;
 	GdkPixmap *icon_pixmap;
 	int _locked_by_me = FALSE;
 
@@ -2130,7 +2135,7 @@
  */
 void dw_window_set_bitmap(HWND handle, unsigned long id)
 {
-	GdkBitmap *bitmap;
+	GdkBitmap *bitmap = NULL;
 	GdkPixmap *tmp;
 	int _locked_by_me = FALSE;
 
@@ -2740,6 +2745,99 @@
 }
 
 /*
+ * Inserts an item into a tree window (widget) after another item.
+ * Parameters:
+ *          handle: Handle to the tree to be inserted.
+ *          item: Handle to the item to be positioned after.
+ *          title: The text title of the entry.
+ *          icon: Handle to coresponding icon.
+ *          parent: Parent handle or 0 if root.
+ *          itemdata: Item specific data.
+ */
+HWND dw_tree_insert_after(HWND handle, HWND item, char *title, unsigned long icon, HWND parent, void *itemdata)
+{
+	GtkWidget *newitem, *tree, *subtree, *label, *hbox, *pixmap;
+	GdkPixmap *gdkpix;
+	GdkBitmap *gdkbmp = NULL;
+	int position = 0;
+	int _locked_by_me = FALSE;
+
+	if(!handle)
+		return NULL;
+
+	DW_MUTEX_LOCK;
+	tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
+	if(!tree || !GTK_IS_TREE(tree))
+	{
+		DW_MUTEX_UNLOCK;
+		return NULL;
+	}
+
+	if(item && GTK_IS_TREE_ITEM(item))
+		position = gtk_tree_child_position(GTK_TREE(tree), item);
+
+	position++;
+
+	newitem = gtk_tree_item_new();
+	label = gtk_label_new(title);
+	gtk_object_set_data(GTK_OBJECT(newitem), "text", (gpointer)strdup(title));
+	gtk_object_set_data(GTK_OBJECT(newitem), "itemdata", (gpointer)itemdata);
+	gtk_object_set_data(GTK_OBJECT(newitem), "tree", (gpointer)tree);
+	hbox = gtk_hbox_new(FALSE, 2);
+	gtk_object_set_data(GTK_OBJECT(newitem), "hbox", (gpointer)hbox);
+	gdkpix = _find_pixmap(&gdkbmp, icon, hbox);
+	pixmap = gtk_pixmap_new(gdkpix, gdkbmp);
+	gtk_container_add(GTK_CONTAINER(newitem), hbox);
+	gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, TRUE, 0);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
+	gtk_widget_show(label);
+	gtk_widget_show(pixmap);
+	gtk_widget_show(hbox);
+
+	if(parent)
+	{
+		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);
+
+			thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "container-context-func");
+			work = (void *)gtk_object_get_data(GTK_OBJECT(tree), "container-context-data");
+
+			if(thisfunc && work)
+				gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", 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);
+			gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree);
+			gtk_tree_item_collapse(GTK_TREE_ITEM(parent));
+			gtk_widget_show(subtree);
+			gtk_tree_item_expand(GTK_TREE_ITEM(parent));
+			gtk_tree_item_collapse(GTK_TREE_ITEM(parent));
+		}
+		gtk_object_set_data(GTK_OBJECT(newitem), "parenttree", (gpointer)subtree);
+		gtk_tree_insert(GTK_TREE(subtree), newitem, position);
+	}
+	else
+	{
+		gtk_object_set_data(GTK_OBJECT(newitem), "parenttree", (gpointer)tree);
+		gtk_tree_insert(GTK_TREE(tree), newitem, position);
+	}
+	gtk_tree_item_expand(GTK_TREE_ITEM(newitem));
+	gtk_tree_item_collapse(GTK_TREE_ITEM(newitem));
+	gtk_widget_show(newitem);
+	DW_MUTEX_UNLOCK;
+	return newitem;
+}
+
+/*
  * Inserts an item into a tree window (widget).
  * Parameters:
  *          handle: Handle to the tree to be inserted.
@@ -2752,9 +2850,12 @@
 {
 	GtkWidget *item, *tree, *subtree, *label, *hbox, *pixmap;
 	GdkPixmap *gdkpix;
-	GdkBitmap *gdkbmp;
+	GdkBitmap *gdkbmp = NULL;
 	int _locked_by_me = FALSE;
 
+	if(!handle)
+		return NULL;
+
 	DW_MUTEX_LOCK;
 	tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
 	if(!tree || !GTK_IS_TREE(tree))
@@ -2806,10 +2907,14 @@
 			gtk_tree_item_expand(GTK_TREE_ITEM(parent));
 			gtk_tree_item_collapse(GTK_TREE_ITEM(parent));
 		}
+		gtk_object_set_data(GTK_OBJECT(item), "parenttree", (gpointer)subtree);
 		gtk_tree_append(GTK_TREE(subtree), item);
 	}
 	else
+	{
+		gtk_object_set_data(GTK_OBJECT(item), "parenttree", (gpointer)tree);
 		gtk_tree_append(GTK_TREE(tree), item);
+	}
 	gtk_tree_item_expand(GTK_TREE_ITEM(item));
 	gtk_tree_item_collapse(GTK_TREE_ITEM(item));
 	gtk_widget_show(item);
@@ -2829,10 +2934,13 @@
 {
 	GtkWidget *label, *hbox, *pixmap;
 	GdkPixmap *gdkpix;
-	GdkBitmap *gdkbmp;
+	GdkBitmap *gdkbmp = NULL;
 	char *oldtext;
 	int _locked_by_me = FALSE;
 
+	if(!handle || !item)
+		return;
+
 	DW_MUTEX_LOCK;
 	oldtext = (char *)gtk_object_get_data(GTK_OBJECT(item), "text");
 	if(oldtext)
@@ -2865,6 +2973,9 @@
 {
 	int _locked_by_me = FALSE;
 
+	if(!handle || !item)
+		return;
+
 	DW_MUTEX_LOCK;
 	gtk_object_set_data(GTK_OBJECT(item), "itemdata", (gpointer)itemdata);
 	DW_MUTEX_UNLOCK;
@@ -2881,6 +2992,9 @@
 	GtkWidget *lastselect;
 	int _locked_by_me = FALSE;
 
+	if(!handle || !item)
+		return;
+
 	DW_MUTEX_LOCK;
 	lastselect = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "lastselect");
 	if(lastselect && GTK_IS_TREE_ITEM(lastselect))
@@ -2900,6 +3014,9 @@
 	GtkWidget *tree;
 	int _locked_by_me = FALSE;
 
+	if(!handle)
+		return;
+
 	DW_MUTEX_LOCK;
 	tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
 	if(!tree || !GTK_IS_TREE(tree))
@@ -2921,6 +3038,9 @@
 {
 	int _locked_by_me = FALSE;
 
+	if(!handle || !item)
+		return;
+
 	DW_MUTEX_LOCK;
 	if(GTK_IS_TREE_ITEM(item))
 		gtk_tree_item_expand(GTK_TREE_ITEM(item));
@@ -2937,6 +3057,9 @@
 {
 	int _locked_by_me = FALSE;
 
+	if(!handle || !item)
+		return;
+
 	DW_MUTEX_LOCK;
 	if(GTK_IS_TREE_ITEM(item))
 		gtk_tree_item_collapse(GTK_TREE_ITEM(item));
@@ -2951,9 +3074,12 @@
  */
 void dw_tree_delete(HWND handle, HWND item)
 {
-	GtkWidget *tree, *lastselect;
+	GtkWidget *tree, *lastselect, *parenttree;
 	int _locked_by_me = FALSE;
 
+	if(!handle || !item || !GTK_IS_WIDGET(handle) || !GTK_IS_WIDGET(item))
+		return;
+
 	DW_MUTEX_LOCK;
 	tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
 	if(!tree || !GTK_IS_TREE(tree))
@@ -2963,10 +3089,22 @@
 	}
 
 	lastselect = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "lastselect");
+
 	if(lastselect == item)
+	{
+		if(lastselect && GTK_IS_WIDGET(lastselect))
+		{
+			parenttree = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(lastselect), "parenttree");
+			if(parenttree && GTK_IS_TREE(parenttree))
+				gtk_tree_unselect_child(GTK_TREE(parenttree), lastselect);
+		}
 		gtk_object_set_data(GTK_OBJECT(handle), "lastselect", NULL);
-
-	gtk_widget_destroy(item);
+	}
+
+	parenttree = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(item), "parenttree");
+
+	if(parenttree && GTK_IS_WIDGET(parenttree))
+		gtk_tree_remove_item(GTK_TREE(parenttree), item);
 	DW_MUTEX_UNLOCK;
 }
 
@@ -3156,7 +3294,7 @@
 	if(flag & DW_CFA_BITMAPORICON)
 	{
 		long hicon = *((long *)data);
-		GdkBitmap *bitmap;
+		GdkBitmap *bitmap = NULL;
 		GdkPixmap *pixmap = _find_pixmap(&bitmap, hicon, clist);
 
 		if(pixmap)
@@ -3550,7 +3688,7 @@
 
 GdkGC *_set_colors(GdkWindow *window)
 {
-	GdkGC *gc;
+	GdkGC *gc = NULL;
 	int index = _find_thread_index(dw_thread_id());
 
 	if(!window)
@@ -3768,7 +3906,7 @@
  */
 HPIXMAP dw_pixmap_grab(HWND handle, ULONG id)
 {
-	GdkBitmap *bitmap;
+	GdkBitmap *bitmap = NULL;
 	HPIXMAP pixmap;
 	int _locked_by_me = FALSE;
 
@@ -4847,6 +4985,45 @@
 }
 
 /*
+ * Returns the index to the current selected item or -1 when done.
+ * Parameters:
+ *          handle: Handle to the listbox to be queried.
+ *          where: Either the previous return or -1 to restart.
+ */
+int dw_listbox_selected_multi(HWND handle, int where)
+{
+	GtkWidget *handle2 = handle;
+	int retval = DW_LIT_NONE;
+	int _locked_by_me = FALSE;
+
+	DW_MUTEX_LOCK;
+	if(GTK_IS_SCROLLED_WINDOW(handle))
+	{
+		GtkWidget *tmp = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
+		if(tmp)
+			handle2 = tmp;
+	}
+	if(GTK_IS_LIST(handle2))
+	{
+		int counter = 0;
+		GList *list = GTK_LIST(handle2)->selection;
+		while(list)
+		{
+			if(counter > where)
+			{
+				retval = counter;
+				break;
+			}
+
+			list = list->next;
+			counter++;
+		}
+	}
+	DW_MUTEX_UNLOCK;
+	return retval;
+}
+
+/*
  * Returns the index to the item in the list currently selected.
  * Parameters:
  *          handle: Handle to the listbox to be queried.