Blame demos/gtk-demo/stock_browser.c

Packit 98cdb6
/* Stock Item and Icon Browser
Packit 98cdb6
 *
Packit 98cdb6
 * This source code for this demo doesn't demonstrate anything
Packit 98cdb6
 * particularly useful in applications. The purpose of the "demo" is
Packit 98cdb6
 * just to provide a handy place to browse the available stock icons
Packit 98cdb6
 * and stock items.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#include <string.h>
Packit 98cdb6
Packit 98cdb6
#include <gtk/gtk.h>
Packit 98cdb6
Packit 98cdb6
static GtkWidget *window = NULL;
Packit 98cdb6
Packit 98cdb6
typedef struct _StockItemInfo StockItemInfo;
Packit 98cdb6
struct _StockItemInfo
Packit 98cdb6
{
Packit 98cdb6
  gchar *id;
Packit 98cdb6
  GtkStockItem item;
Packit 98cdb6
  GdkPixbuf *small_icon;
Packit 98cdb6
  gchar *macro;
Packit 98cdb6
  gchar *accel_str;
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
/* Make StockItemInfo a boxed type so we can automatically
Packit 98cdb6
 * manage memory
Packit 98cdb6
 */
Packit 98cdb6
#define STOCK_ITEM_INFO_TYPE stock_item_info_get_type ()
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
stock_item_info_free (StockItemInfo *info)
Packit 98cdb6
{
Packit 98cdb6
  g_free (info->id);
Packit 98cdb6
  g_free (info->macro);
Packit 98cdb6
  g_free (info->accel_str);
Packit 98cdb6
  if (info->small_icon)
Packit 98cdb6
    g_object_unref (info->small_icon);
Packit 98cdb6
  
Packit 98cdb6
  g_free (info);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static StockItemInfo*
Packit 98cdb6
stock_item_info_copy (StockItemInfo *src)
Packit 98cdb6
{
Packit 98cdb6
  StockItemInfo *info;
Packit 98cdb6
Packit 98cdb6
  info = g_new (StockItemInfo, 1);
Packit 98cdb6
  info->id = g_strdup (src->id);
Packit 98cdb6
  info->macro = g_strdup (src->macro);
Packit 98cdb6
  info->accel_str = g_strdup (src->accel_str);
Packit 98cdb6
  
Packit 98cdb6
  info->item = src->item;
Packit 98cdb6
Packit 98cdb6
  info->small_icon = src->small_icon;
Packit 98cdb6
  if (info->small_icon)
Packit 98cdb6
    g_object_ref (info->small_icon);
Packit 98cdb6
Packit 98cdb6
  return info;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GType
Packit 98cdb6
stock_item_info_get_type (void)
Packit 98cdb6
{
Packit 98cdb6
  static GType our_type = 0;
Packit 98cdb6
  
Packit 98cdb6
  if (our_type == 0)
Packit 98cdb6
    our_type = g_boxed_type_register_static ("StockItemInfo",
Packit 98cdb6
                                             (GBoxedCopyFunc) stock_item_info_copy,
Packit 98cdb6
                                             (GBoxedFreeFunc) stock_item_info_free);
Packit 98cdb6
Packit 98cdb6
  return our_type;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
typedef struct _StockItemDisplay StockItemDisplay;
Packit 98cdb6
struct _StockItemDisplay
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *type_label;
Packit 98cdb6
  GtkWidget *macro_label;
Packit 98cdb6
  GtkWidget *id_label;
Packit 98cdb6
  GtkWidget *label_accel_label;
Packit 98cdb6
  GtkWidget *icon_image;
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
static gchar*
Packit 98cdb6
id_to_macro (const gchar *id)
Packit 98cdb6
{
Packit 98cdb6
  GString *macro = NULL;
Packit 98cdb6
  const gchar *cp;
Packit 98cdb6
Packit 98cdb6
  /* gtk-foo-bar -> GTK_STOCK_FOO_BAR */
Packit 98cdb6
Packit 98cdb6
  macro = g_string_new (NULL);
Packit 98cdb6
  
Packit 98cdb6
  cp = id;
Packit 98cdb6
  
Packit 98cdb6
  if (strncmp (cp, "gtk-", 4) == 0)
Packit 98cdb6
    {
Packit 98cdb6
      g_string_append (macro, "GTK_STOCK_");
Packit 98cdb6
      cp += 4;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  while (*cp)
Packit 98cdb6
    {
Packit 98cdb6
      if (*cp == '-')
Packit 98cdb6
	g_string_append_c (macro, '_');
Packit 98cdb6
      else if (g_ascii_islower (*cp))
Packit 98cdb6
	g_string_append_c (macro, g_ascii_toupper (*cp));
Packit 98cdb6
      else
Packit 98cdb6
	g_string_append_c (macro, *cp);
Packit 98cdb6
Packit 98cdb6
      cp++;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return g_string_free (macro, FALSE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GtkTreeModel*
Packit 98cdb6
create_model (void)
Packit 98cdb6
{
Packit 98cdb6
  GtkListStore *store;
Packit 98cdb6
  GSList *ids;
Packit 98cdb6
  GSList *tmp_list;
Packit 98cdb6
  
Packit 98cdb6
  store = gtk_list_store_new (2, STOCK_ITEM_INFO_TYPE, G_TYPE_STRING);
Packit 98cdb6
Packit 98cdb6
  ids = gtk_stock_list_ids ();
Packit 98cdb6
  ids = g_slist_sort (ids, (GCompareFunc) strcmp);
Packit 98cdb6
  tmp_list = ids;
Packit 98cdb6
  while (tmp_list != NULL)
Packit 98cdb6
    {
Packit 98cdb6
      StockItemInfo info;
Packit 98cdb6
      GtkStockItem item;
Packit 98cdb6
      GtkTreeIter iter;
Packit 98cdb6
      GtkIconSet *icon_set;
Packit 98cdb6
      
Packit 98cdb6
      info.id = tmp_list->data;
Packit 98cdb6
      
Packit 98cdb6
      if (gtk_stock_lookup (info.id, &item))
Packit 98cdb6
        {
Packit 98cdb6
          info.item = item;
Packit 98cdb6
        }
Packit 98cdb6
      else
Packit 98cdb6
        {
Packit 98cdb6
          info.item.label = NULL;
Packit 98cdb6
          info.item.stock_id = NULL;
Packit 98cdb6
          info.item.modifier = 0;
Packit 98cdb6
          info.item.keyval = 0;
Packit 98cdb6
          info.item.translation_domain = NULL;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      /* only show icons for stock IDs that have default icons */
Packit 98cdb6
      icon_set = gtk_icon_factory_lookup_default (info.id);
Packit 98cdb6
      if (icon_set)
Packit 98cdb6
        {
Packit 98cdb6
          GtkIconSize *sizes = NULL;
Packit 98cdb6
          gint n_sizes = 0;
Packit 98cdb6
          gint i;
Packit 98cdb6
          GtkIconSize size;
Packit 98cdb6
Packit 98cdb6
          /* See what sizes this stock icon really exists at */
Packit 98cdb6
          gtk_icon_set_get_sizes (icon_set, &sizes, &n_sizes);
Packit 98cdb6
Packit 98cdb6
          /* Use menu size if it exists, otherwise first size found */
Packit 98cdb6
          size = sizes[0];
Packit 98cdb6
          i = 0;
Packit 98cdb6
          while (i < n_sizes)
Packit 98cdb6
            {
Packit 98cdb6
              if (sizes[i] == GTK_ICON_SIZE_MENU)
Packit 98cdb6
                {
Packit 98cdb6
                  size = GTK_ICON_SIZE_MENU;
Packit 98cdb6
                  break;
Packit 98cdb6
                }
Packit 98cdb6
              ++i;
Packit 98cdb6
            }
Packit 98cdb6
          g_free (sizes);
Packit 98cdb6
          
Packit 98cdb6
          info.small_icon = gtk_widget_render_icon (window, info.id,
Packit 98cdb6
                                                    size,
Packit 98cdb6
                                                    NULL);
Packit 98cdb6
          
Packit 98cdb6
          if (size != GTK_ICON_SIZE_MENU)
Packit 98cdb6
            {
Packit 98cdb6
              /* Make the result the proper size for our thumbnail */
Packit 98cdb6
              gint w, h;
Packit 98cdb6
              GdkPixbuf *scaled;
Packit 98cdb6
              
Packit 98cdb6
              gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h);
Packit 98cdb6
              
Packit 98cdb6
              scaled = gdk_pixbuf_scale_simple (info.small_icon,
Packit 98cdb6
                                                w, h,
Packit 98cdb6
                                                GDK_INTERP_BILINEAR);
Packit 98cdb6
Packit 98cdb6
              g_object_unref (info.small_icon);
Packit 98cdb6
              info.small_icon = scaled;
Packit 98cdb6
            }
Packit 98cdb6
        }
Packit 98cdb6
      else
Packit 98cdb6
        info.small_icon = NULL;
Packit 98cdb6
Packit 98cdb6
      if (info.item.keyval != 0)
Packit 98cdb6
        {
Packit 98cdb6
          info.accel_str = gtk_accelerator_name (info.item.keyval,
Packit 98cdb6
                                                 info.item.modifier);
Packit 98cdb6
        }
Packit 98cdb6
      else
Packit 98cdb6
        {
Packit 98cdb6
          info.accel_str = g_strdup ("");
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      info.macro = id_to_macro (info.id);
Packit 98cdb6
      
Packit 98cdb6
      gtk_list_store_append (store, &iter);
Packit 98cdb6
      gtk_list_store_set (store, &iter, 0, &info, 1, info.id, -1);
Packit 98cdb6
Packit 98cdb6
      g_free (info.macro);
Packit 98cdb6
      g_free (info.accel_str);
Packit 98cdb6
      if (info.small_icon)
Packit 98cdb6
        g_object_unref (info.small_icon);
Packit 98cdb6
      
Packit 98cdb6
      tmp_list = g_slist_next (tmp_list);
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  g_slist_foreach (ids, (GFunc)g_free, NULL);
Packit 98cdb6
  g_slist_free (ids);
Packit 98cdb6
Packit 98cdb6
  return GTK_TREE_MODEL (store);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Finds the largest size at which the given image stock id is
Packit 98cdb6
 * available. This would not be useful for a normal application
Packit 98cdb6
 */
Packit 98cdb6
static GtkIconSize
Packit 98cdb6
get_largest_size (const char *id)
Packit 98cdb6
{
Packit 98cdb6
  GtkIconSet *set = gtk_icon_factory_lookup_default (id);
Packit 98cdb6
  GtkIconSize *sizes;
Packit 98cdb6
  gint n_sizes, i;
Packit 98cdb6
  GtkIconSize best_size = GTK_ICON_SIZE_INVALID;
Packit 98cdb6
  gint best_pixels = 0;
Packit 98cdb6
Packit 98cdb6
  gtk_icon_set_get_sizes (set, &sizes, &n_sizes);
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < n_sizes; i++)
Packit 98cdb6
    {
Packit 98cdb6
      gint width, height;
Packit 98cdb6
      
Packit 98cdb6
      gtk_icon_size_lookup (sizes[i], &width, &height);
Packit 98cdb6
Packit 98cdb6
      if (width * height > best_pixels)
Packit 98cdb6
	{
Packit 98cdb6
	  best_size = sizes[i];
Packit 98cdb6
	  best_pixels = width * height;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  g_free (sizes);
Packit 98cdb6
Packit 98cdb6
  return best_size;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
selection_changed (GtkTreeSelection *selection)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeView *treeview;
Packit 98cdb6
  StockItemDisplay *display;
Packit 98cdb6
  GtkTreeModel *model;
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  
Packit 98cdb6
  treeview = gtk_tree_selection_get_tree_view (selection);
Packit 98cdb6
  display = g_object_get_data (G_OBJECT (treeview), "stock-display");
Packit 98cdb6
Packit 98cdb6
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
Packit 98cdb6
    {
Packit 98cdb6
      StockItemInfo *info;
Packit 98cdb6
      gchar *str;
Packit 98cdb6
      
Packit 98cdb6
      gtk_tree_model_get (model, &iter,
Packit 98cdb6
                          0, &info,
Packit 98cdb6
                          -1);
Packit 98cdb6
Packit 98cdb6
      if (info->small_icon && info->item.label)
Packit 98cdb6
        gtk_label_set_text (GTK_LABEL (display->type_label), "Icon and Item");
Packit 98cdb6
      else if (info->small_icon)
Packit 98cdb6
        gtk_label_set_text (GTK_LABEL (display->type_label), "Icon Only");
Packit 98cdb6
      else if (info->item.label)
Packit 98cdb6
        gtk_label_set_text (GTK_LABEL (display->type_label), "Item Only");
Packit 98cdb6
      else
Packit 98cdb6
        gtk_label_set_text (GTK_LABEL (display->type_label), "???????");
Packit 98cdb6
Packit 98cdb6
      gtk_label_set_text (GTK_LABEL (display->macro_label), info->macro);
Packit 98cdb6
      gtk_label_set_text (GTK_LABEL (display->id_label), info->id);
Packit 98cdb6
Packit 98cdb6
      if (info->item.label)
Packit 98cdb6
        {
Packit 98cdb6
          str = g_strdup_printf ("%s %s", info->item.label, info->accel_str);
Packit 98cdb6
          gtk_label_set_text_with_mnemonic (GTK_LABEL (display->label_accel_label), str);
Packit 98cdb6
          g_free (str);
Packit 98cdb6
        }
Packit 98cdb6
      else
Packit 98cdb6
        {
Packit 98cdb6
          gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      if (info->small_icon)
Packit 98cdb6
        gtk_image_set_from_stock (GTK_IMAGE (display->icon_image), info->id,
Packit 98cdb6
                                  get_largest_size (info->id));
Packit 98cdb6
      else
Packit 98cdb6
        gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
Packit 98cdb6
Packit 98cdb6
      stock_item_info_free (info);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      gtk_label_set_text (GTK_LABEL (display->type_label), "No selected item");
Packit 98cdb6
      gtk_label_set_text (GTK_LABEL (display->macro_label), "");
Packit 98cdb6
      gtk_label_set_text (GTK_LABEL (display->id_label), "");
Packit 98cdb6
      gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
Packit 98cdb6
      gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
macro_set_func_text (GtkTreeViewColumn *tree_column,
Packit 98cdb6
		     GtkCellRenderer   *cell,
Packit 98cdb6
		     GtkTreeModel      *model,
Packit 98cdb6
		     GtkTreeIter       *iter,
Packit 98cdb6
		     gpointer           data)
Packit 98cdb6
{
Packit 98cdb6
  StockItemInfo *info;
Packit 98cdb6
  
Packit 98cdb6
  gtk_tree_model_get (model, iter,
Packit 98cdb6
                      0, &info,
Packit 98cdb6
                      -1);
Packit 98cdb6
  
Packit 98cdb6
  g_object_set (GTK_CELL_RENDERER (cell),
Packit 98cdb6
                "text", info->macro,
Packit 98cdb6
                NULL);
Packit 98cdb6
  
Packit 98cdb6
  stock_item_info_free (info);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
id_set_func (GtkTreeViewColumn *tree_column,
Packit 98cdb6
             GtkCellRenderer   *cell,
Packit 98cdb6
             GtkTreeModel      *model,
Packit 98cdb6
             GtkTreeIter       *iter,
Packit 98cdb6
             gpointer           data)
Packit 98cdb6
{
Packit 98cdb6
  StockItemInfo *info;
Packit 98cdb6
  
Packit 98cdb6
  gtk_tree_model_get (model, iter,
Packit 98cdb6
                      0, &info,
Packit 98cdb6
                      -1);
Packit 98cdb6
  
Packit 98cdb6
  g_object_set (GTK_CELL_RENDERER (cell),
Packit 98cdb6
                "text", info->id,
Packit 98cdb6
                NULL);
Packit 98cdb6
  
Packit 98cdb6
  stock_item_info_free (info);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
accel_set_func (GtkTreeViewColumn *tree_column,
Packit 98cdb6
                GtkCellRenderer   *cell,
Packit 98cdb6
                GtkTreeModel      *model,
Packit 98cdb6
                GtkTreeIter       *iter,
Packit 98cdb6
                gpointer           data)
Packit 98cdb6
{
Packit 98cdb6
  StockItemInfo *info;
Packit 98cdb6
  
Packit 98cdb6
  gtk_tree_model_get (model, iter,
Packit 98cdb6
                      0, &info,
Packit 98cdb6
                      -1);
Packit 98cdb6
  
Packit 98cdb6
  g_object_set (GTK_CELL_RENDERER (cell),
Packit 98cdb6
                "text", info->accel_str,
Packit 98cdb6
                NULL);
Packit 98cdb6
  
Packit 98cdb6
  stock_item_info_free (info);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
label_set_func (GtkTreeViewColumn *tree_column,
Packit 98cdb6
                GtkCellRenderer   *cell,
Packit 98cdb6
                GtkTreeModel      *model,
Packit 98cdb6
                GtkTreeIter       *iter,
Packit 98cdb6
                gpointer           data)
Packit 98cdb6
{
Packit 98cdb6
  StockItemInfo *info;
Packit 98cdb6
  
Packit 98cdb6
  gtk_tree_model_get (model, iter,
Packit 98cdb6
                      0, &info,
Packit 98cdb6
                      -1);
Packit 98cdb6
  
Packit 98cdb6
  g_object_set (GTK_CELL_RENDERER (cell),
Packit 98cdb6
                "text", info->item.label,
Packit 98cdb6
                NULL);
Packit 98cdb6
  
Packit 98cdb6
  stock_item_info_free (info);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GtkWidget *
Packit 98cdb6
do_stock_browser (GtkWidget *do_widget)
Packit 98cdb6
{  
Packit 98cdb6
  if (!window)
Packit 98cdb6
    {
Packit 98cdb6
      GtkWidget *frame;
Packit 98cdb6
      GtkWidget *vbox;
Packit 98cdb6
      GtkWidget *hbox;
Packit 98cdb6
      GtkWidget *sw;
Packit 98cdb6
      GtkWidget *treeview;
Packit 98cdb6
      GtkWidget *align;
Packit 98cdb6
      GtkTreeModel *model;
Packit 98cdb6
      GtkCellRenderer *cell_renderer;
Packit 98cdb6
      StockItemDisplay *display;
Packit 98cdb6
      GtkTreeSelection *selection;
Packit 98cdb6
      GtkTreeViewColumn *column;
Packit 98cdb6
Packit 98cdb6
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 98cdb6
      gtk_window_set_screen (GTK_WINDOW (window),
Packit 98cdb6
			     gtk_widget_get_screen (do_widget));
Packit 98cdb6
      gtk_window_set_title (GTK_WINDOW (window), "Stock Icons and Items");
Packit 98cdb6
      gtk_window_set_default_size (GTK_WINDOW (window), -1, 500);
Packit 98cdb6
Packit 98cdb6
      g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
Packit 98cdb6
      gtk_container_set_border_width (GTK_CONTAINER (window), 8);
Packit 98cdb6
Packit 98cdb6
      hbox = gtk_hbox_new (FALSE, 8);
Packit 98cdb6
      gtk_container_add (GTK_CONTAINER (window), hbox);
Packit 98cdb6
Packit 98cdb6
      sw = gtk_scrolled_window_new (NULL, NULL);
Packit 98cdb6
      gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
Packit 98cdb6
                                      GTK_POLICY_NEVER,
Packit 98cdb6
                                      GTK_POLICY_AUTOMATIC);
Packit 98cdb6
      gtk_box_pack_start (GTK_BOX (hbox), sw, FALSE, FALSE, 0);
Packit 98cdb6
Packit 98cdb6
      model = create_model ();
Packit 98cdb6
      
Packit 98cdb6
      treeview = gtk_tree_view_new_with_model (model);
Packit 98cdb6
Packit 98cdb6
      g_object_unref (model);
Packit 98cdb6
Packit 98cdb6
      gtk_container_add (GTK_CONTAINER (sw), treeview);
Packit 98cdb6
      
Packit 98cdb6
      column = gtk_tree_view_column_new ();
Packit 98cdb6
      gtk_tree_view_column_set_title (column, "Macro");
Packit 98cdb6
Packit 98cdb6
      cell_renderer = gtk_cell_renderer_pixbuf_new ();
Packit 98cdb6
      gtk_tree_view_column_pack_start (column,
Packit 98cdb6
				       cell_renderer,
Packit 98cdb6
				       FALSE);
Packit 98cdb6
      gtk_tree_view_column_set_attributes (column, cell_renderer,
Packit 98cdb6
					   "stock_id", 1, NULL);
Packit 98cdb6
      cell_renderer = gtk_cell_renderer_text_new ();
Packit 98cdb6
      gtk_tree_view_column_pack_start (column,
Packit 98cdb6
				       cell_renderer,
Packit 98cdb6
				       TRUE);
Packit 98cdb6
      gtk_tree_view_column_set_cell_data_func (column, cell_renderer,
Packit 98cdb6
					       macro_set_func_text, NULL, NULL);
Packit 98cdb6
Packit 98cdb6
      gtk_tree_view_append_column (GTK_TREE_VIEW (treeview),
Packit 98cdb6
				   column);
Packit 98cdb6
Packit 98cdb6
      cell_renderer = gtk_cell_renderer_text_new ();
Packit 98cdb6
      gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
Packit 98cdb6
                                                  -1,
Packit 98cdb6
                                                  "Label",
Packit 98cdb6
                                                  cell_renderer,
Packit 98cdb6
                                                  label_set_func,
Packit 98cdb6
                                                  NULL,
Packit 98cdb6
                                                  NULL);
Packit 98cdb6
Packit 98cdb6
      cell_renderer = gtk_cell_renderer_text_new ();
Packit 98cdb6
      gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
Packit 98cdb6
                                                  -1,
Packit 98cdb6
                                                  "Accel",
Packit 98cdb6
                                                  cell_renderer,
Packit 98cdb6
                                                  accel_set_func,
Packit 98cdb6
                                                  NULL,
Packit 98cdb6
                                                  NULL);
Packit 98cdb6
Packit 98cdb6
      cell_renderer = gtk_cell_renderer_text_new ();
Packit 98cdb6
      gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
Packit 98cdb6
                                                  -1,
Packit 98cdb6
                                                  "ID",
Packit 98cdb6
                                                  cell_renderer,
Packit 98cdb6
                                                  id_set_func,
Packit 98cdb6
                                                  NULL,
Packit 98cdb6
                                                  NULL);
Packit 98cdb6
      
Packit 98cdb6
      align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
Packit 98cdb6
      gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0);
Packit 98cdb6
      
Packit 98cdb6
      frame = gtk_frame_new ("Selected Item");
Packit 98cdb6
      gtk_container_add (GTK_CONTAINER (align), frame);
Packit 98cdb6
Packit 98cdb6
      vbox = gtk_vbox_new (FALSE, 8);
Packit 98cdb6
      gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
Packit 98cdb6
      gtk_container_add (GTK_CONTAINER (frame), vbox);
Packit 98cdb6
Packit 98cdb6
      display = g_new (StockItemDisplay, 1);
Packit 98cdb6
      g_object_set_data_full (G_OBJECT (treeview),
Packit 98cdb6
                              "stock-display",
Packit 98cdb6
                              display,
Packit 98cdb6
                              g_free); /* free display with treeview */
Packit 98cdb6
      
Packit 98cdb6
      display->type_label = gtk_label_new (NULL);
Packit 98cdb6
      display->macro_label = gtk_label_new (NULL);
Packit 98cdb6
      display->id_label = gtk_label_new (NULL);
Packit 98cdb6
      display->label_accel_label = gtk_label_new (NULL);
Packit 98cdb6
      display->icon_image = gtk_image_new_from_pixbuf (NULL); /* empty image */
Packit 98cdb6
Packit 98cdb6
      gtk_box_pack_start (GTK_BOX (vbox), display->type_label,
Packit 98cdb6
                          FALSE, FALSE, 0);
Packit 98cdb6
Packit 98cdb6
      gtk_box_pack_start (GTK_BOX (vbox), display->icon_image,
Packit 98cdb6
                          FALSE, FALSE, 0);
Packit 98cdb6
      
Packit 98cdb6
      gtk_box_pack_start (GTK_BOX (vbox), display->label_accel_label,
Packit 98cdb6
                          FALSE, FALSE, 0);
Packit 98cdb6
      gtk_box_pack_start (GTK_BOX (vbox), display->macro_label,
Packit 98cdb6
                          FALSE, FALSE, 0);
Packit 98cdb6
      gtk_box_pack_start (GTK_BOX (vbox), display->id_label,
Packit 98cdb6
                          FALSE, FALSE, 0);
Packit 98cdb6
Packit 98cdb6
      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
Packit 98cdb6
      gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
Packit 98cdb6
      
Packit 98cdb6
      g_signal_connect (selection,
Packit 98cdb6
			"changed",
Packit 98cdb6
			G_CALLBACK (selection_changed),
Packit 98cdb6
			NULL);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (!gtk_widget_get_visible (window))
Packit 98cdb6
    {
Packit 98cdb6
      gtk_widget_show_all (window);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {	 
Packit 98cdb6
      gtk_widget_destroy (window);
Packit 98cdb6
      window = NULL;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return window;
Packit 98cdb6
}