summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--ChangeLog.pre-2-011
-rw-r--r--ChangeLog.pre-2-1011
-rw-r--r--ChangeLog.pre-2-211
-rw-r--r--ChangeLog.pre-2-411
-rw-r--r--ChangeLog.pre-2-611
-rw-r--r--ChangeLog.pre-2-811
-rw-r--r--gtk/gtkctree.c625
-rw-r--r--gtk/gtkctree.h3
-rw-r--r--gtk/testgtk.c118
-rw-r--r--tests/testgtk.c118
11 files changed, 809 insertions, 132 deletions
diff --git a/ChangeLog b/ChangeLog
index 618d8d87ee..adc2ff0974 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,10 +1,9 @@
-1998-06-21 Raja R Harinath <harinath@cs.umn.edu>
+Mon Jun 22 18:43:11 1998 Lars Hamann <lars@gtk.org>
- * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir)
- from, and clean up, the dependencies. Generate to intermediate
- files to prevent problems with Ctrl-C.
-
- * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir.
+ * gtk/gtkctree.c (draw_row): added new "line style"
+ GTK_CTREE_LINES_TABBED
+ * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to
+ search the glist pointer of an GtkCTreeRow
Fri Jun 19 14:46:56 1998 Stefan Jeske <stefan@gtk.org>
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index 618d8d87ee..adc2ff0974 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,10 +1,9 @@
-1998-06-21 Raja R Harinath <harinath@cs.umn.edu>
+Mon Jun 22 18:43:11 1998 Lars Hamann <lars@gtk.org>
- * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir)
- from, and clean up, the dependencies. Generate to intermediate
- files to prevent problems with Ctrl-C.
-
- * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir.
+ * gtk/gtkctree.c (draw_row): added new "line style"
+ GTK_CTREE_LINES_TABBED
+ * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to
+ search the glist pointer of an GtkCTreeRow
Fri Jun 19 14:46:56 1998 Stefan Jeske <stefan@gtk.org>
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 618d8d87ee..adc2ff0974 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,10 +1,9 @@
-1998-06-21 Raja R Harinath <harinath@cs.umn.edu>
+Mon Jun 22 18:43:11 1998 Lars Hamann <lars@gtk.org>
- * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir)
- from, and clean up, the dependencies. Generate to intermediate
- files to prevent problems with Ctrl-C.
-
- * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir.
+ * gtk/gtkctree.c (draw_row): added new "line style"
+ GTK_CTREE_LINES_TABBED
+ * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to
+ search the glist pointer of an GtkCTreeRow
Fri Jun 19 14:46:56 1998 Stefan Jeske <stefan@gtk.org>
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index 618d8d87ee..adc2ff0974 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,10 +1,9 @@
-1998-06-21 Raja R Harinath <harinath@cs.umn.edu>
+Mon Jun 22 18:43:11 1998 Lars Hamann <lars@gtk.org>
- * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir)
- from, and clean up, the dependencies. Generate to intermediate
- files to prevent problems with Ctrl-C.
-
- * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir.
+ * gtk/gtkctree.c (draw_row): added new "line style"
+ GTK_CTREE_LINES_TABBED
+ * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to
+ search the glist pointer of an GtkCTreeRow
Fri Jun 19 14:46:56 1998 Stefan Jeske <stefan@gtk.org>
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 618d8d87ee..adc2ff0974 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,10 +1,9 @@
-1998-06-21 Raja R Harinath <harinath@cs.umn.edu>
+Mon Jun 22 18:43:11 1998 Lars Hamann <lars@gtk.org>
- * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir)
- from, and clean up, the dependencies. Generate to intermediate
- files to prevent problems with Ctrl-C.
-
- * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir.
+ * gtk/gtkctree.c (draw_row): added new "line style"
+ GTK_CTREE_LINES_TABBED
+ * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to
+ search the glist pointer of an GtkCTreeRow
Fri Jun 19 14:46:56 1998 Stefan Jeske <stefan@gtk.org>
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 618d8d87ee..adc2ff0974 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,10 +1,9 @@
-1998-06-21 Raja R Harinath <harinath@cs.umn.edu>
+Mon Jun 22 18:43:11 1998 Lars Hamann <lars@gtk.org>
- * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir)
- from, and clean up, the dependencies. Generate to intermediate
- files to prevent problems with Ctrl-C.
-
- * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir.
+ * gtk/gtkctree.c (draw_row): added new "line style"
+ GTK_CTREE_LINES_TABBED
+ * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to
+ search the glist pointer of an GtkCTreeRow
Fri Jun 19 14:46:56 1998 Stefan Jeske <stefan@gtk.org>
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 618d8d87ee..adc2ff0974 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,10 +1,9 @@
-1998-06-21 Raja R Harinath <harinath@cs.umn.edu>
+Mon Jun 22 18:43:11 1998 Lars Hamann <lars@gtk.org>
- * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir)
- from, and clean up, the dependencies. Generate to intermediate
- files to prevent problems with Ctrl-C.
-
- * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir.
+ * gtk/gtkctree.c (draw_row): added new "line style"
+ GTK_CTREE_LINES_TABBED
+ * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to
+ search the glist pointer of an GtkCTreeRow
Fri Jun 19 14:46:56 1998 Stefan Jeske <stefan@gtk.org>
diff --git a/gtk/gtkctree.c b/gtk/gtkctree.c
index 416add4cc5..1d589827d9 100644
--- a/gtk/gtkctree.c
+++ b/gtk/gtkctree.c
@@ -26,6 +26,7 @@
#include <gdk/gdkx.h>
#define PM_SIZE 8
+#define TAB_SIZE (PM_SIZE + 6)
#define CELL_SPACING 1
#define CLIST_OPTIMUM_SIZE 512
#define COLUMN_INSET 3
@@ -1066,7 +1067,7 @@ draw_row (GtkCList *clist,
if (gdk_rectangle_intersect
(area, &row_rectangle, &intersect_rectangle))
{
- if (clist_row->state == GTK_STATE_SELECTED || clist_row->fg_set)
+ if (clist_row->state == GTK_STATE_SELECTED || clist_row->bg_set)
gdk_draw_rectangle (clist->clist_window,
bg_gc,
TRUE,
@@ -1108,7 +1109,7 @@ draw_row (GtkCList *clist,
cell_rectangle.height);
}
- if (clist_row->state == GTK_STATE_SELECTED || clist_row->fg_set)
+ if (clist_row->state == GTK_STATE_SELECTED || clist_row->bg_set)
gdk_draw_rectangle (clist->clist_window,
bg_gc,
TRUE,
@@ -1127,6 +1128,7 @@ draw_row (GtkCList *clist,
/* iterate and draw all the columns (row cells) and draw their contents */
for (i = 0; i < clist->columns; i++)
{
+
if (!need_redraw && ctree->tree_column != i)
continue;
@@ -1140,6 +1142,104 @@ draw_row (GtkCList *clist,
clip_rectangle.height += CELL_SPACING;
}
+ if (i == ctree->tree_column)
+ {
+
+ if (clist_row->state == GTK_STATE_SELECTED)
+ {
+ gdk_gc_set_foreground (ctree->lines_gc,
+ &GTK_WIDGET (ctree)->style->
+ fg[GTK_STATE_SELECTED]);
+ gdk_gc_set_background (ctree->lines_gc,
+ &GTK_WIDGET (ctree)->style->
+ bg[GTK_STATE_SELECTED]);
+ }
+ else
+ {
+ gdk_gc_set_foreground (ctree->lines_gc,
+ &GTK_WIDGET (ctree)->style->
+ fg[GTK_STATE_NORMAL]);
+ if (clist_row->bg_set)
+ gdk_gc_set_background (ctree->lines_gc,
+ &clist_row->background);
+ }
+
+ if (ctree->line_style == GTK_CTREE_LINES_TABBED)
+ {
+ if (clist->column[i].justification == GTK_JUSTIFY_RIGHT)
+ {
+ xdest = clip_rectangle.x + clip_rectangle.width - 1 -
+ (((GtkCTreeRow *) clist_row)->level - 1) *
+ ctree->tree_indent;
+
+ gdk_draw_line (clist->clist_window,
+ ctree->lines_gc,
+ -1,
+ row_rectangle.y - 1,
+ MAX (xdest - TAB_SIZE, clip_rectangle.x - 1),
+ row_rectangle.y - 1);
+
+ if (clist_row == clist->row_list_end->data)
+ gdk_draw_line
+ (clist->clist_window,
+ ctree->lines_gc,
+ -1,
+ row_rectangle.y + clist->row_height,
+ MAX (clip_rectangle.x + clip_rectangle.width -
+ TAB_SIZE - 1 -
+ (((GtkCTreeRow *) clist_row)->level > 1) *
+ MIN (ctree->tree_indent / 2, TAB_SIZE),
+ clip_rectangle.x - 1),
+ row_rectangle.y + clist->row_height);
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_rectangle
+ (clist->clist_window,
+ widget->style->bg_gc[GTK_STATE_PRELIGHT],
+ TRUE,
+ clip_rectangle.x + clip_rectangle.width,
+ row_rectangle.y,
+ CELL_SPACING + COLUMN_INSET,
+ row_rectangle.height);
+ }
+ else
+ {
+ xdest = clip_rectangle.x +
+ (((GtkCTreeRow *) clist_row)->level - 1) *
+ ctree->tree_indent;
+
+ gdk_draw_line (clist->clist_window,
+ ctree->lines_gc,
+ MIN (xdest + TAB_SIZE,
+ clip_rectangle.x + clip_rectangle.width),
+ row_rectangle.y - 1,
+ clist->clist_window_width,
+ row_rectangle.y - 1);
+
+ if (clist_row == clist->row_list_end->data)
+ gdk_draw_line
+ (clist->clist_window, ctree->lines_gc,
+ MIN (clip_rectangle.x + TAB_SIZE +
+ (((GtkCTreeRow *) clist_row)->level > 1) *
+ MIN (ctree->tree_indent / 2, TAB_SIZE),
+ clip_rectangle.x + clip_rectangle.width),
+ row_rectangle.y + clist->row_height,
+ clist->clist_window_width,
+ row_rectangle.y + clist->row_height);
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_rectangle
+ (clist->clist_window,
+ widget->style->bg_gc[GTK_STATE_PRELIGHT],
+ TRUE,
+ clip_rectangle.x - CELL_SPACING - COLUMN_INSET,
+ row_rectangle.y,
+ CELL_SPACING + COLUMN_INSET,
+ row_rectangle.height);
+ }
+ }
+ }
+
if (!area)
{
rect = &clip_rectangle;
@@ -1245,35 +1345,26 @@ draw_row (GtkCList *clist,
{
GdkGC *cgc;
GdkGC *tgc;
+ GdkGC *mbg_gc;
GList *work;
+ GList *work2;
gint xoffset;
gint yoffset;
gint xcenter;
gint ycenter;
gint offset_x;
gint offset_y = 0;
+ gint next_level;
+ gint in;
+ GdkPoint points[6];
xsrc = 0;
ysrc = 0;
- if (clist_row->state == GTK_STATE_SELECTED)
- {
- gdk_gc_set_foreground (ctree->lines_gc,
- &GTK_WIDGET (ctree)->style->
- fg[GTK_STATE_SELECTED]);
- gdk_gc_set_background (ctree->lines_gc,
- &GTK_WIDGET (ctree)->style->
- bg[GTK_STATE_SELECTED]);
- }
- else
- {
- gdk_gc_set_foreground (ctree->lines_gc,
- &GTK_WIDGET (ctree)->style->
- fg[GTK_STATE_NORMAL]);
- if (clist_row->bg_set)
- gdk_gc_set_background (ctree->lines_gc,
- &clist_row->background);
- }
+ yoffset = (clip_rectangle.height - PM_SIZE) / 2;
+ xoffset = (ctree->tree_indent - PM_SIZE) / 2;
+ ycenter = clip_rectangle.y + (clip_rectangle.height / 2);
+ ydest = ycenter - height / 2 + clist_row->cell[i].vertical;
gdk_gc_set_clip_origin (fg_gc, 0, 0);
gdk_gc_set_clip_rectangle (fg_gc, rect);
@@ -1283,11 +1374,6 @@ draw_row (GtkCList *clist,
gdk_gc_set_clip_rectangle (ctree->lines_gc, rect);
}
- yoffset = (clip_rectangle.height - PM_SIZE) / 2;
- xoffset = (ctree->tree_indent - PM_SIZE) / 2;
- ycenter = clip_rectangle.y + (clip_rectangle.height / 2);
- ydest = ycenter - height / 2 + clist_row->cell[i].vertical;
-
switch (clist->column[i].justification)
{
case GTK_JUSTIFY_CENTER:
@@ -1299,8 +1385,182 @@ draw_row (GtkCList *clist,
(((GtkCTreeRow *) clist_row)->level - 1) * ctree->tree_indent;
xcenter = xdest + (ctree->tree_indent / 2);
- if (ctree->line_style != GTK_CTREE_LINES_NONE)
+ switch (ctree->line_style)
{
+ case GTK_CTREE_LINES_NONE:
+ break;
+ case GTK_CTREE_LINES_TABBED:
+ xdest = clip_rectangle.x +
+ (((GtkCTreeRow *) clist_row)->level - 1) *
+ ctree->tree_indent;
+ xcenter = xdest + TAB_SIZE;
+
+ gdk_gc_set_clip_origin (clist->bg_gc, 0, 0);
+ gdk_gc_set_clip_rectangle (clist->bg_gc, rect);
+
+ gdk_gc_set_clip_origin
+ (widget->style->bg_gc[GTK_STATE_PRELIGHT], 0, 0);
+ gdk_gc_set_clip_rectangle
+ (widget->style->bg_gc[GTK_STATE_PRELIGHT], rect);
+
+ work = ((GtkCTreeRow *)clist_row)->parent;
+ next_level = ((GtkCTreeRow *)clist_row)->level;
+
+ if (!(((GtkCTreeRow *)clist_row)->sibling ||
+ (((GtkCTreeRow *)clist_row)->children &&
+ ((GtkCTreeRow *)clist_row)->expanded)))
+ {
+ work2 = gtk_ctree_find_glist_ptr
+ (ctree, (GtkCTreeRow *) clist_row);
+
+ if (work2->next)
+ next_level = GTK_CTREE_ROW (work2->next)->level;
+ else
+ next_level = 0;
+ }
+
+ while (work)
+ {
+ xcenter -= ctree->tree_indent;
+
+ if (GTK_CTREE_ROW(work)->row.bg_set)
+ {
+ gdk_gc_set_foreground
+ (clist->bg_gc,
+ &(GTK_CTREE_ROW(work)->row.background));
+ mbg_gc = clist->bg_gc;
+ }
+ else
+ mbg_gc = widget->style->bg_gc[GTK_STATE_PRELIGHT];
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_rectangle (clist->clist_window, mbg_gc, TRUE,
+ xcenter, rect->y,
+ ctree->tree_indent, rect->height);
+
+ if (next_level > GTK_CTREE_ROW (work)->level)
+ gdk_draw_line
+ (clist->clist_window, ctree->lines_gc,
+ xcenter, rect->y,
+ xcenter, rect->y + rect->height);
+ else
+ {
+ gdk_draw_line (clist->clist_window, ctree->lines_gc,
+ xcenter, clip_rectangle.y,
+ xcenter, ycenter);
+
+ in = MIN (ctree->tree_indent, 2 * TAB_SIZE);
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ {
+ if ((work2 = GTK_CTREE_ROW (work)->parent) &&
+ GTK_CTREE_ROW(work2)->row.bg_set)
+ {
+ gdk_gc_set_foreground
+ (clist->bg_gc,
+ &(GTK_CTREE_ROW(work2)->row.background));
+
+ gdk_draw_rectangle
+ (clist->clist_window, clist->bg_gc, TRUE,
+ xcenter,
+ ycenter,
+ in / 2 + in % 2,
+ row_rectangle.height / 2 + 1);
+
+ if (GTK_CTREE_ROW(work)->row.bg_set)
+ gdk_gc_set_foreground
+ (clist->bg_gc,
+ &(GTK_CTREE_ROW(work)->row.background));
+ }
+ else
+ gdk_draw_rectangle
+ (clist->clist_window,
+ widget->style->bg_gc[GTK_STATE_PRELIGHT],
+ TRUE,
+ xcenter,
+ ycenter,
+ in / 2 + in % 2,
+ row_rectangle.height / 2 + 1);
+
+ gdk_draw_arc (clist->clist_window, mbg_gc,
+ TRUE,
+ xcenter, clip_rectangle.y,
+ in, clist->row_height,
+ 180 * 64, 90 * 64);
+ }
+
+ gdk_draw_arc (clist->clist_window, ctree->lines_gc,
+ FALSE,
+ xcenter, clip_rectangle.y,
+ in, clist->row_height,
+ 180 * 64, 90 * 64);
+ }
+ work = GTK_CTREE_ROW (work)->parent;
+ }
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_rectangle
+ (clist->clist_window,
+ widget->style->bg_gc[GTK_STATE_PRELIGHT], TRUE,
+ clip_rectangle.x, row_rectangle.y,
+ TAB_SIZE, row_rectangle.height);
+
+ xcenter = xdest + (ctree->tree_indent / 2);
+
+ if (clist_row->bg_set)
+ gdk_gc_set_foreground
+ (clist->bg_gc, &clist_row->background);
+
+ if (((GtkCTreeRow *)clist_row)->is_leaf)
+ {
+ points[0].x = xdest + TAB_SIZE;
+ points[0].y = row_rectangle.y - 1;
+
+ points[1].x = points[0].x - 4;
+ points[1].y = points[0].y;
+
+ points[2].x = points[1].x - 2;
+ points[2].y = points[1].y + 3;
+
+ points[3].x = points[2].x;
+ points[3].y = points[2].y + clist->row_height - 5;
+
+ points[4].x = points[3].x + 2;
+ points[4].y = points[3].y + 3;
+
+ points[5].x = points[4].x + 4;
+ points[5].y = points[4].y;
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_polygon (clist->clist_window, bg_gc, TRUE,
+ points, 6);
+
+ gdk_draw_lines (clist->clist_window, ctree->lines_gc,
+ points, 6);
+ }
+ else
+ {
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_arc (clist->clist_window, bg_gc, TRUE,
+ xdest, row_rectangle.y - 1,
+ 2 * TAB_SIZE, clist->row_height,
+ 90 * 64, 180 * 64);
+
+ gdk_draw_arc (clist->clist_window, ctree->lines_gc,
+ FALSE,
+ xdest, row_rectangle.y - 1,
+ 2 * TAB_SIZE, clist->row_height,
+ 90 * 64, 180 * 64);
+
+ }
+
+ gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL);
+ gdk_gc_set_clip_rectangle (clist->bg_gc, NULL);
+ gdk_gc_set_clip_rectangle
+ (widget->style->bg_gc[GTK_STATE_PRELIGHT], NULL);
+
+ break;
+ default:
xcenter = xdest + (ctree->tree_indent / 2);
if (ctree->line_style == GTK_CTREE_LINES_DOTTED)
{
@@ -1308,7 +1568,7 @@ draw_row (GtkCList *clist,
2);
offset_y = abs ((clip_rectangle.y + clist->voffset) % 2);
}
-
+
gdk_draw_line (clist->clist_window, ctree->lines_gc,
xcenter, clip_rectangle.y + offset_y, xcenter,
(((GtkCTreeRow *)clist_row)->sibling) ?
@@ -1317,7 +1577,7 @@ draw_row (GtkCList *clist,
gdk_draw_line (clist->clist_window, ctree->lines_gc,
xcenter + offset_x, ycenter,
xcenter + PM_SIZE / 2 + 2, ycenter);
-
+
work = ((GtkCTreeRow *)clist_row)->parent;
while (work)
{
@@ -1329,11 +1589,11 @@ draw_row (GtkCList *clist,
work = GTK_CTREE_ROW (work)->parent;
}
gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL);
+ break;
}
if (((GtkCTreeRow *)clist_row)->children)
{
-
if (clist_row->state == GTK_STATE_SELECTED)
{
if (clist_row->fg_set)
@@ -1351,10 +1611,9 @@ draw_row (GtkCList *clist,
gdk_gc_set_clip_rectangle (cgc, rect);
- if (ctree->line_style == GTK_CTREE_LINES_NONE)
+ switch (ctree->line_style)
{
- GdkPoint points[3];
-
+ case GTK_CTREE_LINES_NONE:
if (!((GtkCTreeRow *)clist_row)->expanded)
{
points[0].x = xdest + xoffset + (PM_SIZE+2) / 6 + 2;
@@ -1382,15 +1641,37 @@ draw_row (GtkCList *clist,
TRUE, points, 3);
gdk_draw_polygon (clist->clist_window, tgc, FALSE,
points, 3);
- }
- else
- {
- gdk_draw_rectangle (clist->clist_window,
- GTK_WIDGET (clist)->style->
- fg_gc[GTK_STATE_SELECTED], TRUE,
- xdest + xoffset,
- clip_rectangle.y + yoffset,
- PM_SIZE, PM_SIZE);
+ break;
+ case GTK_CTREE_LINES_TABBED:
+ xcenter = xdest + PM_SIZE + 2;
+ gdk_draw_arc (clist->clist_window,
+ GTK_WIDGET (clist)->style->
+ fg_gc[GTK_STATE_SELECTED],
+ TRUE,
+ xcenter - PM_SIZE/2,
+ ycenter - PM_SIZE/2,
+ PM_SIZE, PM_SIZE, 0, 360 * 64);
+
+ gdk_draw_line (clist->clist_window, tgc,
+ xcenter - 2,
+ ycenter,
+ xcenter + 2,
+ ycenter);
+
+ if (!((GtkCTreeRow *)clist_row)->expanded)
+ gdk_draw_line (clist->clist_window, tgc,
+ xcenter, clip_rectangle.y + yoffset + 2,
+ xcenter,
+ clip_rectangle.y + yoffset + PM_SIZE-2);
+ break;
+ default:
+ gdk_draw_rectangle
+ (clist->clist_window,
+ GTK_WIDGET (clist)->style->fg_gc[GTK_STATE_SELECTED],
+ TRUE,
+ xdest + xoffset,
+ clip_rectangle.y + yoffset,
+ PM_SIZE, PM_SIZE);
gdk_draw_rectangle (clist->clist_window, tgc, FALSE,
xdest + xoffset,
@@ -1404,11 +1685,14 @@ draw_row (GtkCList *clist,
if (!((GtkCTreeRow *)clist_row)->expanded)
{
xcenter = xdest + (ctree->tree_indent / 2);
- gdk_draw_line (clist->clist_window, tgc, xcenter,
+ gdk_draw_line (clist->clist_window, tgc,
+ xcenter,
clip_rectangle.y + yoffset + 2,
- xcenter, clip_rectangle.y + yoffset
- + PM_SIZE - 2);
+ xcenter,
+ clip_rectangle.y + yoffset +
+ PM_SIZE - 2);
}
+ break;
}
gdk_gc_set_clip_rectangle (cgc, NULL);
@@ -1429,8 +1713,186 @@ draw_row (GtkCList *clist,
xdest = clip_rectangle.x + clip_rectangle.width + xoffset - 1 -
(((GtkCTreeRow *) clist_row)->level - 1) * ctree->tree_indent;
- if (ctree->line_style != GTK_CTREE_LINES_NONE)
+ switch (ctree->line_style)
{
+ case GTK_CTREE_LINES_NONE:
+ break;
+ case GTK_CTREE_LINES_TABBED:
+ xdest = clip_rectangle.x + clip_rectangle.width - 1
+ - (((GtkCTreeRow *) clist_row)->level - 1)
+ * ctree->tree_indent;
+ xcenter = xdest - TAB_SIZE;
+
+ gdk_gc_set_clip_origin (clist->bg_gc, 0, 0);
+ gdk_gc_set_clip_rectangle (clist->bg_gc, rect);
+
+ gdk_gc_set_clip_origin
+ (widget->style->bg_gc[GTK_STATE_PRELIGHT], 0, 0);
+ gdk_gc_set_clip_rectangle
+ (widget->style->bg_gc[GTK_STATE_PRELIGHT], rect);
+
+ work = ((GtkCTreeRow *)clist_row)->parent;
+ next_level = ((GtkCTreeRow *)clist_row)->level;
+
+ if (!(((GtkCTreeRow *)clist_row)->sibling ||
+ (((GtkCTreeRow *)clist_row)->children &&
+ ((GtkCTreeRow *)clist_row)->expanded)))
+ {
+ work2 = gtk_ctree_find_glist_ptr
+ (ctree, (GtkCTreeRow *) clist_row);
+
+ if (work2->next)
+ next_level = GTK_CTREE_ROW (work2->next)->level;
+ else
+ next_level = 0;
+ }
+
+ while (work)
+ {
+ xcenter += ctree->tree_indent;
+
+ if (GTK_CTREE_ROW(work)->row.bg_set)
+ {
+ gdk_gc_set_foreground
+ (clist->bg_gc,
+ &(GTK_CTREE_ROW(work)->row.background));
+ mbg_gc = clist->bg_gc;
+ }
+ else
+ mbg_gc = widget->style->bg_gc[GTK_STATE_PRELIGHT];
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_rectangle (clist->clist_window,
+ mbg_gc, TRUE,
+ xcenter - ctree->tree_indent + 1,
+ rect->y,
+ ctree->tree_indent,
+ rect->height);
+
+ if (next_level > GTK_CTREE_ROW (work)->level)
+ gdk_draw_line
+ (clist->clist_window, ctree->lines_gc,
+ xcenter, rect->y,
+ xcenter, rect->y + rect->height);
+ else
+ {
+ gdk_draw_line (clist->clist_window, ctree->lines_gc,
+ xcenter, clip_rectangle.y,
+ xcenter, ycenter);
+
+ in = MIN (ctree->tree_indent, 2 * TAB_SIZE);
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ {
+ if ((work2 = GTK_CTREE_ROW (work)->parent) &&
+ GTK_CTREE_ROW(work2)->row.bg_set)
+ {
+ gdk_gc_set_foreground
+ (clist->bg_gc,
+ &(GTK_CTREE_ROW(work2)->row.background));
+
+ gdk_draw_rectangle
+ (clist->clist_window, clist->bg_gc, TRUE,
+ xcenter + 1 - in / 2 - in % 2,
+ ycenter,
+ in / 2 + in % 2,
+ row_rectangle.height / 2 + 1);
+
+ if (GTK_CTREE_ROW(work)->row.bg_set)
+ gdk_gc_set_foreground
+ (clist->bg_gc,
+ &(GTK_CTREE_ROW(work)->row.background));
+ }
+ else
+ gdk_draw_rectangle
+ (clist->clist_window,
+ widget->style->bg_gc[GTK_STATE_PRELIGHT],
+ TRUE,
+ xcenter + 1 - in / 2 - in % 2,
+ ycenter,
+ in / 2 + in % 2,
+ row_rectangle.height / 2 + 1);
+
+ gdk_draw_arc (clist->clist_window, mbg_gc, TRUE,
+ xcenter - in, clip_rectangle.y,
+ in, clist->row_height,
+ 270 * 64, 90 * 64);
+ }
+
+ gdk_draw_arc (clist->clist_window, ctree->lines_gc,
+ FALSE,
+ xcenter - in, clip_rectangle.y,
+ in, clist->row_height,
+ 270 * 64, 90 * 64);
+ }
+
+ work = GTK_CTREE_ROW (work)->parent;
+ }
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_rectangle
+ (clist->clist_window,
+ widget->style->bg_gc[GTK_STATE_PRELIGHT], TRUE,
+ xcenter + 1, row_rectangle.y,
+ TAB_SIZE, row_rectangle.height);
+
+ xcenter = xdest - (ctree->tree_indent / 2);
+
+ if (clist_row->bg_set)
+ gdk_gc_set_foreground
+ (clist->bg_gc, &clist_row->background);
+
+ if (((GtkCTreeRow *)clist_row)->is_leaf)
+ {
+ points[0].x = xdest - TAB_SIZE;
+ points[0].y = row_rectangle.y - 1;
+
+ points[1].x = points[0].x + 4;
+ points[1].y = points[0].y;
+
+ points[2].x = points[1].x + 2;
+ points[2].y = points[1].y + 3;
+
+ points[3].x = points[2].x;
+ points[3].y = points[2].y + clist->row_height - 5;
+
+ points[4].x = points[3].x - 2;
+ points[4].y = points[3].y + 3;
+
+ points[5].x = points[4].x - 4;
+ points[5].y = points[4].y;
+
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_polygon (clist->clist_window, bg_gc, TRUE,
+ points, 6);
+
+ gdk_draw_lines (clist->clist_window, ctree->lines_gc,
+ points, 6);
+ }
+ else
+ {
+ if (clist_row->state != GTK_STATE_SELECTED)
+ gdk_draw_arc (clist->clist_window, bg_gc, TRUE,
+ xdest - 2 * TAB_SIZE,
+ row_rectangle.y - 1,
+ 2 * TAB_SIZE, clist->row_height,
+ 270 * 64, 180 * 64);
+
+ gdk_draw_arc (clist->clist_window, ctree->lines_gc,
+ FALSE,
+ xdest - 2 * TAB_SIZE,
+ row_rectangle.y - 1,
+ 2 * TAB_SIZE, clist->row_height,
+ 270 * 64, 180 * 64);
+ }
+
+ gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL);
+ gdk_gc_set_clip_rectangle (clist->bg_gc, NULL);
+ gdk_gc_set_clip_rectangle
+ (widget->style->bg_gc[GTK_STATE_PRELIGHT], NULL);
+
+ break;
+ default:
xcenter = xdest - (ctree->tree_indent / 2);
if (ctree->line_style == GTK_CTREE_LINES_DOTTED)
{
@@ -1438,7 +1900,7 @@ draw_row (GtkCList *clist,
2);
offset_y = abs ((clip_rectangle.y + clist->voffset) % 2);
}
-
+
gdk_draw_line (clist->clist_window, ctree->lines_gc,
xcenter, clip_rectangle.y + offset_y,
xcenter,
@@ -1448,7 +1910,7 @@ draw_row (GtkCList *clist,
gdk_draw_line (clist->clist_window, ctree->lines_gc,
xcenter - offset_x, ycenter,
xcenter - PM_SIZE / 2 - 2, ycenter);
-
+
work = ((GtkCTreeRow *)clist_row)->parent;
while (work)
{
@@ -1461,10 +1923,10 @@ draw_row (GtkCList *clist,
}
gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL);
}
+
if (((GtkCTreeRow *)clist_row)->children)
{
-
if (clist_row->state == GTK_STATE_SELECTED)
{
if (clist_row->fg_set)
@@ -1482,10 +1944,9 @@ draw_row (GtkCList *clist,
gdk_gc_set_clip_rectangle (cgc, rect);
- if (ctree->line_style == GTK_CTREE_LINES_NONE)
+ switch (ctree->line_style)
{
- GdkPoint points[3];
-
+ case GTK_CTREE_LINES_NONE:
if (!((GtkCTreeRow *)clist_row)->expanded)
{
points[0].x = xdest - xoffset - (PM_SIZE+2) / 6 - 2;
@@ -1513,9 +1974,33 @@ draw_row (GtkCList *clist,
TRUE, points, 3);
gdk_draw_polygon (clist->clist_window, tgc, FALSE,
points, 3);
- }
- else
- {
+ break;
+ case GTK_CTREE_LINES_TABBED:
+ xcenter = xdest - PM_SIZE - 2;
+
+ gdk_draw_arc (clist->clist_window,
+ GTK_WIDGET (clist)->style->
+ fg_gc[GTK_STATE_SELECTED],
+ TRUE,
+ xcenter - PM_SIZE/2,
+ ycenter - PM_SIZE/2,
+ PM_SIZE, PM_SIZE, 0, 360 * 64);
+
+ gdk_draw_line (clist->clist_window, tgc,
+ xcenter - 2,
+ ycenter,
+ xcenter + 2,
+ ycenter);
+
+ if (!((GtkCTreeRow *)clist_row)->expanded)
+ {
+ gdk_draw_line (clist->clist_window, tgc, xcenter,
+ clip_rectangle.y + yoffset + 2,
+ xcenter, clip_rectangle.y + yoffset
+ + PM_SIZE - 2);
+ }
+ break;
+ default:
gdk_draw_rectangle (clist->clist_window,
GTK_WIDGET(clist)->style->
fg_gc[GTK_STATE_SELECTED], TRUE,
@@ -2659,12 +3144,14 @@ ctree_is_hot_spot (GtkCTree *ctree,
+ clist->column[ctree->tree_column].area.width + clist->hoffset
/*+ cell->horizontal +*/
- (tree_row->level - 1) * ctree->tree_indent
- - PM_SIZE - 1;
+ - PM_SIZE - 1 -
+ (ctree->line_style == GTK_CTREE_LINES_TABBED) * ((PM_SIZE / 2) + 1);
}
else
{
xl = clist->column[ctree->tree_column].area.x + clist->hoffset
- + cell->horizontal + (tree_row->level - 1) * ctree->tree_indent;
+ + cell->horizontal + (tree_row->level - 1) * ctree->tree_indent +
+ (ctree->line_style == GTK_CTREE_LINES_TABBED) * ((PM_SIZE / 2) + 2);
}
return (x >= xl && x <= xl + PM_SIZE && y >= yu && y <= yu + PM_SIZE);
@@ -2994,6 +3481,27 @@ gtk_ctree_last (GtkCTree *ctree,
return node;
}
+GList *
+gtk_ctree_find_glist_ptr (GtkCTree *ctree,
+ GtkCTreeRow *ctree_row)
+{
+ GList *node;
+
+ g_return_val_if_fail (ctree != NULL, FALSE);
+ g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE);
+ g_return_val_if_fail (ctree_row != NULL, FALSE);
+
+ if (ctree_row->parent)
+ node = GTK_CTREE_ROW(ctree_row->parent)->children;
+ else
+ node = GTK_CLIST (ctree)->row_list;
+
+ while (node->data != ctree_row)
+ node = GTK_CTREE_ROW (node)->sibling;
+
+ return node;
+}
+
gint
gtk_ctree_find (GtkCTree *ctree,
GList *node,
@@ -3763,6 +4271,11 @@ gtk_ctree_set_line_style (GtkCTree *ctree,
GDK_LINE_ON_OFF_DASH, None, None);
gdk_gc_set_dashes (ctree->lines_gc, 0, "\1\1", 2);
break;
+ case GTK_CTREE_LINES_TABBED:
+ if (GTK_WIDGET_REALIZED (ctree))
+ gdk_gc_set_line_attributes (ctree->lines_gc, 1, GDK_LINE_SOLID,
+ None, None);
+ break;
case GTK_CTREE_LINES_NONE:
break;
default:
diff --git a/gtk/gtkctree.h b/gtk/gtkctree.h
index dda1184bcd..7f2fdc33c3 100644
--- a/gtk/gtkctree.h
+++ b/gtk/gtkctree.h
@@ -54,6 +54,7 @@ typedef enum
{
GTK_CTREE_LINES_SOLID,
GTK_CTREE_LINES_DOTTED,
+ GTK_CTREE_LINES_TABBED,
GTK_CTREE_LINES_NONE
} GtkCTreeLineStyle;
@@ -182,6 +183,8 @@ gboolean gtk_ctree_is_visible (GtkCTree *ctree,
GList *node);
GList * gtk_ctree_last (GtkCTree *ctree,
GList *node);
+GList * gtk_ctree_find_glist_ptr (GtkCTree *ctree,
+ GtkCTreeRow *ctree_row);
gint gtk_ctree_find (GtkCTree *ctree,
GList *node,
GList *child);
diff --git a/gtk/testgtk.c b/gtk/testgtk.c
index 955dd06a49..cbbc35a9e5 100644
--- a/gtk/testgtk.c
+++ b/gtk/testgtk.c
@@ -3584,6 +3584,7 @@ static GtkWidget *omenu3;
static GtkWidget *spin1;
static GtkWidget *spin2;
static GtkWidget *spin3;
+static GdkColor *col_bg;
#define RADIOMENUTOGGLED(_rmi_, __i) { \
GSList * __g; \
@@ -3800,23 +3801,51 @@ void change_indent (GtkWidget *widget, GtkCTree *ctree)
gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
}
+void change_row_height (GtkWidget *widget, GtkCList *clist)
+{
+ gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
+}
+
void toggle_reorderable (GtkWidget *widget, GtkCTree *ctree)
{
gtk_ctree_set_reorderable (ctree, GTK_TOGGLE_BUTTON (widget)->active);
}
+void set_background (GtkCTree *ctree, GList *node, gpointer data)
+{
+ if (!node)
+ return;
+
+ if (ctree->line_style != GTK_CTREE_LINES_TABBED)
+ {
+ if (GTK_CTREE_ROW (node)->is_leaf)
+ gtk_ctree_set_background
+ (ctree, node,
+ GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data);
+ else
+ gtk_ctree_set_background (ctree, node, GTK_CTREE_ROW (node)->row.data);
+ }
+ else
+ gtk_ctree_set_background (ctree, node, NULL);
+}
+
void toggle_line_style (GtkWidget *widget, GtkCTree *ctree)
{
gint i;
-
if (!GTK_WIDGET_MAPPED (widget))
return;
RADIOMENUTOGGLED ((GtkRadioMenuItem *)
(((GtkOptionMenu *)omenu2)->menu_item),i);
-
- gtk_ctree_set_line_style (ctree, (GtkCTreeLineStyle) (2-i));
+
+ if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
+ ((GtkCTreeLineStyle) (3-i)) != GTK_CTREE_LINES_TABBED) ||
+ (ctree->line_style != GTK_CTREE_LINES_TABBED &&
+ ((GtkCTreeLineStyle) (3-i)) == GTK_CTREE_LINES_TABBED))
+ gtk_ctree_pre_recursive (ctree, GTK_CLIST (ctree)->row_list,
+ set_background, NULL);
+ gtk_ctree_set_line_style (ctree, (GtkCTreeLineStyle) (3-i));
}
void toggle_justify (GtkWidget *widget, GtkCTree *ctree)
@@ -3829,7 +3858,7 @@ void toggle_justify (GtkWidget *widget, GtkCTree *ctree)
RADIOMENUTOGGLED ((GtkRadioMenuItem *)
(((GtkOptionMenu *)omenu3)->menu_item),i);
- gtk_clist_set_column_justification (GTK_CLIST (ctree), 0,
+ gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
(GtkJustification) (1-i));
}
@@ -3847,7 +3876,6 @@ void toggle_sel_mode (GtkWidget *widget, GtkCTree *ctree)
after_press (ctree, NULL);
}
-
void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
gint num_books, gint num_pages, GList *parent)
{
@@ -3856,7 +3884,7 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
gchar buf2[60];
GList *sibling;
gint i;
-
+
text[0] = buf1;
text[1] = buf2;
sibling = NULL;
@@ -3868,6 +3896,9 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
sprintf (buf2, "Item %d-%d", cur_depth, i);
sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap3,
mask3, NULL, NULL, TRUE, FALSE);
+
+ if (ctree->line_style == GTK_CTREE_LINES_TABBED)
+ gtk_ctree_set_background (ctree, sibling, col_bg);
}
if (cur_depth == depth)
@@ -3880,7 +3911,36 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
sprintf (buf2, "Item %d-%d", cur_depth, i);
sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap1,
mask1, pixmap2, mask2, FALSE, FALSE);
- build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages, sibling);
+
+ col_bg = g_new (GdkColor, 1);
+
+ if (cur_depth % 3 == 0)
+ {
+ col_bg->red = 10000 * (cur_depth % 6);
+ col_bg->green = 0;
+ col_bg->blue = 65535 - ((i * 10000) % 65535);
+ }
+ else if (cur_depth % 3 == 1)
+ {
+ col_bg->red = 10000 * (cur_depth % 6);
+ col_bg->green = 65535 - ((i * 10000) % 65535);
+ col_bg->blue = 0;
+ }
+ else
+ {
+ col_bg->red = 65535 - ((i * 10000) % 65535);
+ col_bg->green = 0;
+ col_bg->blue = 10000 * (cur_depth % 6);
+ }
+
+ gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (ctree)), col_bg);
+ gtk_ctree_set_row_data_full (ctree, sibling, col_bg, g_free);
+
+ if (ctree->line_style == GTK_CTREE_LINES_TABBED)
+ gtk_ctree_set_background (ctree, sibling, col_bg);
+
+ build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
+ sibling);
}
}
@@ -3916,6 +3976,15 @@ void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
parent = gtk_ctree_insert (ctree, NULL, NULL, text, 5, pixmap1,
mask1, pixmap2, mask2, FALSE, TRUE);
+ col_bg = g_new (GdkColor, 1);
+ col_bg->red = 0;
+ col_bg->green = 45000;
+ col_bg->blue = 55000;
+ gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (ctree)), col_bg);
+ gtk_ctree_set_row_data_full (ctree, parent, col_bg, g_free);
+ if (ctree->line_style == GTK_CTREE_LINES_TABBED)
+ gtk_ctree_set_background (ctree, parent, col_bg);
+
build_recursive (ctree, 1, d, b, p, parent);
gtk_clist_thaw (GTK_CLIST (ctree));
after_press (ctree, NULL);
@@ -3959,9 +4028,7 @@ void create_ctree (void)
gtk_object_ref (GTK_OBJECT (tooltips));
gtk_object_sink (GTK_OBJECT (tooltips));
- gtk_object_set_data_full (GTK_OBJECT (window),
- "tooltips",
- tooltips,
+ gtk_object_set_data_full (GTK_OBJECT (window), "tooltips", tooltips,
(GtkDestroyNotify) gtk_object_unref);
vbox = gtk_vbox_new (FALSE, 0);
@@ -3995,9 +4062,9 @@ void create_ctree (void)
button = gtk_button_new_with_label ("Close");
gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
- gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
- (GtkSignalFunc) gtk_widget_destroy,
- GTK_OBJECT(window));
+ gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+ (GtkSignalFunc) gtk_widget_destroy,
+ GTK_OBJECT(window));
button = gtk_button_new_with_label ("Rebuild tree");
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
@@ -4017,8 +4084,6 @@ void create_ctree (void)
GTK_SIGNAL_FUNC (after_move), NULL);
gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (ctree), TRUE, TRUE, 0);
gtk_clist_column_titles_passive (GTK_CLIST (ctree));
- gtk_clist_set_column_justification (GTK_CLIST (ctree), 2,
- GTK_JUSTIFY_RIGHT);
gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_MULTIPLE);
gtk_clist_set_policy (GTK_CLIST (ctree), GTK_POLICY_ALWAYS,
GTK_POLICY_AUTOMATIC);
@@ -4051,6 +4116,18 @@ void create_ctree (void)
gtk_container_border_width (GTK_CONTAINER (hbox), 5);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+ label = gtk_label_new ("Row height :");
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+
+ adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
+ spinner = gtk_spin_button_new (adj, 0, 0);
+ gtk_tooltips_set_tip (tooltips, spinner,
+ "Row height of list items", NULL);
+ gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
+ GTK_SIGNAL_FUNC (change_row_height), ctree);
+ gtk_box_pack_start (GTK_BOX (hbox), spinner, FALSE, TRUE, 5);
+ gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
+
button = gtk_button_new_with_label ("Select all");
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (select_all), ctree);
@@ -4109,10 +4186,17 @@ void create_ctree (void)
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (toggle_line_style), ctree);
group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item));
- gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
+ gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_widget_show (menu_item);
-
+
+ menu_item = gtk_radio_menu_item_new_with_label (group, "Tabbed");
+ gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
+ GTK_SIGNAL_FUNC (toggle_line_style), ctree);
+ group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item));
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_widget_show (menu_item);
+
menu_item = gtk_radio_menu_item_new_with_label (group, "No lines");
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (toggle_line_style), ctree);
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 955dd06a49..cbbc35a9e5 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -3584,6 +3584,7 @@ static GtkWidget *omenu3;
static GtkWidget *spin1;
static GtkWidget *spin2;
static GtkWidget *spin3;
+static GdkColor *col_bg;
#define RADIOMENUTOGGLED(_rmi_, __i) { \
GSList * __g; \
@@ -3800,23 +3801,51 @@ void change_indent (GtkWidget *widget, GtkCTree *ctree)
gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
}
+void change_row_height (GtkWidget *widget, GtkCList *clist)
+{
+ gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
+}
+
void toggle_reorderable (GtkWidget *widget, GtkCTree *ctree)
{
gtk_ctree_set_reorderable (ctree, GTK_TOGGLE_BUTTON (widget)->active);
}
+void set_background (GtkCTree *ctree, GList *node, gpointer data)
+{
+ if (!node)
+ return;
+
+ if (ctree->line_style != GTK_CTREE_LINES_TABBED)
+ {
+ if (GTK_CTREE_ROW (node)->is_leaf)
+ gtk_ctree_set_background
+ (ctree, node,
+ GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data);
+ else
+ gtk_ctree_set_background (ctree, node, GTK_CTREE_ROW (node)->row.data);
+ }
+ else
+ gtk_ctree_set_background (ctree, node, NULL);
+}
+
void toggle_line_style (GtkWidget *widget, GtkCTree *ctree)
{
gint i;
-
if (!GTK_WIDGET_MAPPED (widget))
return;
RADIOMENUTOGGLED ((GtkRadioMenuItem *)
(((GtkOptionMenu *)omenu2)->menu_item),i);
-
- gtk_ctree_set_line_style (ctree, (GtkCTreeLineStyle) (2-i));
+
+ if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
+ ((GtkCTreeLineStyle) (3-i)) != GTK_CTREE_LINES_TABBED) ||
+ (ctree->line_style != GTK_CTREE_LINES_TABBED &&
+ ((GtkCTreeLineStyle) (3-i)) == GTK_CTREE_LINES_TABBED))
+ gtk_ctree_pre_recursive (ctree, GTK_CLIST (ctree)->row_list,
+ set_background, NULL);
+ gtk_ctree_set_line_style (ctree, (GtkCTreeLineStyle) (3-i));
}
void toggle_justify (GtkWidget *widget, GtkCTree *ctree)
@@ -3829,7 +3858,7 @@ void toggle_justify (GtkWidget *widget, GtkCTree *ctree)
RADIOMENUTOGGLED ((GtkRadioMenuItem *)
(((GtkOptionMenu *)omenu3)->menu_item),i);
- gtk_clist_set_column_justification (GTK_CLIST (ctree), 0,
+ gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
(GtkJustification) (1-i));
}
@@ -3847,7 +3876,6 @@ void toggle_sel_mode (GtkWidget *widget, GtkCTree *ctree)
after_press (ctree, NULL);
}
-
void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
gint num_books, gint num_pages, GList *parent)
{
@@ -3856,7 +3884,7 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
gchar buf2[60];
GList *sibling;
gint i;
-
+
text[0] = buf1;
text[1] = buf2;
sibling = NULL;
@@ -3868,6 +3896,9 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
sprintf (buf2, "Item %d-%d", cur_depth, i);
sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap3,
mask3, NULL, NULL, TRUE, FALSE);
+
+ if (ctree->line_style == GTK_CTREE_LINES_TABBED)
+ gtk_ctree_set_background (ctree, sibling, col_bg);
}
if (cur_depth == depth)
@@ -3880,7 +3911,36 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
sprintf (buf2, "Item %d-%d", cur_depth, i);
sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap1,
mask1, pixmap2, mask2, FALSE, FALSE);
- build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages, sibling);
+
+ col_bg = g_new (GdkColor, 1);
+
+ if (cur_depth % 3 == 0)
+ {
+ col_bg->red = 10000 * (cur_depth % 6);
+ col_bg->green = 0;
+ col_bg->blue = 65535 - ((i * 10000) % 65535);
+ }
+ else if (cur_depth % 3 == 1)
+ {
+ col_bg->red = 10000 * (cur_depth % 6);
+ col_bg->green = 65535 - ((i * 10000) % 65535);
+ col_bg->blue = 0;
+ }
+ else
+ {
+ col_bg->red = 65535 - ((i * 10000) % 65535);
+ col_bg->green = 0;
+ col_bg->blue = 10000 * (cur_depth % 6);
+ }
+
+ gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (ctree)), col_bg);
+ gtk_ctree_set_row_data_full (ctree, sibling, col_bg, g_free);
+
+ if (ctree->line_style == GTK_CTREE_LINES_TABBED)
+ gtk_ctree_set_background (ctree, sibling, col_bg);
+
+ build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
+ sibling);
}
}
@@ -3916,6 +3976,15 @@ void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
parent = gtk_ctree_insert (ctree, NULL, NULL, text, 5, pixmap1,
mask1, pixmap2, mask2, FALSE, TRUE);
+ col_bg = g_new (GdkColor, 1);
+ col_bg->red = 0;
+ col_bg->green = 45000;
+ col_bg->blue = 55000;
+ gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (ctree)), col_bg);
+ gtk_ctree_set_row_data_full (ctree, parent, col_bg, g_free);
+ if (ctree->line_style == GTK_CTREE_LINES_TABBED)
+ gtk_ctree_set_background (ctree, parent, col_bg);
+
build_recursive (ctree, 1, d, b, p, parent);
gtk_clist_thaw (GTK_CLIST (ctree));
after_press (ctree, NULL);
@@ -3959,9 +4028,7 @@ void create_ctree (void)
gtk_object_ref (GTK_OBJECT (tooltips));
gtk_object_sink (GTK_OBJECT (tooltips));
- gtk_object_set_data_full (GTK_OBJECT (window),
- "tooltips",
- tooltips,
+ gtk_object_set_data_full (GTK_OBJECT (window), "tooltips", tooltips,
(GtkDestroyNotify) gtk_object_unref);
vbox = gtk_vbox_new (FALSE, 0);
@@ -3995,9 +4062,9 @@ void create_ctree (void)
button = gtk_button_new_with_label ("Close");
gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
- gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
- (GtkSignalFunc) gtk_widget_destroy,
- GTK_OBJECT(window));
+ gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+ (GtkSignalFunc) gtk_widget_destroy,
+ GTK_OBJECT(window));
button = gtk_button_new_with_label ("Rebuild tree");
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
@@ -4017,8 +4084,6 @@ void create_ctree (void)
GTK_SIGNAL_FUNC (after_move), NULL);
gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (ctree), TRUE, TRUE, 0);
gtk_clist_column_titles_passive (GTK_CLIST (ctree));
- gtk_clist_set_column_justification (GTK_CLIST (ctree), 2,
- GTK_JUSTIFY_RIGHT);
gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_MULTIPLE);
gtk_clist_set_policy (GTK_CLIST (ctree), GTK_POLICY_ALWAYS,
GTK_POLICY_AUTOMATIC);
@@ -4051,6 +4116,18 @@ void create_ctree (void)
gtk_container_border_width (GTK_CONTAINER (hbox), 5);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+ label = gtk_label_new ("Row height :");
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+
+ adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
+ spinner = gtk_spin_button_new (adj, 0, 0);
+ gtk_tooltips_set_tip (tooltips, spinner,
+ "Row height of list items", NULL);
+ gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
+ GTK_SIGNAL_FUNC (change_row_height), ctree);
+ gtk_box_pack_start (GTK_BOX (hbox), spinner, FALSE, TRUE, 5);
+ gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
+
button = gtk_button_new_with_label ("Select all");
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (select_all), ctree);
@@ -4109,10 +4186,17 @@ void create_ctree (void)
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (toggle_line_style), ctree);
group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item));
- gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
+ gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_widget_show (menu_item);
-
+
+ menu_item = gtk_radio_menu_item_new_with_label (group, "Tabbed");
+ gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
+ GTK_SIGNAL_FUNC (toggle_line_style), ctree);
+ group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item));
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_widget_show (menu_item);
+
menu_item = gtk_radio_menu_item_new_with_label (group, "No lines");
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (toggle_line_style), ctree);