X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Fpsppire-output-window.c;h=5bc3043d488a87590a6e1be32dd5c02b81744cb4;hb=6c01a0e73a1cf063cf3dda6d72bbc71b863b56ae;hp=06692c2a26b11f7d8e1bbc3add73d593e4f51083;hpb=f3aed988c27ca4a37a5f5102c18012c3983a7191;p=pspp-builds.git diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index 06692c2a..5bc3043d 100644 --- a/src/ui/gui/psppire-output-window.c +++ b/src/ui/gui/psppire-output-window.c @@ -42,7 +42,11 @@ #define _(msgid) gettext (msgid) #define N_(msgid) msgid - +enum + { + COL_TITLE, /* Table title. */ + N_COLS + }; static void psppire_output_window_base_finalize (PsppireOutputWindowClass *, gpointer); static void psppire_output_window_base_init (PsppireOutputWindowClass *class); @@ -129,7 +133,8 @@ expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) tab_r (t), tab_t (t), tab_b (t)); entity->class->title (rendering, 0, 0, - entity->table_num, entity->subtable_num); + entity->table_num, entity->subtable_num, + entity->command_name); entity->class->render (rendering, tab_l (t), tab_t (t), tab_nc (t) - tab_r (t), tab_nr (t) - tab_b (t)); @@ -155,8 +160,12 @@ psppire_output_submit (struct outp_driver *this, struct som_entity *entity) cairo_t *cairo = gdk_cairo_create (GDK_DRAWABLE (window)); struct outp_driver *driver = xr_create_driver (cairo); /* XXX can fail */ struct tab_table *t = entity->ext; + GtkTreeStore *store; + GtkTreeIter item; + GtkTreePath *path; GtkWidget *drawing_area; void *rendering; + struct string title; int tw, th; tab_ref (t); @@ -168,7 +177,7 @@ psppire_output_submit (struct outp_driver *this, struct som_entity *entity) gtk_widget_modify_bg (GTK_WIDGET (drawing_area), GTK_STATE_NORMAL, >k_widget_get_style (drawing_area)->base[GTK_STATE_NORMAL]); g_object_set_data (G_OBJECT (drawing_area), - "entity", xmemdup (entity, sizeof *entity)); + "entity", som_entity_clone (entity)); gtk_widget_set_size_request (drawing_area, tw / 1024, th / 1024); gtk_layout_put (the_output_viewer->output, drawing_area, 0, the_output_viewer->y); @@ -186,6 +195,37 @@ psppire_output_submit (struct outp_driver *this, struct som_entity *entity) gtk_layout_set_size (the_output_viewer->output, the_output_viewer->max_width, the_output_viewer->y); + + store = GTK_TREE_STORE (gtk_tree_view_get_model ( + the_output_viewer->overview)); + + ds_init_empty (&title); + if (entity->table_num != the_output_viewer->last_table_num) + { + gtk_tree_store_append (store, &item, NULL); + + ds_put_format (&title, "%d %s", + entity->table_num, entity->command_name); + gtk_tree_store_set (store, &item, COL_TITLE, ds_cstr (&title), -1); + + /* XXX shouldn't save a GtkTreeIter */ + the_output_viewer->last_table_num = entity->table_num; + the_output_viewer->last_top_level = item; + } + + gtk_tree_store_append (store, &item, + &the_output_viewer->last_top_level); + ds_clear (&title); + ds_put_format (&title, "%d.%d %s", + entity->table_num, entity->subtable_num, + t->title ? t->title : entity->command_name); + gtk_tree_store_set (store, &item, COL_TITLE, ds_cstr (&title), -1); + ds_destroy (&title); + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), + &the_output_viewer->last_top_level); + gtk_tree_view_expand_row (the_output_viewer->overview, path, TRUE); + gtk_tree_path_free (path); } gtk_window_set_urgency_hint (GTK_WINDOW (the_output_viewer), TRUE); @@ -244,13 +284,30 @@ cancel_urgency (GtkWindow *window, gpointer data) static void psppire_output_window_init (PsppireOutputWindow *window) { - GtkBuilder *xml = builder_new ("output-viewer.ui"); + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkBuilder *xml; + + xml = builder_new ("output-viewer.ui"); gtk_widget_reparent (get_widget_assert (xml, "vbox1"), GTK_WIDGET (window)); window->output = GTK_LAYOUT (get_widget_assert (xml, "output")); window->y = 0; + window->overview = GTK_TREE_VIEW (get_widget_assert (xml, "overview")); + gtk_tree_view_set_model (window->overview, + GTK_TREE_MODEL (gtk_tree_store_new ( + N_COLS, + G_TYPE_STRING))); /* COL_TITLE */ + window->last_table_num = -1; + + column = gtk_tree_view_column_new (); + gtk_tree_view_append_column (GTK_TREE_VIEW (window->overview), column); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer, TRUE); + gtk_tree_view_column_add_attribute (column, renderer, "text", COL_TITLE); + gtk_widget_modify_bg (GTK_WIDGET (window->output), GTK_STATE_NORMAL, >k_widget_get_style (GTK_WIDGET (window->output))->base[GTK_STATE_NORMAL]);