Code:
#ifdef __cplusplus
extern "C" {
#endif
#include "../Jesdisciple/toolkit.h"
#include "interface.h"
#include "outline.h"
#include <math.h>
#include <stdio.h>
#include <string.h>
#ifndef INTERFACE
#define INTERFACE TEXTUAL
#endif
static struct outline *o = (struct outline *)NULL;
#if INTERFACE == GRAPHICAL
#include <gtk/gtk.h>
static GtkWidget *w = (GtkWidget *)NULL;
enum{
TITLE_COLUMN,
AUTHOR_COLUMN,
CHECKED_COLUMN,
N_COLUMNS
};
void prompt(struct outline_interface *this, char *message, size_t length, void (*receive)(char *, void **), void **args){
GtkWidget *dialog = gtk_dialog_new_with_buttons("Outliner", (GtkWindow *)w, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_STOCK_OK, NULL);
GtkVBox *content = (GtkVBox *)gtk_dialog_get_content_area((GtkDialog *)dialog);
GtkEntry *entry = (GtkEntry *)gtk_entry_new_with_max_length((gint)length);
gtk_container_add((GtkContainer *)content, (GtkWidget *)entry);
gtk_widget_show_all(dialog);
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(receive), NULL);
gtk_dialog_run((GtkDialog *)dialog);
}
void set_title(char *title, void **args){
gtk_window_set_title((GtkWindow *)w, title);
}
void destroy(GtkWidget *widget, gpointer data){
gtk_main_quit();
exit(EXIT_SUCCESS);
}
gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data){
return FALSE;
}
void start(struct outline_interface *this){
GtkTreeStore *store;
GtkWidget *tree;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(w), "delete_event", G_CALLBACK(delete_event), NULL);
g_signal_connect(G_OBJECT(w), "destroy", G_CALLBACK(destroy), NULL);
gtk_container_set_border_width(GTK_CONTAINER(w), 10);
/* Create a model. We are using the store model for now, though we
* could use any other GtkTreeModel */
store = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
void *args[1] = {NULL};
this->prompt(this, "Enter a title for this outline.", 26, set_title, args);
/* Create a view */
tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
/* The view now holds a reference. We can get rid of our own
* reference */
g_object_unref(G_OBJECT(store));
/* Create a cell render and arbitrarily make it red for demonstration
* purposes */
renderer = gtk_cell_renderer_text_new();
g_object_set(G_OBJECT(renderer), "foreground", "red", NULL);
/* Create a column, associating the "text" attribute of the
* cell_renderer to the first column of the model */
column = gtk_tree_view_column_new_with_attributes ("Author", renderer, "text", AUTHOR_COLUMN, NULL);
/* Add the column to the view. */
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
/* Second column.. title of the book. */
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Title", renderer, "text", TITLE_COLUMN, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
/* Last column.. whether a book is checked out. */
renderer = gtk_cell_renderer_toggle_new();
column = gtk_tree_view_column_new_with_attributes("Checked out", renderer, "active", CHECKED_COLUMN, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
/* This packs the tree into the window (a gtk container). */
gtk_container_add(GTK_CONTAINER(w), tree);
gtk_widget_show_all(w);
gtk_main();
if(o != (struct outline *)NULL)
o->free(o);
}
#endif
#ifdef __cplusplus
}
#endif