diff gtk/dw.c @ 69:9510897c0b03

Added new container functions, and implemented some missing functionality.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 04 Feb 2002 16:04:43 +0000
parents ab9b0fa6c66e
children ab77a22a2a36
line wrap: on
line diff
--- a/gtk/dw.c	Tue Jan 22 23:45:01 2002 +0000
+++ b/gtk/dw.c	Mon Feb 04 16:04:43 2002 +0000
@@ -446,9 +446,16 @@
 {
 	GList *tmp = (GList *)gtk_object_get_data(GTK_OBJECT(widget), "selectlist");
 	char *rowdata = gtk_clist_get_row_data(GTK_CLIST(widget), row);
+	int multi = (int)gtk_object_get_data(GTK_OBJECT(widget), "multi");
 
 	if(rowdata)
 	{
+		if(!multi)
+		{
+			g_list_free(tmp);
+			tmp = NULL;
+		}
+
 		tmp = g_list_append(tmp, rowdata);
 		gtk_object_set_data(GTK_OBJECT(widget), "selectlist", tmp);
 	}
@@ -3683,26 +3690,35 @@
 		return NULL;
 	}
 
-	/* If there is an old query list, free it */
-	list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "querylist");
-	if(list)
-		g_list_free(list);
-
-	/* Move the current selection list to the query list, and remove the
-	 * current selection list.
-	 */
-	list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "selectlist");
-	gtk_object_set_data(GTK_OBJECT(clist), "selectlist", NULL);
-	gtk_object_set_data(GTK_OBJECT(clist), "querylist", (gpointer)list);
-	gtk_clist_unselect_all(GTK_CLIST(clist));
-
-	if(list)
+	/* These should be separate but right now this will work */
+	if(flags & DW_CRA_SELECTED || flags & DW_CRA_CURSORED)
 	{
+		/* If there is an old query list, free it */
+		list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "querylist");
+		if(list)
+			g_list_free(list);
+
+		/* Move the current selection list to the query list, and remove the
+		 * current selection list.
+		 */
+		list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "selectlist");
+		gtk_object_set_data(GTK_OBJECT(clist), "selectlist", NULL);
+		gtk_object_set_data(GTK_OBJECT(clist), "querylist", (gpointer)list);
+		gtk_clist_unselect_all(GTK_CLIST(clist));
+
+		if(list)
+		{
+			gtk_object_set_data(GTK_OBJECT(clist), "querypos", (gpointer)1);
+			if(list->data)
+				retval =  list->data;
+			else
+				retval = "";
+		}
+	}
+	else
+	{
+		retval = (char *)gtk_clist_get_row_data(GTK_CLIST(clist), 0);
 		gtk_object_set_data(GTK_OBJECT(clist), "querypos", (gpointer)1);
-		if(list->data)
-			retval =  list->data;
-		else
-			retval = "";
 	}
 	DW_MUTEX_UNLOCK;
 	return retval;
@@ -3732,29 +3748,110 @@
 		return NULL;
 	}
 
-	list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "querylist");
-
-	if(list)
+	/* These should be separate but right now this will work */
+	if(flags & DW_CRA_SELECTED || flags & DW_CRA_CURSORED)
 	{
-		int counter = 0, pos = (int)gtk_object_get_data(GTK_OBJECT(clist), "querypos");
-		gtk_object_set_data(GTK_OBJECT(clist), "querypos", (gpointer)pos+1);
-
-		while(list && counter < pos)
+		list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "querylist");
+
+		if(list)
 		{
-			list = list->next;
-			counter++;
+			int counter = 0, pos = (int)gtk_object_get_data(GTK_OBJECT(clist), "querypos");
+			gtk_object_set_data(GTK_OBJECT(clist), "querypos", (gpointer)pos+1);
+
+			while(list && counter < pos)
+			{
+				list = list->next;
+				counter++;
+			}
+
+			if(list && list->data)
+				retval = list->data;
+			else if(list && !list->data)
+				retval = "";
 		}
