]> Pileus Git - ~andy/gtk/blobdiff - gtk/testgtk.c
removed unneeded GtkCTree::draw_lines (gtk_ctree_get_node_info): New
[~andy/gtk] / gtk / testgtk.c
index e96016a9facb50823f025c285467c86471917784..2d532b955a070661d55ece3ac7f121f894b50fa2 100644 (file)
@@ -12,8 +12,9 @@
  * Library General Public License for more details.
  *
  * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
  */
 #include <stdio.h>
 #include <stdlib.h>
@@ -50,6 +51,7 @@ typedef struct sTreeButtons {
   guint nb_item_add;
   GtkWidget* add_button;
   GtkWidget* remove_button;
+  GtkWidget* subtree_button;
 } sTreeButtons;
 /* end of tree section */
 
@@ -1064,6 +1066,22 @@ cb_remove_item(GtkWidget*w, GtkTree* tree)
   g_list_free (clear_list);
 }
 
+static void
+cb_remove_subtree(GtkWidget*w, GtkTree* tree)
+{
+  GList* selected_list;
+  GtkTreeItem *item;
+  
+  selected_list = GTK_TREE_SELECTION(tree);
+
+  if (selected_list)
+    {
+      item = GTK_TREE_ITEM (selected_list->data);
+      if (item->subtree)
+       gtk_tree_item_remove_subtree (item);
+    }
+}
+
 static void
 cb_tree_changed(GtkTree* tree)
 {
@@ -1083,11 +1101,13 @@ cb_tree_changed(GtkTree* tree)
       else
        gtk_widget_set_sensitive(tree_buttons->add_button, FALSE);
       gtk_widget_set_sensitive(tree_buttons->remove_button, FALSE);
+      gtk_widget_set_sensitive(tree_buttons->subtree_button, FALSE);
     } 
   else 
     {
       gtk_widget_set_sensitive(tree_buttons->remove_button, TRUE);
       gtk_widget_set_sensitive(tree_buttons->add_button, (nb_selected == 1));
+      gtk_widget_set_sensitive(tree_buttons->subtree_button, (nb_selected == 1));
     }  
 }
 
@@ -1227,6 +1247,15 @@ create_tree_sample(guint selection_mode,
   gtk_widget_show(button);
   tree_buttons->remove_button = button;
 
+  button = gtk_button_new_with_label("Remove Subtree");
+  gtk_widget_set_sensitive(button, FALSE);
+  gtk_signal_connect(GTK_OBJECT (button), "clicked",
+                    (GtkSignalFunc) cb_remove_subtree, 
+                    (gpointer)root_tree);
+  gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
+  gtk_widget_show(button);
+  tree_buttons->subtree_button = button;
+
   /* create separator */
   separator = gtk_hseparator_new();
   gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
@@ -2075,6 +2104,31 @@ create_menus ()
     gtk_widget_destroy (window);
 }
 
+/*
+ * GtkScrolledWindow
+ */
+static void
+scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
+{
+  static GtkWidget *parent = NULL;
+  static GtkWidget *float_parent;
+
+  if (parent)
+    {
+      gtk_widget_reparent (scrollwin, parent);
+      gtk_widget_destroy (float_parent);
+      float_parent = NULL;
+      parent = NULL;
+    }
+  else
+    {
+      parent = widget->parent;
+      float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      gtk_widget_reparent (scrollwin, float_parent);
+      gtk_widget_show (float_parent);
+    }
+}
+
 /*
  * GtkScrolledWindow
  */
@@ -2113,6 +2167,10 @@ create_scrolled_windows ()
       gtk_table_set_row_spacings (GTK_TABLE (table), 10);
       gtk_table_set_col_spacings (GTK_TABLE (table), 10);
       gtk_container_add (GTK_CONTAINER (scrolled_window), table);
+      gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
+                                          gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
+      gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
+                                          gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
       gtk_widget_show (table);
 
       for (i = 0; i < 20; i++)
@@ -2135,6 +2193,17 @@ create_scrolled_windows ()
                          button, TRUE, TRUE, 0);
       gtk_widget_grab_default (button);
       gtk_widget_show (button);
+
+      button = gtk_button_new_with_label ("remove");
+      gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+                                GTK_SIGNAL_FUNC(scrolled_windows_remove),
+                                GTK_OBJECT (scrolled_window));
+      GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), 
+                         button, TRUE, TRUE, 0);
+      gtk_widget_grab_default (button);
+      gtk_widget_show (button);
+
     }
 
   if (!GTK_WIDGET_VISIBLE (window))
@@ -2653,10 +2722,11 @@ create_cursors ()
                                 GTK_SIGNAL_FUNC (gtk_widget_destroy),
                                 GTK_OBJECT (window));
       gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
-    }
 
-  if (!GTK_WIDGET_VISIBLE (window))
-    gtk_widget_show_all (window);
+      gtk_widget_show_all (window);
+
+      set_cursor (spinner, darea);
+    }
   else
     gtk_widget_destroy (window);
 }
@@ -2770,6 +2840,8 @@ create_list ()
       gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_MULTIPLE);
       gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_BROWSE);
       gtk_container_add (GTK_CONTAINER (scrolled_win), list);
+      gtk_container_set_focus_vadjustment (GTK_CONTAINER (list),
+                                          gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win)));
       gtk_widget_show (list);
 
       for (i = 0; i < nlist_items; i++)
@@ -3075,7 +3147,11 @@ clist_warning_test (GtkWidget *button,
   static gboolean add_remove = FALSE;
 
   add_remove = !add_remove;
+
   child = gtk_label_new ("Test");
+  gtk_widget_ref (child);
+  gtk_object_sink (GTK_OBJECT (child));
+
   if (add_remove)
     gtk_container_add (GTK_CONTAINER (clist), child);
   else
@@ -3084,7 +3160,9 @@ clist_warning_test (GtkWidget *button,
       gtk_container_remove (GTK_CONTAINER (clist), child);
       child->parent = NULL;
     }
+
   gtk_widget_destroy (child);
+  gtk_widget_unref (child);
 }
 
 static void
@@ -3260,8 +3338,6 @@ create_clist ()
                            GTK_POLICY_AUTOMATIC,
                            GTK_POLICY_AUTOMATIC);
 
