/***********************************************************************
 *
 * On Maemo:
 *   gcc -o cell-test cell-test.c `pkg-config --cflags --libs hildon-1`
 * Add -DPANNABLE to use a pannable area.
 *
 * Elsewhere:
 *   gcc -o cell-test cell-test.c `pkg-config --cflags --libs gtk+-2.0`
 *
 **********************************************************************/

#include <string.h>
#include <glib.h>
#include <gtk/gtk.h>
#ifdef PANNABLE
#include <hildon/hildon.h>
#endif

static void
cell_func (GtkTreeViewColumn *tree_column,
           GtkCellRenderer   *cell,
           GtkTreeModel      *tree_model,
           GtkTreeIter       *iter,
           gpointer           data)
{
    GdkPixbuf *pixbuf;
    gint n;

    gtk_tree_model_get (tree_model, iter, 0, &pixbuf, 1, &n, -1);
    g_print ("Get %d\n", n);
    g_object_set (cell, "pixbuf", pixbuf, NULL);
    g_object_unref (pixbuf);
}

static const gchar *icons[] = {
    "find",
    "go-last",
    "go-up",
    "info",
    "stop",
    "undo",
    "zoom-in",
    "zoom-out",
    "general_avatar1",
    "general_avatar2",
    "general_avatar3",
    "general_avatar4",
    "general_avatar5",
    "general_avatar6",
    "general_avatar7",
    "general_avatar8",
    "general_avatar9",
    "general_avatar10",
    "general_avatar11",
    "general_avatar12",
    "general_avatar13",
    "general_avatar14"};

static void
fill_store (GtkListStore *store,
            GtkWidget    *widget)
{
    GdkScreen *screen;
    GtkIconTheme *theme;
    gint i;
    gint icon_n;

    screen = gtk_widget_get_screen (widget);
    theme = gtk_icon_theme_get_for_screen (screen);

    for (i = 0, icon_n = 0; i < 100; i++) {
        const gchar *name;
        GdkPixbuf *pixbuf = NULL;
        GtkTreeIter iter;

        /* Just try some random icon names that should work */
        while (!pixbuf) {
            name = icons[icon_n++ % G_N_ELEMENTS (icons)];
            pixbuf = gtk_icon_theme_load_icon (theme, name, 48, 0, NULL);
        }

        gtk_list_store_append (store, &iter);
        gtk_list_store_set (store, &iter, 0, pixbuf, 1, i, -1);

        g_object_unref (pixbuf);
    }
}

int
main (int    argc,
      char **argv)
{
    gboolean fill_store_before_view;
    GtkWidget *window;
    GtkListStore *store;
    GtkWidget *view;
    GtkTreeViewColumn *column;
    GtkCellRenderer *cell;
#ifdef PANNABLE
    GtkWidget *pannable;
#else
    GtkWidget *sw;
#endif

    gtk_init (&argc, &argv);

    if (argv[1] && strcmp (argv[1], "--before") == 0)
        fill_store_before_view = TRUE;
    else
        fill_store_before_view = FALSE;

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size (GTK_WINDOW (window), 150, 300);
    g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL);

    store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_INT);
    if (fill_store_before_view)
        fill_store (store, window);

    view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
    gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE);

    column = gtk_tree_view_column_new ();
    gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
    gtk_tree_view_column_set_expand (column, TRUE);
    gtk_tree_view_insert_column (GTK_TREE_VIEW (view), column, 0);

    cell = gtk_cell_renderer_pixbuf_new ();
    gtk_tree_view_column_pack_end (column, cell, FALSE);
    gtk_tree_view_column_set_cell_data_func (column, cell, cell_func, NULL, NULL);

#ifdef PANNABLE
    pannable = hildon_pannable_area_new ();
    gtk_container_add (GTK_CONTAINER (pannable), view);
    gtk_container_add(GTK_CONTAINER (window), pannable);
#else
    sw = gtk_scrolled_window_new (NULL, NULL);
    gtk_container_add (GTK_CONTAINER (sw), view);
    gtk_container_add(GTK_CONTAINER (window), sw);
#endif

    if (!fill_store_before_view)
        fill_store (store, window);

    gtk_widget_show_all (window);

    gtk_main ();

    return 0;
}