-
-		if(list && list->data)
-			retval = list->data;
-		else if(list && !list->data)
-			retval = "";
+	}
+	else
+	{
+		int pos = (int)gtk_object_get_data(GTK_OBJECT(clist), "querypos");
+
+		retval = (char *)gtk_clist_get_row_data(GTK_CLIST(clist), pos);
+		gtk_object_set_data(GTK_OBJECT(clist), "querypos", (gpointer)pos+1);
 	}
 	DW_MUTEX_UNLOCK;
 	return retval;
 }
 
 /*
+ * Cursors the item with the text speficied, and scrolls to that item.
+ * Parameters:
+ *       handle: Handle to the window (widget) to be queried.
+ *       text:  Text usually returned by dw_container_query().
+ */
+void dw_container_cursor(HWND handle, char *text)
+{
+	int _locked_by_me = FALSE;
+	GtkWidget *clist;
+	int rowcount, z;
+	char *rowdata;
+
+	DW_MUTEX_LOCK;
+	clist = (GtkWidget*)gtk_object_get_user_data(GTK_OBJECT(handle));
+
+	if(!clist)
+	{
+		DW_MUTEX_UNLOCK;
+		return;
+	}
+	rowcount = (int)gtk_object_get_data(GTK_OBJECT(clist), "rowcount");
+
+	for(z=0;z<rowcount;z++)
+	{
+		rowdata = gtk_clist_get_row_data(GTK_CLIST(clist), z);
+		if(rowdata == text)
+		{
+			gfloat pos;
+			GtkAdjustment *adj = gtk_clist_get_vadjustment(GTK_CLIST(clist));
+			gtk_clist_select_row(GTK_CLIST(clist), z, 0);
+
+			pos = ((adj->upper - adj->lower) * ((gfloat)z/(gfloat)rowcount)) + adj->lower;
+			gtk_adjustment_set_value(adj, pos);
+			DW_MUTEX_UNLOCK;
+			return;
+		}
+	}
+
+	DW_MUTEX_UNLOCK;
+}
+
+/*
+ * Optimizes the column widths so that all data is visible.
+ * Parameters:
+ *       handle: Handle to the window (widget) to be optimized.
+ */
+void dw_container_optimize(HWND handle)
+{
+	int _locked_by_me = FALSE;
+	GtkWidget *clist;
+	int colcount, z;
+
+	DW_MUTEX_LOCK;
+	clist = (GtkWidget*)gtk_object_get_user_data(GTK_OBJECT(handle));
+
+	if(!clist)
+	{
+		DW_MUTEX_UNLOCK;
+		return;
+	}
+	colcount = (int)gtk_object_get_data(GTK_OBJECT(clist), "colcount");
+	for(z=0;z<colcount;z++)
+	{
+		int width = gtk_clist_optimal_column_width(GTK_CLIST(clist), z);
+		gtk_clist_set_column_width(GTK_CLIST(clist), z, width);
+	}
+	DW_MUTEX_UNLOCK;
+}
+
+/*
  * Creates a rendering context widget (window) to be packed.
  * Parameters:
  *       id: An id to be used with dw_window_from_id.
@@ -4645,9 +4742,15 @@
 	if(GTK_IS_CLIST(handle2))
 	{
 		if(style & DW_CCS_EXTENDSEL)
+		{
 			gtk_clist_set_selection_mode(GTK_CLIST(handle2), GTK_SELECTION_MULTIPLE);
+			gtk_object_set_data(GTK_OBJECT(handle2), "multi", (gpointer)1);
+		}
 		if(style & DW_CCS_SINGLESEL)
+		{
 			gtk_clist_set_selection_mode(GTK_CLIST(handle2), GTK_SELECTION_SINGLE);
+			gtk_object_set_data(GTK_OBJECT(handle2), "multi", (gpointer)0);
+		}
 	}
 	if(GTK_IS_LABEL(handle2))
 	{