-      gtk_clist_set_policy (GTK_CLIST (clist), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
       gtk_clist_set_column_justification (GTK_CLIST (clist), 1, GTK_JUSTIFY_RIGHT);
       gtk_clist_set_column_justification (GTK_CLIST (clist), 2, GTK_JUSTIFY_CENTER);
       
@@ -3316,161 +3392,970 @@ create_clist ()
 
 }
 
+
 /*
- * GtkColorSelect
+ * GtkCTree
  */
-void
-color_selection_ok (GtkWidget               *w,
-                    GtkColorSelectionDialog *cs)
-{
-  GtkColorSelection *colorsel;
-  gdouble color[4];
 
-  colorsel=GTK_COLOR_SELECTION(cs->colorsel);
+static char * book_open_xpm[] = {
+"16 16 4 1",
+"       c None s None",
+".      c black",
+"X      c #808080",
+"o      c white",
+"                ",
+"  ..            ",
+" .Xo.    ...    ",
+" .Xoo. ..oo.    ",
+" .Xooo.Xooo...  ",
+" .Xooo.oooo.X.  ",
+" .Xooo.Xooo.X.  ",
+" .Xooo.oooo.X.  ",
+" .Xooo.Xooo.X.  ",
+" .Xooo.oooo.X.  ",
+"  .Xoo.Xoo..X.  ",
+"   .Xo.o..ooX.  ",
+"    .X..XXXXX.  ",
+"    ..X.......  ",
+"     ..         ",
+"                "};
 
-  gtk_color_selection_get_color(colorsel,color);
-  gtk_color_selection_set_color(colorsel,color);
-}
+static char * book_closed_xpm[] = {
+"16 16 6 1",
+"       c None s None",
+".      c black",
+"X      c red",
+"o      c yellow",
+"O      c #808080",
+"#      c white",
+"                ",
+"       ..       ",
+"     ..XX.      ",
+"   ..XXXXX.     ",
+" ..XXXXXXXX.    ",
+".ooXXXXXXXXX.   ",
+"..ooXXXXXXXXX.  ",
+".X.ooXXXXXXXXX. ",
+".XX.ooXXXXXX..  ",
+" .XX.ooXXX..#O  ",
+"  .XX.oo..##OO. ",
+"   .XX..##OO..  ",
+"    .X.#OO..    ",
+"     ..O..      ",
+"      ..        ",
+"                "};
 
-void
-color_selection_changed (GtkWidget *w,
-                         GtkColorSelectionDialog *cs)
-{
-  GtkColorSelection *colorsel;
-  gdouble color[4];
+static char * mini_page_xpm[] = {
+"16 16 4 1",
+"       c None s None",
+".      c black",
+"X      c white",
+"o      c #808080",
+"                ",
+"   .......      ",
+"   .XXXXX..     ",
+"   .XoooX.X.    ",
+"   .XXXXX....   ",
+"   .XooooXoo.o  ",
+"   .XXXXXXXX.o  ",
+"   .XooooooX.o  ",
+"   .XXXXXXXX.o  ",
+"   .XooooooX.o  ",
+"   .XXXXXXXX.o  ",
+"   .XooooooX.o  ",
+"   .XXXXXXXX.o  ",
+"   ..........o  ",
+"    oooooooooo  ",
+"                "};
 
-  colorsel=GTK_COLOR_SELECTION(cs->colorsel);
-  gtk_color_selection_get_color(colorsel,color);
+GdkPixmap *pixmap1;
+GdkPixmap *pixmap2;
+GdkPixmap *pixmap3;
+GdkBitmap *mask1;
+GdkBitmap *mask2;
+GdkBitmap *mask3;
+
+static gint books = 0;
+static gint pages = 0;
+
+static GtkWidget *book_label;
+static GtkWidget *page_label;
+static GtkWidget *sel_label;
+static GtkWidget *vis_label;
+static GtkWidget *omenu;
+static GtkWidget *omenu2;
+static GtkWidget *omenu3;
+static GtkWidget *spin1;
+static GtkWidget *spin2;
+static GtkWidget *spin3;
+
+#define RADIOMENUTOGGLED(_rmi_, __i) { \
+  GSList * __g; \
+  __i = 0; \
+  __g = gtk_radio_menu_item_group(_rmi_); \
+  while( __g  && !((GtkCheckMenuItem *)(__g->data))->active) { \
+    __g = __g->next; \
+    __i++; \
+  }\
 }
 
-void
-create_color_selection ()
+#define RADIOBUTTONTOGGLED(_rb_, __i) { \
+  GSList * __g; \
+  __i = 0; \
+  __g = gtk_radio_button_group(_rb_); \
+  while( __g  && !((GtkToggleButton *)(__g->data))->active) { \
+    __g = __g->next; \
+    __i++; \
+  }\
+}
+
+void after_press (GtkCTree *ctree, gpointer data)
 {
-  static GtkWidget *window = NULL;
+  char buf[80];
 
-  if (!window)
-    {
-      gtk_preview_set_install_cmap (TRUE);
-      gtk_widget_push_visual (gtk_preview_get_visual ());
-      gtk_widget_push_colormap (gtk_preview_get_cmap ());
+  sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
+  gtk_label_set (GTK_LABEL (sel_label), buf);
 
-      window = gtk_color_selection_dialog_new ("color selection dialog");
+  sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
+  gtk_label_set (GTK_LABEL (vis_label), buf);
 
-      gtk_color_selection_set_opacity (
-        GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (window)->colorsel),
-       TRUE);
+  sprintf (buf, "%d", books);
+  gtk_label_set (GTK_LABEL (book_label), buf);
 
-      gtk_color_selection_set_update_policy(
-        GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (window)->colorsel),
-       GTK_UPDATE_CONTINUOUS);
+  sprintf (buf, "%d", pages);
+  gtk_label_set (GTK_LABEL (page_label), buf);
+}
 
