Blame tests/testtreecolumnsizing.c

Packit Service fb6fa5
/* testtreecolumnsizing.c: Test case for tree view column resizing.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Copyright (C) 2008  Kristian Rietveld  <kris@gtk.org>
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This work is provided "as is"; redistribution and modification
Packit Service fb6fa5
 * in whole or in part, in any medium, physical or electronic is
Packit Service fb6fa5
 * permitted without restriction.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This work is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * In no event shall the authors or contributors be liable for any
Packit Service fb6fa5
 * direct, indirect, incidental, special, exemplary, or consequential
Packit Service fb6fa5
 * damages (including, but not limited to, procurement of substitute
Packit Service fb6fa5
 * goods or services; loss of use, data, or profits; or business
Packit Service fb6fa5
 * interruption) however caused and on any theory of liability, whether
Packit Service fb6fa5
 * in contract, strict liability, or tort (including negligence or
Packit Service fb6fa5
 * otherwise) arising in any way out of the use of this software, even
Packit Service fb6fa5
 * if advised of the possibility of such damage.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include <gtk/gtk.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#define NO_EXPAND "No expandable columns"
Packit Service fb6fa5
#define SINGLE_EXPAND "One expandable column"
Packit Service fb6fa5
#define MULTI_EXPAND "Multiple expandable columns"
Packit Service fb6fa5
#define LAST_EXPAND "Last column is expandable"
Packit Service fb6fa5
#define BORDER_EXPAND "First and last columns are expandable"
Packit Service fb6fa5
#define ALL_EXPAND "All columns are expandable"
Packit Service fb6fa5
Packit Service fb6fa5
#define N_ROWS 10
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static GtkTreeModel *
Packit Service fb6fa5
create_model (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  GtkListStore *store;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_list_store_new (5,
Packit Service fb6fa5
                              G_TYPE_STRING,
Packit Service fb6fa5
                              G_TYPE_STRING,
Packit Service fb6fa5
                              G_TYPE_STRING,
Packit Service fb6fa5
                              G_TYPE_STRING,
Packit Service fb6fa5
                              G_TYPE_STRING);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < N_ROWS; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gchar *str;
Packit Service fb6fa5
Packit Service fb6fa5
      str = g_strdup_printf ("Row %d", i);
Packit Service fb6fa5
      gtk_list_store_insert_with_values (store, NULL, i,
Packit Service fb6fa5
                                         0, str,
Packit Service fb6fa5
                                         1, "Blah blah blah blah blah",
Packit Service fb6fa5
                                         2, "Less blah",
Packit Service fb6fa5
                                         3, "Medium length",
Packit Service fb6fa5
                                         4, "Eek",
Packit Service fb6fa5
                                         -1);
Packit Service fb6fa5
      g_free (str);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return GTK_TREE_MODEL (store);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
toggle_long_content_row (GtkToggleButton *button,
Packit Service fb6fa5
                         gpointer         user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
Packit Service fb6fa5
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
Packit Service fb6fa5
  if (gtk_tree_model_iter_n_children (model, NULL) == N_ROWS)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, N_ROWS,
Packit Service fb6fa5
                                         0, "Very very very very longggggg",
Packit Service fb6fa5
                                         1, "Blah blah blah blah blah",
Packit Service fb6fa5
                                         2, "Less blah",
Packit Service fb6fa5
                                         3, "Medium length",
Packit Service fb6fa5
                                         4, "Eek we make the scrollbar appear",
Packit Service fb6fa5
                                         -1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTreeIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_model_iter_nth_child (model, &iter, NULL, N_ROWS);
Packit Service fb6fa5
      gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
combo_box_changed (GtkComboBox *combo_box,
Packit Service fb6fa5
                   gpointer     user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gchar *str;
Packit Service fb6fa5
  GList *list;
Packit Service fb6fa5
  GList *columns;
Packit Service fb6fa5
Packit Service fb6fa5
  str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (combo_box));
Packit Service fb6fa5
  if (!str)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (user_data));
Packit Service fb6fa5
Packit Service fb6fa5
  if (!strcmp (str, NO_EXPAND))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      for (list = columns; list; list = list->next)
Packit Service fb6fa5
        gtk_tree_view_column_set_expand (list->data, FALSE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (!strcmp (str, SINGLE_EXPAND))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      for (list = columns; list; list = list->next)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          if (list->prev && !list->prev->prev)
Packit Service fb6fa5
            /* This is the second column */
Packit Service fb6fa5
            gtk_tree_view_column_set_expand (list->data, TRUE);
Packit Service fb6fa5
          else
