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=510d1c9e0c7e51836a1d9d06cf202699a18ce362;hpb=f633dff560960ab2c7d25108ec591d4db7a612a3;p=pspp-builds.git diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index 510d1c9e..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)); @@ -146,7 +151,7 @@ psppire_output_submit (struct outp_driver *this, struct som_entity *entity) if (the_output_viewer == NULL) { the_output_viewer = PSPPIRE_OUTPUT_WINDOW (psppire_output_window_new ()); - gtk_widget_show_now (GTK_WIDGET (the_output_viewer)); + gtk_widget_show_all (GTK_WIDGET (the_output_viewer)); } if (entity->type == SOM_TABLE) @@ -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); @@ -165,8 +174,10 @@ psppire_output_submit (struct outp_driver *this, struct som_entity *entity) entity->class->area (rendering, &tw, &th); drawing_area = gtk_drawing_area_new (); + 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); @@ -178,7 +189,43 @@ psppire_output_submit (struct outp_driver *this, struct som_entity *entity) driver->class->close_driver (driver); outp_free_driver (driver); + if (tw / 1024 > the_output_viewer->max_width) + the_output_viewer->max_width = tw / 1024; the_output_viewer->y += th / 1024; + + 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); @@ -237,13 +284,33 @@ 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]); + connect_help (xml); g_signal_connect (window,