-      gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
+void after_move (GtkCTree *ctree, GList *child, GList *parent, 
+                GList *sibling, gpointer data)
+{
+  char *source;
+  char *target1;
+  char *target2;
 
-      gtk_signal_connect (GTK_OBJECT (window), "destroy",
-                          GTK_SIGNAL_FUNC(gtk_widget_destroyed),
-                          &window);
+  gtk_ctree_get_node_info (ctree, child, &source, 
+                          NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+  if (parent)
+    gtk_ctree_get_node_info (ctree, parent, &target1, 
+                            NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+  if (sibling)
+    gtk_ctree_get_node_info (ctree, sibling, &target2, 
+                            NULL, NULL, NULL, NULL, NULL, NULL, NULL);
 
-      gtk_signal_connect (
-       GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (window)->colorsel),
-       "color_changed",
-       GTK_SIGNAL_FUNC(color_selection_changed),
-       window);
+  g_print ("Moving \"%s\" to \"%s\" with sibling \"%s\".\n", source,
+          (parent) ? target1 : "nil", (sibling) ? target2 : "nil");
+}
 
-      gtk_signal_connect (
-       GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (window)->ok_button),
-       "clicked",
-       GTK_SIGNAL_FUNC(color_selection_ok),
-       window);
+gint button_press (GtkCTree *ctree, GdkEventButton *event, gpointer data)
+{
+  gint row;
+  gint column;
+  GList *work;
+  gint res;
+  
+  res = gtk_clist_get_selection_info (GTK_CLIST (ctree), event->x, event->y, 
+                                     &row, &column);
+  if (!res && event->button != 3)
+    return FALSE;
 
-      gtk_signal_connect_object (
-        GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (window)->cancel_button),
-       "clicked",
-       GTK_SIGNAL_FUNC(gtk_widget_destroy),
-       GTK_OBJECT (window));
+  work = g_list_nth (GTK_CLIST (ctree)->row_list, row);
 
-      gtk_widget_pop_colormap ();
-      gtk_widget_pop_visual ();
+  switch (event->button)
+    {
+    case 1:
+      if (GTK_CLIST (ctree)->selection_mode == GTK_SELECTION_MULTIPLE &&
+         event->state & GDK_SHIFT_MASK)
+       gtk_signal_emit_stop_by_name (GTK_OBJECT (ctree),"button_press_event");
+      break;
+    case  2:
+      if (GTK_CTREE_ROW (work)->children && 
+         gtk_ctree_is_hot_spot (ctree, event->x, event->y))
+       {
+         if (GTK_CTREE_ROW (work)->expanded)
+           gtk_ctree_collapse_recursive (ctree, work);
+         else
+           gtk_ctree_expand_recursive (ctree, work);
+         after_press (ctree, NULL);
+         gtk_signal_emit_stop_by_name (GTK_OBJECT (ctree), 
+                                       "button_press_event");
+       }
+      break;
+    default:
+      break;
     }
+  return FALSE;
+}
 
-  if (!GTK_WIDGET_VISIBLE (window))
-    gtk_widget_show (window);
+gint button_release (GtkCTree *ctree, GdkEventButton *event, gpointer data)
+{
+  gint row;
+  gint column;
+  GList *work;
+  gint res;
+  
+  res = gtk_clist_get_selection_info (GTK_CLIST (ctree), event->x, event->y, 
+                                     &row, &column);
+  if (!res || event->button != 1)
+    return FALSE;
+
+  work = g_list_nth (GTK_CLIST (ctree)->row_list, row);
+
+  if (GTK_CLIST (ctree)->selection_mode == GTK_SELECTION_MULTIPLE &&
+      event->state & GDK_SHIFT_MASK)
+    {
+      if (GTK_CTREE_ROW (work)->row.state == GTK_STATE_SELECTED) 
+           gtk_ctree_unselect_recursive (ctree, work);
+      else
+       gtk_ctree_select_recursive (ctree, work);
+      after_press (ctree, NULL);
+      gtk_signal_emit_stop_by_name (GTK_OBJECT (ctree), 
+                                   "button_release_event");
+    }
+  return FALSE;
+}
+
+void count_items (GtkCTree *ctree, GList *list)
+{
+  if (GTK_CTREE_ROW (list)->is_leaf)
+    pages--;
   else
-    gtk_widget_destroy (window);
+    books--;
 }
 
-void
-file_selection_hide_fileops (GtkWidget *widget,
-                            GtkFileSelection *fs)
+void expand_all (GtkWidget *widget, GtkCTree *ctree)
 {
-  gtk_file_selection_hide_fileop_buttons (fs);
+  gtk_ctree_expand_recursive (ctree, NULL);
+  after_press (ctree, NULL);
 }
 
-void
-file_selection_ok (GtkWidget        *w,
-                  GtkFileSelection *fs)
+void collapse_all (GtkWidget *widget, GtkCTree *ctree)
 {
-  g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));
-  gtk_widget_destroy (GTK_WIDGET (fs));
+  gtk_ctree_collapse_recursive (ctree, NULL);
+  after_press (ctree, NULL);
 }
 
-void
-create_file_selection ()
+void select_all (GtkWidget *widget, GtkCTree *ctree)
 {
-  static GtkWidget *window = NULL;
-  GtkWidget *button;
+  if (GTK_CLIST (ctree)->selection_mode != GTK_SELECTION_MULTIPLE)
+    return;
+  gtk_ctree_select_recursive (ctree, NULL);
+  after_press (ctree, NULL);
+}
 
-  if (!window)
+void unselect_all (GtkWidget *widget, GtkCTree *ctree)
+{
+  GList *work;
+  GList *ptr;
+
+  if (GTK_CLIST (ctree)->selection_mode == GTK_SELECTION_BROWSE)
+    return;
+
+  work = GTK_CLIST (ctree)->selection;
+
+  while (work)
     {
-      window = gtk_file_selection_new ("file selection dialog");
+      ptr = work->data;
+      work = work->next;
+      gtk_ctree_unselect (ctree, ptr);
+    }
+  after_press (ctree, NULL);
+}
 