Packit Service fb6fa5
            gtk_tree_view_column_set_expand (list->data, FALSE);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (!strcmp (str, MULTI_EXPAND))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      for (list = columns; list; list = list->next)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          if (list->prev && !list->prev->prev)
Packit Service fb6fa5
            /* This is the second column */
Packit Service fb6fa5
            gtk_tree_view_column_set_expand (list->data, TRUE);
Packit Service fb6fa5
          else if (list->prev && !list->prev->prev->prev)
Packit Service fb6fa5
            /* This is the third column */
Packit Service fb6fa5
            gtk_tree_view_column_set_expand (list->data, TRUE);
Packit Service fb6fa5
          else
Packit Service fb6fa5
            gtk_tree_view_column_set_expand (list->data, FALSE);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (!strcmp (str, LAST_EXPAND))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      for (list = columns; list->next; list = list->next)
Packit Service fb6fa5
        gtk_tree_view_column_set_expand (list->data, FALSE);
Packit Service fb6fa5
      /* This is the last column */
Packit Service fb6fa5
      gtk_tree_view_column_set_expand (list->data, TRUE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (!strcmp (str, BORDER_EXPAND))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_tree_view_column_set_expand (columns->data, TRUE);
Packit Service fb6fa5
      for (list = columns->next; list->next; list = list->next)
Packit Service fb6fa5
        gtk_tree_view_column_set_expand (list->data, FALSE);
Packit Service fb6fa5
      /* This is the last column */
Packit Service fb6fa5
      gtk_tree_view_column_set_expand (list->data, TRUE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (!strcmp (str, ALL_EXPAND))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      for (list = columns; list; list = list->next)
Packit Service fb6fa5
        gtk_tree_view_column_set_expand (list->data, TRUE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (str);
Packit Service fb6fa5
  g_list_free (columns);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
int
Packit Service fb6fa5
main (int argc, char **argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  GtkWidget *window;
Packit Service fb6fa5
  GtkWidget *vbox;
Packit Service fb6fa5
  GtkWidget *combo_box;
Packit Service fb6fa5
  GtkWidget *sw;
Packit Service fb6fa5
  GtkWidget *tree_view;
Packit Service fb6fa5
  GtkWidget *button;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_init (&argc, &argv);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Window and box */
Packit Service fb6fa5
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit Service fb6fa5
  gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
Packit Service fb6fa5
  g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
Packit Service fb6fa5
  gtk_container_set_border_width (GTK_CONTAINER (window), 5);
Packit Service fb6fa5
Packit Service fb6fa5
  vbox = gtk_vbox_new (FALSE, 5);
Packit Service fb6fa5
  gtk_container_add (GTK_CONTAINER (window), vbox);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Option menu contents */
Packit Service fb6fa5
  combo_box = gtk_combo_box_text_new ();
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), NO_EXPAND);
Packit Service fb6fa5
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), SINGLE_EXPAND);
Packit Service fb6fa5
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), MULTI_EXPAND);
Packit Service fb6fa5
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), LAST_EXPAND);
Packit Service fb6fa5
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), BORDER_EXPAND);
Packit Service fb6fa5
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), ALL_EXPAND);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (vbox), combo_box, FALSE, FALSE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Scrolled window and tree view */
Packit Service fb6fa5
  sw = gtk_scrolled_window_new (NULL, NULL);
Packit Service fb6fa5
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
Packit Service fb6fa5
                                  GTK_POLICY_AUTOMATIC,
Packit Service fb6fa5
                                  GTK_POLICY_AUTOMATIC);
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  tree_view = gtk_tree_view_new_with_model (create_model ());
Packit Service fb6fa5
  gtk_container_add (GTK_CONTAINER (sw), tree_view);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < 5; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTreeViewColumn *column;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
Packit Service fb6fa5
                                                   i, "Header",
Packit Service fb6fa5
                                                   gtk_cell_renderer_text_new (),
Packit Service fb6fa5
                                                   "text", i,
Packit Service fb6fa5
                                                   NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), i);
Packit Service fb6fa5
      gtk_tree_view_column_set_resizable (column, TRUE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Toggle button for long content row */
Packit Service fb6fa5
  button = gtk_toggle_button_new_with_label ("Toggle long content row");
Packit Service fb6fa5
  g_signal_connect (button, "toggled",
Packit Service fb6fa5
                    G_CALLBACK (toggle_long_content_row), tree_view);
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Set up option menu callback and default item */
Packit Service fb6fa5
  g_signal_connect (combo_box, "changed",
Packit Service fb6fa5
                    G_CALLBACK (combo_box_changed), tree_view);
Packit Service fb6fa5
  gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Done */
Packit Service fb6fa5
  gtk_widget_show_all (window);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_main ();
Packit Service fb6fa5
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}