home *** CD-ROM | disk | FTP | other *** search
/ Freelog 65 / Freelog065.iso / BAS / Bureautique / Gnumeric / gnumeric-1.3.92-rc1.exe / panes.c < prev    next >
C/C++ Source or Header  |  2004-10-15  |  6KB  |  196 lines

  1. /* Paned Widgets
  2.  *
  3.  * The GtkHPaned and GtkVPaned Widgets divide their content
  4.  * area into two panes with a divider in between that the
  5.  * user can adjust. A separate child is placed into each
  6.  * pane.
  7.  *
  8.  * There are a number of options that can be set for each pane.
  9.  * This test contains both a horizontal (HPaned) and a vertical
  10.  * (VPaned) widget, and allows you to adjust the options for
  11.  * each side of each widget.
  12.  */
  13.  
  14. #include <config.h>
  15. #include <gtk/gtk.h>
  16.  
  17. void
  18. toggle_resize (GtkWidget *widget,
  19.            GtkWidget *child)
  20. {
  21.   GtkPaned *paned = GTK_PANED (child->parent);
  22.   gboolean is_child1 = (child == paned->child1);
  23.   gboolean resize, shrink;
  24.  
  25.   resize = is_child1 ? paned->child1_resize : paned->child2_resize;
  26.   shrink = is_child1 ? paned->child1_shrink : paned->child2_shrink;
  27.  
  28.   gtk_widget_ref (child);
  29.   gtk_container_remove (GTK_CONTAINER (child->parent), child);
  30.   if (is_child1)
  31.     gtk_paned_pack1 (paned, child, !resize, shrink);
  32.   else
  33.     gtk_paned_pack2 (paned, child, !resize, shrink);
  34.   gtk_widget_unref (child);
  35. }
  36.  
  37. void
  38. toggle_shrink (GtkWidget *widget,
  39.            GtkWidget *child)
  40. {
  41.   GtkPaned *paned = GTK_PANED (child->parent);
  42.   gboolean is_child1 = (child == paned->child1);
  43.   gboolean resize, shrink;
  44.  
  45.   resize = is_child1 ? paned->child1_resize : paned->child2_resize;
  46.   shrink = is_child1 ? paned->child1_shrink : paned->child2_shrink;
  47.  
  48.   gtk_widget_ref (child);
  49.   gtk_container_remove (GTK_CONTAINER (child->parent), child);
  50.   if (is_child1)
  51.     gtk_paned_pack1 (paned, child, resize, !shrink);
  52.   else
  53.     gtk_paned_pack2 (paned, child, resize, !shrink);
  54.   gtk_widget_unref (child);
  55. }
  56.  
  57. GtkWidget *
  58. create_pane_options (GtkPaned     *paned,
  59.              const gchar *frame_label,
  60.              const gchar *label1,
  61.              const gchar *label2)
  62. {
  63.   GtkWidget *frame;
  64.   GtkWidget *table;
  65.   GtkWidget *label;
  66.   GtkWidget *check_button;
  67.   
  68.   frame = gtk_frame_new (frame_label);
  69.   gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
  70.   
  71.   table = gtk_table_new (3, 2, TRUE);
  72.   gtk_container_add (GTK_CONTAINER (frame), table);
  73.   
  74.   label = gtk_label_new (label1);
  75.   gtk_table_attach_defaults (GTK_TABLE (table), label,
  76.                  0, 1, 0, 1);
  77.   
  78.   check_button = gtk_check_button_new_with_mnemonic ("_Resize");
  79.   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
  80.                  0, 1, 1, 2);
  81.   g_signal_connect (check_button, "toggled",
  82.             G_CALLBACK (toggle_resize), paned->child1);
  83.   
  84.   check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
  85.   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
  86.                  0, 1, 2, 3);
  87.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
  88.                    TRUE);
  89.   g_signal_connect (check_button, "toggled",
  90.             G_CALLBACK (toggle_shrink), paned->child1);
  91.   
  92.   label = gtk_label_new (label2);
  93.   gtk_table_attach_defaults (GTK_TABLE (table), label,
  94.                  1, 2, 0, 1);
  95.   
  96.   check_button = gtk_check_button_new_with_mnemonic ("_Resize");
  97.   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
  98.                  1, 2, 1, 2);
  99.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
  100.                    TRUE);
  101.   g_signal_connect (check_button, "toggled",
  102.             G_CALLBACK (toggle_resize), paned->child2);
  103.   
  104.   check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
  105.   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
  106.                  1, 2, 2, 3);
  107.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
  108.                    TRUE);
  109.   g_signal_connect (check_button, "toggled",
  110.             G_CALLBACK (toggle_shrink), paned->child2);
  111.  
  112.   return frame;
  113. }
  114.  
  115. GtkWidget *
  116. do_panes (GtkWidget *do_widget)
  117. {
  118.   static GtkWidget *window = NULL;
  119.   GtkWidget *frame;
  120.   GtkWidget *hpaned;
  121.   GtkWidget *vpaned;
  122.   GtkWidget *button;
  123.   GtkWidget *vbox;
  124.  
  125.   if (!window)
  126.     {
  127.       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  128.       gtk_window_set_screen (GTK_WINDOW (window),
  129.                  gtk_widget_get_screen (do_widget));
  130.  
  131.       g_signal_connect (window, "destroy",
  132.             G_CALLBACK (gtk_widget_destroyed), &window);
  133.  
  134.       gtk_window_set_title (GTK_WINDOW (window), "Panes");
  135.       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
  136.  
  137.       vbox = gtk_vbox_new (FALSE, 0);
  138.       gtk_container_add (GTK_CONTAINER (window), vbox);
  139.       
  140.       vpaned = gtk_vpaned_new ();
  141.       gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
  142.       gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
  143.  
  144.       hpaned = gtk_hpaned_new ();
  145.       gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
  146.  
  147.       frame = gtk_frame_new (NULL);
  148.       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
  149.       gtk_widget_set_size_request (frame, 60, 60);
  150.       gtk_paned_add1 (GTK_PANED (hpaned), frame);
  151.       
  152.       button = gtk_button_new_with_mnemonic ("_Hi there");
  153.       gtk_container_add (GTK_CONTAINER(frame), button);
  154.  
  155.       frame = gtk_frame_new (NULL);
  156.       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
  157.       gtk_widget_set_size_request (frame, 80, 60);
  158.       gtk_paned_add2 (GTK_PANED (hpaned), frame);
  159.  
  160.       frame = gtk_frame_new (NULL);
  161.       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
  162.       gtk_widget_set_size_request (frame, 60, 80);
  163.       gtk_paned_add2 (GTK_PANED (vpaned), frame);
  164.  
  165.       /* Now create toggle buttons to control sizing */
  166.  
  167.       gtk_box_pack_start (GTK_BOX (vbox),
  168.               create_pane_options (GTK_PANED (hpaned),
  169.                            "Horizontal",
  170.                            "Left",
  171.                            "Right"),
  172.               FALSE, FALSE, 0);
  173.  
  174.       gtk_box_pack_start (GTK_BOX (vbox),
  175.               create_pane_options (GTK_PANED (vpaned),
  176.                            "Vertical",
  177.                            "Top",
  178.                            "Bottom"),
  179.               FALSE, FALSE, 0);
  180.  
  181.       gtk_widget_show_all (vbox);
  182.     }
  183.  
  184.   if (!GTK_WIDGET_VISIBLE (window))
  185.     {
  186.       gtk_widget_show (window);
  187.     }
  188.   else
  189.     {
  190.       gtk_widget_destroy (window);
  191.       window = NULL;
  192.     }
  193.  
  194.   return window;
  195. }
  196.