-      gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
+void remove_selection (GtkWidget *widget, GtkCTree *ctree)
+{
+  GList *work;
+  GList *selection;
+  GList *new_sel;
 
-      gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
+  selection = GTK_CLIST (ctree)->selection;
+  new_sel = NULL;
 
-      gtk_signal_connect (GTK_OBJECT (window), "destroy",
-                         GTK_SIGNAL_FUNC(gtk_widget_destroyed),
-                         &window);
+  gtk_clist_freeze (GTK_CLIST (ctree));
 
-      gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (window)->ok_button),
-                         "clicked", GTK_SIGNAL_FUNC(file_selection_ok),
-                         window);
-      gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (window)->cancel_button),
-                                "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),
-                                GTK_OBJECT (window));
-      
-      button = gtk_button_new_with_label ("Hide Fileops");
-      gtk_signal_connect (GTK_OBJECT (button), "clicked",
-                         (GtkSignalFunc) file_selection_hide_fileops, 
-                         (gpointer) window);
-      gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area), 
-                         button, FALSE, FALSE, 0);
-      gtk_widget_show (button);
+  while (selection)
+    {
+      work = selection->data;
+      if (GTK_CTREE_ROW (work)->is_leaf)
+       pages--;
+      else
+       gtk_ctree_post_recursive (ctree, work, 
+                                 (GtkCTreeFunc) count_items, NULL);
 
-      button = gtk_button_new_with_label ("Show Fileops");
-      gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
-                                (GtkSignalFunc) gtk_file_selection_show_fileop_buttons, 
-                                (gpointer) window);
-      gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area), 
-                         button, FALSE, FALSE, 0);
-      gtk_widget_show (button);
+      if (GTK_CLIST (ctree)->selection_mode == GTK_SELECTION_BROWSE)
+       {
+         if (GTK_CTREE_ROW (work)->children)
+           {
+             new_sel = GTK_CTREE_ROW (work)->sibling;
+             if (!new_sel)
+               new_sel = work->prev;
+           }
+         else
+           {
+             if (work->next)
+               new_sel = work->next;
+             else
+               new_sel = work->prev;
+           }
+       }
 
-      
-      
+      gtk_ctree_remove (ctree, work);
+      selection = GTK_CLIST (ctree)->selection;
     }
-  
-  if (!GTK_WIDGET_VISIBLE (window))
-    gtk_widget_show (window);
-  else
-    gtk_widget_destroy (window);
-}
 
+  if (new_sel)
+    gtk_ctree_select (ctree, new_sel);
 
-/*
- * GtkDialog
- */
-static GtkWidget *dialog_window = NULL;
+  gtk_clist_thaw (GTK_CLIST (ctree));
+  after_press (ctree, NULL);
+}
 
