summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkclist.c165
-rw-r--r--gtk/gtkclist.h31
-rw-r--r--gtk/testgtk.c66
-rw-r--r--tests/testgtk.c66
4 files changed, 300 insertions, 28 deletions
diff --git a/gtk/gtkclist.c b/gtk/gtkclist.c
index 50fe0c0b95..211d8f42b1 100644
--- a/gtk/gtkclist.c
+++ b/gtk/gtkclist.c
@@ -877,6 +877,25 @@ gtk_clist_moveto (GtkCList * clist,
}
}
+GtkCellType
+gtk_clist_get_cell_type (GtkCList * clist,
+ gint row,
+ gint column)
+{
+ GtkCListRow *clist_row;
+
+ g_return_val_if_fail (clist != NULL, -1);
+
+ if (row < 0 || row >= clist->rows)
+ return -1;
+ if (column < 0 || column >= clist->columns)
+ return -1;
+
+ clist_row = (g_list_nth (clist->row_list, row))->data;
+
+ return clist_row->cell[column].type;
+}
+
void
gtk_clist_set_text (GtkCList * clist,
gint row,
@@ -908,6 +927,32 @@ gtk_clist_set_text (GtkCList * clist,
}
}
+gint
+gtk_clist_get_text (GtkCList * clist,
+ gint row,
+ gint column,
+ gchar ** text)
+{
+ GtkCListRow *clist_row;
+
+ g_return_val_if_fail (clist != NULL, 0);
+
+ if (row < 0 || row >= clist->rows)
+ return 0;
+ if (column < 0 || column >= clist->columns)
+ return 0;
+
+ clist_row = (g_list_nth (clist->row_list, row))->data;
+
+ if (clist_row->cell[column].type != GTK_CELL_TEXT)
+ return 0;
+
+ if (text)
+ *text = GTK_CELL_TEXT (clist_row->cell[column])->text;
+
+ return 1;
+}
+
void
gtk_clist_set_pixmap (GtkCList * clist,
gint row,
@@ -938,6 +983,35 @@ gtk_clist_set_pixmap (GtkCList * clist,
}
}
+gint
+gtk_clist_get_pixmap (GtkCList * clist,
+ gint row,
+ gint column,
+ GdkPixmap ** pixmap,
+ GdkBitmap ** mask)
+{
+ GtkCListRow *clist_row;
+
+ g_return_val_if_fail (clist != NULL, 0);
+
+ if (row < 0 || row >= clist->rows)
+ return 0;
+ if (column < 0 || column >= clist->columns)
+ return 0;
+
+ clist_row = (g_list_nth (clist->row_list, row))->data;
+
+ if (clist_row->cell[column].type != GTK_CELL_PIXMAP)
+ return 0;
+
+ if (pixmap)
+ *pixmap = GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap;
+ if (mask)
+ *mask = GTK_CELL_PIXMAP (clist_row->cell[column])->mask;
+
+ return 1;
+}
+
void
gtk_clist_set_pixtext (GtkCList * clist,
gint row,
@@ -970,6 +1044,41 @@ gtk_clist_set_pixtext (GtkCList * clist,
}
}
+gint
+gtk_clist_get_pixtext (GtkCList * clist,
+ gint row,
+ gint column,
+ gchar ** text,
+ guint8 * spacing,
+ GdkPixmap ** pixmap,
+ GdkBitmap ** mask)
+{
+ GtkCListRow *clist_row;
+
+ g_return_val_if_fail (clist != NULL, 0);
+
+ if (row < 0 || row >= clist->rows)
+ return 0;
+ if (column < 0 || column >= clist->columns)
+ return 0;
+
+ clist_row = (g_list_nth (clist->row_list, row))->data;
+
+ if (clist_row->cell[column].type != GTK_CELL_PIXTEXT)
+ return 0;
+
+ if (text)
+ *text = GTK_CELL_PIXTEXT (clist_row->cell[column])->text;
+ if (spacing)
+ *spacing = GTK_CELL_PIXTEXT (clist_row->cell[column])->spacing;
+ if (pixmap)
+ *pixmap = GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap;
+ if (mask)
+ *mask = GTK_CELL_PIXTEXT (clist_row->cell[column])->mask;
+
+ return 1;
+}
+
void
gtk_clist_set_foreground (GtkCList * clist,
gint row,
@@ -1048,6 +1157,12 @@ gtk_clist_append (GtkCList * clist,
clist_row = row_new (clist);
clist->rows++;
+ /* set the text in the row's columns */
+ if (text)
+ for (i = 0; i < clist->columns; i++)
+ if (text[i])
+ cell_set_text (clist, clist_row, i, text[i]);
+
/* keeps track of the end of the list so the list
* doesn't have to be traversed every time a item is added */
if (!clist->row_list)
@@ -1069,12 +1184,6 @@ gtk_clist_append (GtkCList * clist,
}
else
clist->row_list_end = (g_list_append (clist->row_list_end, clist_row))->next;
-
- /* set the text in the row's columns */
- if (text)
- for (i = 0; i < clist->columns; i++)
- if (text[i])
- cell_set_text (clist, clist_row, i, text[i]);
/* redraw the list if it's not frozen */
if (!GTK_CLIST_FROZEN (clist))
@@ -1107,6 +1216,12 @@ gtk_clist_insert (GtkCList * clist,
/* create the row */
clist_row = row_new (clist);
+ /* set the text in the row's columns */
+ if (text)
+ for (i = 0; i < clist->columns; i++)
+ if (text[i])
+ cell_set_text (clist, clist_row, i, text[i]);
+
/* reset the row end pointer if we're inserting at the
* end of the list */
if (row == clist->rows)
@@ -1116,12 +1231,6 @@ gtk_clist_insert (GtkCList * clist,
clist->rows++;
- /* set the text in the row's columns */
- if (text)
- for (i = 0; i < clist->columns; i++)
- if (text[i])
- cell_set_text (clist, clist_row, i, text[i]);
-
/* redraw the list if it isn't frozen */
if (!GTK_CLIST_FROZEN (clist))
{
@@ -1271,6 +1380,38 @@ gtk_clist_get_row_data (GtkCList * clist,
return clist_row->data;
}
+gint
+gtk_clist_find_row_from_data (GtkCList * clist,
+ gpointer data)
+{
+ GList *list;
+ gint n;
+
+ g_return_val_if_fail (clist != NULL, -1);
+ g_return_val_if_fail (GTK_IS_CLIST (clist), -1);
+
+ if (clist->rows < 1)
+ return -1; /* is this an optimization or just worthless? */
+
+ n = 0;
+ list = clist->row_list;
+ while (list)
+ {
+ GtkCListRow *clist_row;
+
+ clist_row = list->data;
+ if (clist_row->data == data)
+ break;
+ n++;
+ list = list->next;
+ }
+
+ if (list)
+ return n;
+
+ return -1;
+}
+
void
gtk_clist_select_row (GtkCList * clist,
gint row,
diff --git a/gtk/gtkclist.h b/gtk/gtkclist.h
index 618ceb3664..164e2070c5 100644
--- a/gtk/gtkclist.h
+++ b/gtk/gtkclist.h
@@ -350,12 +350,24 @@ void gtk_clist_moveto (GtkCList * clist,
gint gtk_clist_row_isvisable (GtkCList * clist,
gint row);
+/* returns the cell type */
+GtkCellType gtk_clist_get_cell_type (GtkCList * clist,
+ gint row,
+ gint column);
+
/* sets a given cell's text, replacing it's current contents */
void gtk_clist_set_text (GtkCList * clist,
gint row,
gint column,
gchar * text);
+/* for the "get" functions, any of the return pointer can be
+ * NULL if you are not interested */
+gint gtk_clist_get_text (GtkCList * clist,
+ gint row,
+ gint column,
+ gchar ** text);
+
/* sets a given cell's pixmap, replacing it's current contents */
void gtk_clist_set_pixmap (GtkCList * clist,
gint row,
@@ -363,6 +375,12 @@ void gtk_clist_set_pixmap (GtkCList * clist,
GdkPixmap * pixmap,
GdkBitmap * mask);
+gint gtk_clist_get_pixmap (GtkCList * clist,
+ gint row,
+ gint column,
+ GdkPixmap ** pixmap,
+ GdkBitmap ** mask);
+
/* sets a given cell's pixmap and text, replacing it's current contents */
void gtk_clist_set_pixtext (GtkCList * clist,
gint row,
@@ -372,6 +390,14 @@ void gtk_clist_set_pixtext (GtkCList * clist,
GdkPixmap * pixmap,
GdkBitmap * mask);
+gint gtk_clist_get_pixtext (GtkCList * clist,
+ gint row,
+ gint column,
+ gchar ** text,
+ guint8 * spacing,
+ GdkPixmap ** pixmap,
+ GdkBitmap ** mask);
+
/* sets the foreground color of a row, the colar must already
* be allocated */
void gtk_clist_set_foreground (GtkCList * clist,
@@ -416,6 +442,11 @@ void gtk_clist_set_row_data (GtkCList * clist,
gpointer gtk_clist_get_row_data (GtkCList * clist,
gint row);
+/* givin a data pointer, find the first (and hopefully only!)
+ * row that points to that data, or -1 if none do */
+gint gtk_clist_find_row_from_data (GtkCList * clist,
+ gpointer data);
+
/* force selection of a row */
void gtk_clist_select_row (GtkCList * clist,
gint row,
diff --git a/gtk/testgtk.c b/gtk/testgtk.c
index 8bcf2bc8d3..ea08514011 100644
--- a/gtk/testgtk.c
+++ b/gtk/testgtk.c
@@ -1573,9 +1573,16 @@ static gint clist_selected_row = 0;
void
add1000_clist (GtkWidget *widget, gpointer data)
{
- gint i;
+ gint i, row;
char text[TESTGTK_CLIST_COLUMNS][50];
char *texts[TESTGTK_CLIST_COLUMNS];
+ GdkBitmap *mask;
+ GdkPixmap *pixmap;
+
+ pixmap = gdk_pixmap_create_from_xpm (GTK_CLIST (data)->clist_window,
+ &mask,
+ &GTK_WIDGET (data)->style->white,
+ "test.xpm");
for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
{
@@ -1583,6 +1590,7 @@ add1000_clist (GtkWidget *widget, gpointer data)
sprintf (text[i], "Column %d", i);
}
+ texts[3] = NULL;
sprintf (text[1], "Right");
sprintf (text[2], "Center");
@@ -1590,10 +1598,13 @@ add1000_clist (GtkWidget *widget, gpointer data)
for (i = 0; i < 1000; i++)
{
sprintf (text[0], "Row %d", clist_rows++);
- gtk_clist_append (GTK_CLIST (data), texts);
+ row = gtk_clist_append (GTK_CLIST (data), texts);
+ gtk_clist_set_pixtext (GTK_CLIST (data), row, 3, "Testing", 5, pixmap, mask);
}
gtk_clist_thaw (GTK_CLIST (data));
+ gdk_pixmap_unref (pixmap);
+ gdk_bitmap_unref (mask);
}
void
@@ -1654,7 +1665,11 @@ select_clist (GtkWidget *widget,
gint column,
GdkEventButton *bevent)
{
- gint button = 0;
+ gint button = 0, i;
+ guint8 spacing;
+ gchar *text;
+ GdkPixmap *pixmap;
+ GdkBitmap *mask;
if (bevent)
button = bevent->button;
@@ -1662,16 +1677,45 @@ select_clist (GtkWidget *widget,
g_print ("GtkCList Selection: row %d column %d button %d\n",
row, column, button);
+ for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
+ {
+ switch (gtk_clist_get_cell_type (GTK_CLIST (widget), row, i))
+ {
+ case GTK_CELL_TEXT:
+ g_print ("CELL %d GTK_CELL_TEXT\n", i);
+ gtk_clist_get_text (GTK_CLIST (widget), row, i, &text);
+ g_print ("TEXT: %s\n", text);
+ break;
+
+ case GTK_CELL_PIXMAP:
+ g_print ("CELL %d GTK_CELL_PIXMAP\n", i);
+ gtk_clist_get_pixmap (GTK_CLIST (widget), row, i, &pixmap, &mask);
+ g_print ("PIXMAP: %d\n", (int) pixmap);
+ g_print ("MASK: %d\n", (int) mask);
+ break;
+
+ case GTK_CELL_PIXTEXT:
+ g_print ("CELL %d GTK_CELL_PIXTEXT\n", i);
+ gtk_clist_get_pixtext (GTK_CLIST (widget), row, i, &text, &spacing, &pixmap, &mask);
+ g_print ("TEXT: %s\n", text);
+ g_print ("SPACING: %d\n", spacing);
+ g_print ("PIXMAP: %d\n", (int) pixmap);
+ g_print ("MASK: %d\n", (int) mask);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ g_print ("\n\n");
+
clist_selected_row = row;
}
void
list_selection_clist (GtkWidget *widget, gpointer data)
{
- GList *list;
- GtkCListRow *clist_row;
- GtkCList *clist;
-
}
void
@@ -1729,9 +1773,10 @@ create_clist ()
/* create GtkCList here so we have a pointer to throw at the
* button callbacks -- more is done with it later */
clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
+ /*clist = gtk_clist_new (TESTGTK_CLIST_COLUMNS);*/
/* control buttons */
- button = gtk_button_new_with_label ("Add 1,000 Rows");
+ button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT (button),
@@ -1807,6 +1852,11 @@ create_clist ()
/*
* the rest of the clist configuration
*/
+ /*
+ gtk_clist_set_column_title (GTK_CLIST (clist), 0, "Hello");
+ gtk_clist_set_column_title (GTK_CLIST (clist), 4, "Joe 4");
+ */
+ gtk_clist_column_titles_passive (GTK_CLIST (clist));
gtk_clist_set_row_height (GTK_CLIST (clist), 20);
gtk_signal_connect (GTK_OBJECT (clist),
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 8bcf2bc8d3..ea08514011 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -1573,9 +1573,16 @@ static gint clist_selected_row = 0;
void
add1000_clist (GtkWidget *widget, gpointer data)
{
- gint i;
+ gint i, row;
char text[TESTGTK_CLIST_COLUMNS][50];
char *texts[TESTGTK_CLIST_COLUMNS];
+ GdkBitmap *mask;
+ GdkPixmap *pixmap;
+
+ pixmap = gdk_pixmap_create_from_xpm (GTK_CLIST (data)->clist_window,
+ &mask,
+ &GTK_WIDGET (data)->style->white,
+ "test.xpm");
for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
{
@@ -1583,6 +1590,7 @@ add1000_clist (GtkWidget *widget, gpointer data)
sprintf (text[i], "Column %d", i);
}
+ texts[3] = NULL;
sprintf (text[1], "Right");
sprintf (text[2], "Center");
@@ -1590,10 +1598,13 @@ add1000_clist (GtkWidget *widget, gpointer data)
for (i = 0; i < 1000; i++)
{
sprintf (text[0], "Row %d", clist_rows++);
- gtk_clist_append (GTK_CLIST (data), texts);
+ row = gtk_clist_append (GTK_CLIST (data), texts);
+ gtk_clist_set_pixtext (GTK_CLIST (data), row, 3, "Testing", 5, pixmap, mask);
}
gtk_clist_thaw (GTK_CLIST (data));
+ gdk_pixmap_unref (pixmap);
+ gdk_bitmap_unref (mask);
}
void
@@ -1654,7 +1665,11 @@ select_clist (GtkWidget *widget,
gint column,
GdkEventButton *bevent)
{
- gint button = 0;
+ gint button = 0, i;
+ guint8 spacing;
+ gchar *text;
+ GdkPixmap *pixmap;
+ GdkBitmap *mask;
if (bevent)
button = bevent->button;
@@ -1662,16 +1677,45 @@ select_clist (GtkWidget *widget,
g_print ("GtkCList Selection: row %d column %d button %d\n",
row, column, button);
+ for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
+ {
+ switch (gtk_clist_get_cell_type (GTK_CLIST (widget), row, i))
+ {
+ case GTK_CELL_TEXT:
+ g_print ("CELL %d GTK_CELL_TEXT\n", i);
+ gtk_clist_get_text (GTK_CLIST (widget), row, i, &text);
+ g_print ("TEXT: %s\n", text);
+ break;
+
+ case GTK_CELL_PIXMAP:
+ g_print ("CELL %d GTK_CELL_PIXMAP\n", i);
+ gtk_clist_get_pixmap (GTK_CLIST (widget), row, i, &pixmap, &mask);
+ g_print ("PIXMAP: %d\n", (int) pixmap);
+ g_print ("MASK: %d\n", (int) mask);
+ break;
+
+ case GTK_CELL_PIXTEXT:
+ g_print ("CELL %d GTK_CELL_PIXTEXT\n", i);
+ gtk_clist_get_pixtext (GTK_CLIST (widget), row, i, &text, &spacing, &pixmap, &mask);
+ g_print ("TEXT: %s\n", text);
+ g_print ("SPACING: %d\n", spacing);
+ g_print ("PIXMAP: %d\n", (int) pixmap);
+ g_print ("MASK: %d\n", (int) mask);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ g_print ("\n\n");
+
clist_selected_row = row;
}
void
list_selection_clist (GtkWidget *widget, gpointer data)
{
- GList *list;
- GtkCListRow *clist_row;
- GtkCList *clist;
-
}
void
@@ -1729,9 +1773,10 @@ create_clist ()
/* create GtkCList here so we have a pointer to throw at the
* button callbacks -- more is done with it later */
clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
+ /*clist = gtk_clist_new (TESTGTK_CLIST_COLUMNS);*/
/* control buttons */
- button = gtk_button_new_with_label ("Add 1,000 Rows");
+ button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT (button),
@@ -1807,6 +1852,11 @@ create_clist ()
/*
* the rest of the clist configuration
*/
+ /*
+ gtk_clist_set_column_title (GTK_CLIST (clist), 0, "Hello");
+ gtk_clist_set_column_title (GTK_CLIST (clist), 4, "Joe 4");
+ */
+ gtk_clist_column_titles_passive (GTK_CLIST (clist));
gtk_clist_set_row_height (GTK_CLIST (clist), 20);
gtk_signal_connect (GTK_OBJECT (clist),