#include <gtk/gtk.h>

/* compile with:
  gcc -o treeview-tutorial treeview-tutorial \
  `pkg-config gtk+-2.0 --libs --cflags`
 */

enum 
{
    URL_COLUMN,
    TIME_COLUMN,
    PROGRESS_TEXT_COLUMN,
    PROGRESS_COLUMN,
    PROGRESS_VISIBLE,
    COLUMN_COUNT
};

static GtkTreeModel *
create_tree_model ()
{
    GtkTreeStore *store;
    GtkTreeIter iter;
    GtkTreeIter iter2;

    store = gtk_tree_store_new (COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN);

    gtk_tree_store_append (store, &iter, NULL);
    gtk_tree_store_set (store, &iter,
            URL_COLUMN, "<b>Cygwin downloads</b>",
            TIME_COLUMN, "",
            PROGRESS_TEXT_COLUMN, "",
            PROGRESS_COLUMN, 0,
            PROGRESS_VISIBLE, FALSE,
            -1);

    gtk_tree_store_append (store, &iter2, &iter);
    gtk_tree_store_set (store, &iter2,
            URL_COLUMN, "http://www.cygwin.com/setup.exe",
            TIME_COLUMN, "0:30",
            PROGRESS_TEXT_COLUMN, "75%",
            PROGRESS_COLUMN, 75,
            PROGRESS_VISIBLE, TRUE,
            -1);

    gtk_tree_store_append (store, &iter, NULL);
    gtk_tree_store_set (store, &iter,
            URL_COLUMN, "<b>Debian downloads</b>",
            TIME_COLUMN, "",
            PROGRESS_TEXT_COLUMN, "",
            PROGRESS_COLUMN, 0,
            PROGRESS_VISIBLE, FALSE,
            -1);

    gtk_tree_store_append (store, &iter2, &iter);
    gtk_tree_store_set (store, &iter2,
            URL_COLUMN, "http://cdimage.debian.org/debian-cd/4.0_r6/i386/iso-cd/debian-40r6-i386-businesscard.iso",
            TIME_COLUMN, "34:27",
            PROGRESS_TEXT_COLUMN, "23%",
            PROGRESS_COLUMN, 23,
            PROGRESS_VISIBLE, TRUE,
            -1);

    gtk_tree_store_append (store, &iter2, &iter);
    gtk_tree_store_set (store, &iter2,
            URL_COLUMN, "http://cdimage.debian.org/debian-cd/4.0_r6/i386/iso-cd/debian-40r6-i386-xfce-CD-1.iso",
            TIME_COLUMN, "1:34",
            PROGRESS_TEXT_COLUMN, "98%",
            PROGRESS_COLUMN, 98,
            PROGRESS_VISIBLE, TRUE,
            -1);




    return GTK_TREE_MODEL (store);
}

static GtkWidget *
create_tree_view ()
{
    GtkWidget *view;
    GtkCellRenderer *renderer;
    GtkTreeViewColumn *column;

    view = gtk_tree_view_new_with_model (create_tree_model ());

    renderer = gtk_cell_renderer_text_new ();
    g_object_set (G_OBJECT (renderer),
            "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
            NULL);
    column = gtk_tree_view_column_new_with_attributes (
            "Location",
            renderer,
            "markup", URL_COLUMN,
            NULL);
    gtk_tree_view_column_set_expand (column, TRUE);
    gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

    renderer = gtk_cell_renderer_text_new ();
    column = gtk_tree_view_column_new_with_attributes (
            "ETA",
            renderer,
            "text", TIME_COLUMN,
            NULL);
    gtk_tree_view_column_set_expand (column, FALSE);
    gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

    renderer = gtk_cell_renderer_progress_new ();
    column = gtk_tree_view_column_new_with_attributes (
            "Progress",
            renderer,
            "text", PROGRESS_TEXT_COLUMN,
            "value", PROGRESS_COLUMN,
            "visible", PROGRESS_VISIBLE,
            NULL);
    gtk_tree_view_column_set_expand (column, FALSE);
    gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

    return view;
}

static GtkWidget *
create_gui ()
{
    GtkWidget *w;
    GtkWidget *scrolled;
    GtkWidget *view;

    w = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (w), "TreeView Demo");

    scrolled = gtk_scrolled_window_new (NULL, NULL);
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
            GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

    gtk_container_add (GTK_CONTAINER (w), scrolled);

    view = create_tree_view ();
    gtk_container_add (GTK_CONTAINER (scrolled), view);

    g_signal_connect (G_OBJECT (w), "destroy",
            gtk_main_quit, NULL);
    gtk_widget_set_size_request (w, 400, 300);
    gtk_widget_show_all (w);
    return w;
}

int main (int argc, char *argv[])
{
    GtkWidget *main_window;

    gtk_init (&argc, &argv);

    main_window = create_gui ();

    gtk_main();

    return 0;
}