-void
+void sort_all (GtkWidget *widget, GtkCTree *ctree)
+{
+  gtk_ctree_sort_recursive (ctree, NULL);
+}
+
+void change_indent (GtkWidget *widget, GtkCTree *ctree)
+{
+  gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
+}
+
+void toggle_reorderable (GtkWidget *widget, GtkCTree *ctree)
+{
+  gtk_ctree_set_reorderable (ctree, GTK_TOGGLE_BUTTON (widget)->active);
+}
+
+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));
+}
+
+void toggle_justify (GtkWidget *widget, GtkCTree *ctree)
+{
+  gint i;
+
+  if (!GTK_WIDGET_MAPPED (widget))
+    return;
+
+  RADIOMENUTOGGLED ((GtkRadioMenuItem *)
+                   (((GtkOptionMenu *)omenu3)->menu_item),i);
+
+  gtk_clist_set_column_justification (GTK_CLIST (ctree), 0, 
+                                     (GtkJustification) (1-i));
+}
+
+void toggle_sel_mode (GtkWidget *widget, GtkCTree *ctree)
+{
+  gint i;
+
+  if (!GTK_WIDGET_MAPPED (widget))
+    return;
+
+  RADIOMENUTOGGLED ((GtkRadioMenuItem *)
+                   (((GtkOptionMenu *)omenu)->menu_item), i);
+
+  gtk_ctree_set_selection_mode (ctree, (GtkSelectionMode) (3-i));
+  after_press (ctree, NULL);
+}
+
+
+void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, 
+                     gint num_books, gint num_pages, GList *parent)
+{
+  gchar *text [2];
+  gchar buf1[60];
+  gchar buf2[60];
+  GList *sibling;
+  gint i;
+  
+  text[0] = buf1;
+  text[1] = buf2;
+  sibling = NULL;
+
+  for (i = num_pages + num_books; i > num_books; i--)
+    {
+      pages++;
+      sprintf (buf1, "Page %02d", random() % 100);
+      sprintf (buf2, "Item %d-%d", cur_depth, i);
+      sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap3,
+                                 mask3, NULL, NULL, TRUE, FALSE);
+    }
+
+  if (cur_depth == depth)
+    return;
+
+  for (i = num_books; i > 0; i--)
+    {
+      books++;
+      sprintf (buf1, "Book %02d", random() % 100);
+      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);
+    }
+}
+
+void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
+{
+  gchar *text [2];
+  gchar label1[] = "Root";
+  gchar label2[] = "";
+  GList *parent;
+  guint b, d, p, n;
+
+  text[0] = label1;
+  text[1] = label2;
+  
+  d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1)); 
+  b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
+  p = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin3));
+
+  n = ((pow (b, d) - 1) / (b - 1)) * (p + 1);
+
+  if (n > 200000)
+    {
+      g_print ("%d total items? Try less\n",n);
+      return;
+    }
+
+  gtk_clist_freeze (GTK_CLIST (ctree));
+  gtk_ctree_clear (ctree);
+
+  books = 1;
+  pages = 0;
+
+  parent = gtk_ctree_insert (ctree, NULL, NULL, text, 5, pixmap1,
+                            mask1, pixmap2, mask2, FALSE, TRUE);
+
+  build_recursive (ctree, 1, d, b, p, parent);
+  gtk_clist_thaw (GTK_CLIST (ctree));
+  after_press (ctree, NULL);
+}
+
+void create_ctree ()
+{
+  static GtkWidget *window = NULL;
+  GtkTooltips *tooltips;
+  GtkCTree *ctree;
+  GtkWidget *vbox;
+  GtkWidget *hbox;
+  GtkWidget *hbox2;
+  GtkWidget *frame;
+  GtkWidget *label;
+  GtkWidget *button;
+  GtkWidget *menu_item;
+  GtkWidget *menu;
+  GtkWidget *submenu;
+  GtkWidget *check;
+  GtkAdjustment *adj;
+  GtkWidget *spinner;
+  GSList *group;
+  GdkColor transparent;
+
+  char *title[] = { "Tree" , "Info" };
+  char buf[80];
+
+  if (!window)
+    {
+      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+      gtk_signal_connect (GTK_OBJECT (window), "destroy",
+                         GTK_SIGNAL_FUNC (gtk_widget_destroyed),
+                         &window);
+
+      gtk_window_set_title (GTK_WINDOW (window), "GtkCTree");
+      gtk_container_border_width (GTK_CONTAINER (window), 0);
+
+      tooltips = gtk_tooltips_new ();
+      gtk_object_ref (GTK_OBJECT (tooltips));
+      gtk_object_sink (GTK_OBJECT (tooltips));
+
+      gtk_object_set_data_full (GTK_OBJECT (window),
+                               "tooltips",
+                               tooltips,
+                               (GtkDestroyNotify) gtk_object_unref);
+
+      vbox = gtk_vbox_new (FALSE, 0);
+      gtk_container_add (GTK_CONTAINER (window), vbox);
+
+      hbox = gtk_hbox_new (FALSE, 5);
+      gtk_container_border_width (GTK_CONTAINER (hbox), 5);
+      gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+      
+      label = gtk_label_new ("Depth :");
+      gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+      
+      adj = (GtkAdjustment *) gtk_adjustment_new (4, 1, 10, 1, 5, 0);
+      spin1 = gtk_spin_button_new (adj, 0, 0);
+      gtk_box_pack_start (GTK_BOX (hbox), spin1, FALSE, TRUE, 5);
+  
+      label = gtk_label_new ("Books :");
+      gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+      
+      adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
+      spin2 = gtk_spin_button_new (adj, 0, 0);
+      gtk_box_pack_start (GTK_BOX (hbox), spin2, FALSE, TRUE, 5);
+
+      label = gtk_label_new ("Pages :");
+      gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+      
+      adj = (GtkAdjustment *) gtk_adjustment_new (5, 1, 20, 1, 5, 0);
+      spin3 = gtk_spin_button_new (adj, 0, 0);
+      gtk_box_pack_start (GTK_BOX (hbox), spin3, FALSE, TRUE, 5);
+
+      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));
+
+      button = gtk_button_new_with_label ("Rebuild tree");
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+      
+      ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
+      gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
+      gtk_ctree_set_reorderable (ctree, TRUE);
+      gtk_signal_connect (GTK_OBJECT (ctree), "button_press_event",
+                         GTK_SIGNAL_FUNC (button_press), NULL);
+      gtk_signal_connect_after (GTK_OBJECT (ctree), "button_press_event",
+                               GTK_SIGNAL_FUNC (after_press), NULL);
+      gtk_signal_connect (GTK_OBJECT (ctree), "button_release_event",
+                         GTK_SIGNAL_FUNC (button_release), NULL);
+      gtk_signal_connect_after (GTK_OBJECT (ctree), "button_release_event",
+                               GTK_SIGNAL_FUNC (after_press), NULL);
+      gtk_signal_connect_after (GTK_OBJECT (ctree), "tree_move",
+                               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);
+      gtk_clist_set_column_width (GTK_CLIST (ctree), 0, 200);
+      gtk_clist_set_column_width (GTK_CLIST (ctree), 1, 200);
+
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (rebuild_tree), ctree);
+      
+      hbox = gtk_hbox_new (FALSE, 5);
+      gtk_container_border_width (GTK_CONTAINER (hbox), 5);
+      gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+      button = gtk_button_new_with_label ("Expand all");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (expand_all), ctree);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+
+      button = gtk_button_new_with_label ("Collapse all");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (collapse_all), ctree);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+
+      button = gtk_button_new_with_label ("Sort tree");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (sort_all), ctree);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+
+      hbox = gtk_hbox_new (FALSE, 5);
+      gtk_container_border_width (GTK_CONTAINER (hbox), 5);
+      gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+      button = gtk_button_new_with_label ("Select all");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (select_all), ctree);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+
+      button = gtk_button_new_with_label ("Unselect all");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (unselect_all), ctree);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+
+      button = gtk_button_new_with_label ("Remove selection");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (remove_selection), ctree);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+
+      hbox = gtk_hbox_new (TRUE, 5);
+      gtk_container_border_width (GTK_CONTAINER (hbox), 5);
+      gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+      
+      hbox2 = gtk_hbox_new (FALSE, 0);
+      gtk_box_pack_start (GTK_BOX (hbox), hbox2, FALSE, TRUE, 0);
+      
+      label = gtk_label_new ("Indent :");
+      gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+      
+      adj = (GtkAdjustment *) gtk_adjustment_new (20, 0, 60, 1, 10, 0);
+      spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_tooltips_set_tip (tooltips, spinner, "Tree indentation.", NULL);
+      gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
+                         GTK_SIGNAL_FUNC (change_indent), ctree);
+      gtk_box_pack_start (GTK_BOX (hbox2), spinner, FALSE, TRUE, 5);
+      
+      check = gtk_check_button_new_with_label ("Reorderable");
+      gtk_tooltips_set_tip (tooltips, check,
+                           "Tree items can be reordered by dragging.", NULL);
+      gtk_signal_connect (GTK_OBJECT (check), "clicked",
+                         GTK_SIGNAL_FUNC (toggle_reorderable), ctree);
+      gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
+      gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (check), TRUE);
+      
+      omenu2 = gtk_option_menu_new ();
+      gtk_tooltips_set_tip (tooltips, omenu2, "The tree's line style.", NULL);
+      
+      menu = gtk_menu_new ();
+      submenu = NULL;
+      group = NULL;
+      
+      menu_item = gtk_radio_menu_item_new_with_label (group, "Solid");
+      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, "Dotted");
+      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_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);
+      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);
+      
+      gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu2), menu);
+      gtk_box_pack_start (GTK_BOX (hbox), omenu2, FALSE, TRUE, 0);
+      
+      gtk_option_menu_set_history (GTK_OPTION_MENU (omenu2), 1);
+      
+      omenu3 = gtk_option_menu_new ();
+      gtk_tooltips_set_tip (tooltips, omenu3, "The tree's justification.", NULL);
+      
+      menu = gtk_menu_new ();
+      submenu = NULL;
+      group = NULL;
+      
+      menu_item = gtk_radio_menu_item_new_with_label (group, "Left");
+      gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
+                         GTK_SIGNAL_FUNC (toggle_justify), 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_widget_show (menu_item);
+      
+      menu_item = gtk_radio_menu_item_new_with_label (group, "Right");
+      gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
+                         GTK_SIGNAL_FUNC (toggle_justify), 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);
+      
+      gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu3), menu);
+      gtk_box_pack_start (GTK_BOX (hbox), omenu3, FALSE, TRUE, 0);
+      
+      gtk_option_menu_set_history (GTK_OPTION_MENU (omenu3), 0);
+      
+      omenu = gtk_option_menu_new ();
+      gtk_tooltips_set_tip (tooltips, omenu, "The list's selection mode.", NULL);
+      
+      menu = gtk_menu_new ();
+      submenu = NULL;
+      group = NULL;
+      
+      menu_item = gtk_radio_menu_item_new_with_label (group, "Single");
+      gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
+                         GTK_SIGNAL_FUNC (toggle_sel_mode), 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, "Browse");
+      gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
+                         GTK_SIGNAL_FUNC (toggle_sel_mode), 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, "Multiple");
+      gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
+                      GTK_SIGNAL_FUNC (toggle_sel_mode), 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_widget_show (menu_item);
+      
+      menu_item = gtk_radio_menu_item_new_with_label (group, "Extended");
+      gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
+                         GTK_SIGNAL_FUNC (toggle_sel_mode), 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);
+      
+      gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
+      gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, TRUE, 0);
+      
+      gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), 2);
+      
+      gtk_widget_realize (window);
+      
+      pixmap1 = gdk_pixmap_create_from_xpm_d (window->window, &mask1, 
+                                             &transparent, book_closed_xpm);
+      pixmap2 = gdk_pixmap_create_from_xpm_d (window->window, &mask2, 
+                                             &transparent, book_open_xpm);
+      pixmap3 = gdk_pixmap_create_from_xpm_d (window->window, &mask3,
+                                             &transparent, mini_page_xpm);
+      
+      gtk_widget_set_usize (GTK_WIDGET (ctree), 0, 300);
+      
+      frame = gtk_frame_new (NULL);
+      gtk_container_border_width (GTK_CONTAINER (frame), 0);
+      gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
+      gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
+      
+      hbox = gtk_hbox_new (TRUE, 2);
+      gtk_container_border_width (GTK_CONTAINER (hbox), 2);
+      gtk_container_add (GTK_CONTAINER (frame), hbox);
+      
+      frame = gtk_frame_new (NULL);
+      gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+      gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+      
+      hbox2 = gtk_hbox_new (FALSE, 0);
+      gtk_container_border_width (GTK_CONTAINER (hbox2), 2);
+      gtk_container_add (GTK_CONTAINER (frame), hbox2);
+      
+      label = gtk_label_new ("Books :");
+      gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+      
+      sprintf (buf, "%d", books);
+      book_label = gtk_label_new (buf);
+      gtk_box_pack_end (GTK_BOX (hbox2), book_label, FALSE, TRUE, 5);
+      
+      frame = gtk_frame_new (NULL);
+      gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+      gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+      
+      hbox2 = gtk_hbox_new (FALSE, 0);
+      gtk_container_border_width (GTK_CONTAINER (hbox2), 2);
+      gtk_container_add (GTK_CONTAINER (frame), hbox2);
+      
+      label = gtk_label_new ("Pages :");
+      gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+      
+      sprintf (buf, "%d", pages);
+      page_label = gtk_label_new (buf);
+      gtk_box_pack_end (GTK_BOX (hbox2), page_label, FALSE, TRUE, 5);
+      
+      frame = gtk_frame_new (NULL);
+      gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+      gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+      
+      hbox2 = gtk_hbox_new (FALSE, 0);
+      gtk_container_border_width (GTK_CONTAINER (hbox2), 2);
+      gtk_container_add (GTK_CONTAINER (frame), hbox2);
+      
+      label = gtk_label_new ("Selected :");
+      gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+      
+      sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
+      sel_label = gtk_label_new (buf);
+      gtk_box_pack_end (GTK_BOX (hbox2), sel_label, FALSE, TRUE, 5);
+      
+      frame = gtk_frame_new (NULL);
+      gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+      gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+      
+      hbox2 = gtk_hbox_new (FALSE, 0);
+      gtk_container_border_width (GTK_CONTAINER (hbox2), 2);
+      gtk_container_add (GTK_CONTAINER (frame), hbox2);
+      
+      label = gtk_label_new ("Visible :");
+      gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+      
+      sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
+      vis_label = gtk_label_new (buf);
+      gtk_box_pack_end (GTK_BOX (hbox2), vis_label, FALSE, TRUE, 5);
+
+      rebuild_tree (NULL, ctree);
+    }
+
+  if (!GTK_WIDGET_VISIBLE (window))
+    gtk_widget_show_all (window);
+  else
+    gtk_widget_destroy (window);
+}
+
+
+/*
+ * GtkColorSelect
+ */
+void
+color_selection_ok (GtkWidget               *w,
+                    GtkColorSelectionDialog *cs)
+{
+  GtkColorSelection *colorsel;
+  gdouble color[4];
+
+  colorsel=GTK_COLOR_SELECTION(cs->colorsel);
+
+  gtk_color_selection_get_color(colorsel,color);
+  gtk_color_selection_set_color(colorsel,color);
+}
+
+void
+color_selection_changed (GtkWidget *w,
+                         GtkColorSelectionDialog *cs)
+{
+  GtkColorSelection *colorsel;
+  gdouble color[4];
+
+  colorsel=GTK_COLOR_SELECTION(cs->colorsel);
+  gtk_color_selection_get_color(colorsel,color);
+}
+
+void
+create_color_selection ()
+{
+  static GtkWidget *window = NULL;
+
+  if (!window)
+    {
+      gtk_preview_set_install_cmap (TRUE);
+      gtk_widget_push_visual (gtk_preview_get_visual ());
+      gtk_widget_push_colormap (gtk_preview_get_cmap ());
+
+      window = gtk_color_selection_dialog_new ("color selection dialog");
+
+      gtk_color_selection_set_opacity (
+        GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (window)->colorsel),
+       TRUE);
+
+      gtk_color_selection_set_update_policy(
+        GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (window)->colorsel),
+       GTK_UPDATE_CONTINUOUS);
+
+      gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
+
+      gtk_signal_connect (GTK_OBJECT (window), "destroy",
+                          GTK_SIGNAL_FUNC(gtk_widget_destroyed),
+                          &window);
+
+      gtk_signal_connect (
+       GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (window)->colorsel),
+       "color_changed",
+       GTK_SIGNAL_FUNC(color_selection_changed),
+       window);
+
+      gtk_signal_connect (
+       GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (window)->ok_button),
+       "clicked",
+       GTK_SIGNAL_FUNC(color_selection_ok),
+       window);
+
+      gtk_signal_connect_object (
+        GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (window)->cancel_button),
+       "clicked",
+       GTK_SIGNAL_FUNC(gtk_widget_destroy),
+       GTK_OBJECT (window));
+
+      gtk_widget_pop_colormap ();
+      gtk_widget_pop_visual ();
+    }
+
+  if (!GTK_WIDGET_VISIBLE (window))
+    gtk_widget_show (window);
+  else
+    gtk_widget_destroy (window);
+}
+
+void
+file_selection_hide_fileops (GtkWidget *widget,
+                            GtkFileSelection *fs)
+{
+  gtk_file_selection_hide_fileop_buttons (fs);
+}
+
+void
+file_selection_ok (GtkWidget        *w,
+                  GtkFileSelection *fs)
+{
+  g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));
+  gtk_widget_destroy (GTK_WIDGET (fs));
+}
+
+void
+create_file_selection ()
+{
+  static GtkWidget *window = NULL;
+  GtkWidget *button;
+
+  if (!window)
+    {
+      window = gtk_file_selection_new ("file selection dialog");
+
+      gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
+
+      gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
+
+      gtk_signal_connect (GTK_OBJECT (window), "destroy",
+                         GTK_SIGNAL_FUNC(gtk_widget_destroyed),
+                         &window);
+
+      gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (window)->ok_button),
+                         "clicked", GTK_SIGNAL_FUNC(file_selection_ok),
+                         window);
+      gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (window)->cancel_button),
+                                "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),
+                                GTK_OBJECT (window));
+      
+      button = gtk_button_new_with_label ("Hide Fileops");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         (GtkSignalFunc) file_selection_hide_fileops, 
+                         (gpointer) window);
+      gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area), 
+                         button, FALSE, FALSE, 0);
+      gtk_widget_show (button);
+
+      button = gtk_button_new_with_label ("Show Fileops");
+      gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+                                (GtkSignalFunc) gtk_file_selection_show_fileop_buttons, 
+                                (gpointer) window);
+      gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area), 
+                         button, FALSE, FALSE, 0);
+      gtk_widget_show (button);
+
+      
+      
+    }
+  
+  if (!GTK_WIDGET_VISIBLE (window))
+    gtk_widget_show (window);
+  else
+    gtk_widget_destroy (window);
+}
+
+
+/*
+ * GtkDialog
+ */
+static GtkWidget *dialog_window = NULL;
+
+void
 label_toggle (GtkWidget  *widget,
              GtkWidget **label)
 {
@@ -3854,53 +4739,28 @@ GdkPixmap *book_closed;
 GdkBitmap *book_open_mask;
 GdkBitmap *book_closed_mask;
 
-static char * book_open_xpm[] = {
-"16 16 4 1",
-"       c None s None",
-".      c black",
-"X      c #808080",
-"o      c white",
-"                ",
-"  ..            ",
-" .Xo.    ...    ",
-" .Xoo. ..oo.    ",
-" .Xooo.Xooo...  ",
-" .Xooo.oooo.X.  ",
-" .Xooo.Xooo.X.  ",
-" .Xooo.oooo.X.  ",
-" .Xooo.Xooo.X.  ",
-" .Xooo.oooo.X.  ",
-"  .Xoo.Xoo..X.  ",
-"   .Xo.o..ooX.  ",
-"    .X..XXXXX.  ",
-"    ..X.......  ",
-"     ..         ",
-"                "};
 
-static char * book_closed_xpm[] = {
-"16 16 6 1",
-"       c None s None",
-".      c black",
-"X      c red",
-"o      c yellow",
-"O      c #808080",
-"#      c white",
-"                ",
-"       ..       ",
-"     ..XX.      ",
-"   ..XXXXX.     ",
-" ..XXXXXXXX.    ",
-".ooXXXXXXXXX.   ",
-"..ooXXXXXXXXX.  ",
-".X.ooXXXXXXXXX. ",
-".XX.ooXXXXXX..  ",
-" .XX.ooXXX..#O  ",
-"  .XX.oo..##OO. ",
-"   .XX..##OO..  ",
-"    .X.#OO..    ",
-"     ..O..      ",
-"      ..        ",
-"                "};
+static void
+notebook_reparent (GtkWidget *widget, GtkWidget *scrollwin)
+{
+  static GtkWidget *parent = NULL;
+  static GtkWidget *float_parent;
+
+  if (parent)
+    {
+      gtk_widget_reparent (scrollwin, parent);
+      gtk_widget_destroy (float_parent);
+      float_parent = NULL;
+      parent = NULL;
+    }
+  else
+    {
+      parent = widget->parent;
+      float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      gtk_widget_show (float_parent);
+      gtk_widget_reparent (scrollwin, float_parent);
+    }
+}
 
 static void
 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
@@ -4181,6 +5041,13 @@ create_notebook ()
                          GTK_SIGNAL_FUNC (rotate_notebook),
                          notebook);
       gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
+
+      button = gtk_button_new_with_label ("reparent");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (notebook_reparent),
+                         notebook);
+      gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
+
     }
 
   if (!GTK_WIDGET_VISIBLE (window))
@@ -4761,7 +5628,8 @@ create_progress_bar ()
   GtkWidget *vbox;
   GtkWidget *pbar;
   GtkWidget *label;
-
+  GtkTooltips *tooltips;
+  
   if (!window)
     {
       window = gtk_dialog_new ();
@@ -4773,6 +5641,7 @@ create_progress_bar ()
       gtk_window_set_title (GTK_WINDOW (window), "dialog");
       gtk_container_border_width (GTK_CONTAINER (window), 0);
 
+      tooltips = gtk_tooltips_new();
 
       vbox = gtk_vbox_new (FALSE, 5);
       gtk_container_border_width (GTK_CONTAINER (vbox), 10);
@@ -4786,9 +5655,12 @@ create_progress_bar ()
       gtk_widget_show (label);
 
       pbar = gtk_progress_bar_new ();
+      gtk_widget_set_events (pbar, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
       gtk_widget_set_usize (pbar, 200, 20);
       gtk_box_pack_start (GTK_BOX (vbox), pbar, TRUE, TRUE, 0);
       gtk_widget_show (pbar);
+      gtk_tooltips_set_tip (tooltips, pbar, "Countdown is progressing yet!", "Secret!");
+      gtk_tooltips_set_delay (tooltips, 0);
 
       progress_timer = gtk_timeout_add (100, progress_timeout, pbar);
 
@@ -5366,7 +6238,7 @@ create_scroll_test ()
  */
 static int timer = 0;
 
-void
+gint
 timeout_test (GtkWidget *label)
 {
   static int count = 0;
@@ -5374,6 +6246,8 @@ timeout_test (GtkWidget *label)
 
   sprintf (buffer, "count: %d", ++count);
   gtk_label_set (GTK_LABEL (label), buffer);
+
+  return TRUE;
 }
 
 void
@@ -5572,34 +6446,127 @@ create_idle_test ()
     gtk_widget_destroy (window);
 }
 
+void
+reload_rc_file (void)
+{
+  GList *toplevels;
+
+  gtk_rc_reparse_all ();
+
+  toplevels = gdk_window_get_toplevels();
+  while (toplevels)
+    {
+      GtkWidget *widget;
+      gdk_window_get_user_data (toplevels->data, (gpointer *)&widget);
+      
+      if (widget)
+       gtk_widget_reset_rc_styles (widget);
+
+      toplevels = toplevels->next;
+    }
+
+  g_list_free (toplevels);
+}
+
+void
+create_rc_file ()
+{
+  static GtkWidget *window = NULL;
+  GtkWidget *button;
+
+  if (!window)
+    {
+      window = gtk_dialog_new ();
+
+      gtk_signal_connect (GTK_OBJECT (window), "destroy",
+                         GTK_SIGNAL_FUNC(destroy_idle_test),
+                         &window);
+
+      gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
+      gtk_container_border_width (GTK_CONTAINER (window), 0);
+
+      button = gtk_button_new_with_label ("Reload");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC(reload_rc_file), NULL);
+      GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), 
+                         button, TRUE, TRUE, 0);
+      gtk_widget_grab_default (button);
+      gtk_widget_show (button);
+
+      button = gtk_button_new_with_label ("Close");
+      gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+                                GTK_SIGNAL_FUNC(gtk_widget_destroy),
+                                GTK_OBJECT (window));
+      GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), 
+                         button, TRUE, TRUE, 0);
+      gtk_widget_show (button);
+
+    }
+
+  if (!GTK_WIDGET_VISIBLE (window))
+    gtk_widget_show (window);
+  else
+    gtk_widget_destroy (window);
+}
+
 /*
- * Basic Test
+ * Test of recursive mainloop
  */
+
+void
+mainloop_destroyed (GtkWidget *w, GtkWidget **window)
+{
+  *window = NULL;
+  gtk_main_quit ();
+}
+
 void
-create_test ()
+create_mainloop ()
 {
   static GtkWidget *window = NULL;
+  GtkWidget *label;
+  GtkWidget *button;
 
   if (!window)
     {
-      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      window = gtk_dialog_new ();
+
+      gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
 
       gtk_signal_connect (GTK_OBJECT (window), "destroy",
-                         GTK_SIGNAL_FUNC(gtk_widget_destroyed),
+                         GTK_SIGNAL_FUNC(mainloop_destroyed),
                          &window);
 
+      label = gtk_label_new ("In recursive main loop...");
+      gtk_misc_set_padding (GTK_MISC(label), 20, 20);
 
-      gtk_window_set_title (GTK_WINDOW (window), "test");
-      gtk_container_border_width (GTK_CONTAINER (window), 0);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
+                         TRUE, TRUE, 0);
+      gtk_widget_show (label);
+
+      button = gtk_button_new_with_label ("Leave");
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button, 
+                         FALSE, TRUE, 0);
+
+      gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+                                GTK_SIGNAL_FUNC (gtk_widget_destroy),
+                                GTK_OBJECT (window));
+
+      GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+      gtk_widget_grab_default (button);
+
+      gtk_widget_show (button);
     }
 
   if (!GTK_WIDGET_VISIBLE (window))
     {
       gtk_widget_show (window);
 
-      g_print ("create_test: start\n");
+      g_print ("create_mainloop: start\n");
       gtk_main ();
-      g_print ("create_test: done\n");
+      g_print ("create_mainloop: done\n");
     }
   else
     gtk_widget_destroy (window);
@@ -5629,6 +6596,7 @@ create_main_window ()
       { "check buttons", create_check_buttons },
       { "clist", create_clist},
       { "color selection", create_color_selection },
+      { "ctree", create_ctree },
       { "cursors", create_cursors },
       { "dialog", create_dialog },
       { "dnd", create_dnd },
@@ -5647,6 +6615,7 @@ create_main_window ()
       { "progress bar", create_progress_bar },
       { "radio buttons", create_radio_buttons },
       { "range controls", create_range_controls },
+      { "rc file", create_rc_file },
       { "reparent", create_reparent },
       { "rulers", create_rulers },
       { "scrolled windows", create_scrolled_windows },
@@ -5654,7 +6623,7 @@ create_main_window ()
       { "spinbutton", create_spins },
       { "statusbar", create_statusbar },
       { "test idle", create_idle_test },
-      { "test mainloop", create_test },
+      { "test mainloop", create_mainloop },
       { "test scrolling", create_scroll_test },
       { "test selection", create_selection_test },
       { "test timeout", create_timeout_test },
@@ -5677,6 +6646,7 @@ create_main_window ()
   int i;
 
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_policy (GTK_WINDOW (window), FALSE, FALSE, FALSE);
   gtk_widget_set_name (window, "main window");
   gtk_widget_set_usize (window, 200, 400);
   gtk_widget_set_uposition (window, 20, 20);
@@ -5713,12 +6683,15 @@ create_main_window ()
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                                  GTK_POLICY_AUTOMATIC, 
                                   GTK_POLICY_AUTOMATIC);
+  GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (scrolled_window)->vscrollbar, GTK_CAN_FOCUS);
   gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
   gtk_widget_show (scrolled_window);
 
   box2 = gtk_vbox_new (FALSE, 0);
   gtk_container_border_width (GTK_CONTAINER (box2), 10);
   gtk_container_add (GTK_CONTAINER (scrolled_window), box2);
+  gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
+                                      gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
   gtk_widget_show (box2);
 
   for (i = 0; i < nbuttons; i++)