X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-output-window.c;h=af47d3be51079a1e63c344824e74df20e4d5d322;hb=dfd1972f7bcb550a4fc3b05dbe7e71d12334b0a7;hp=35216d4e518502d809fd8e02965d82945fd53f86;hpb=c9a3c45e44c1c03d13d4eb186e3817bc836f75f8;p=pspp-builds.git diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index 35216d4e..af47d3be 100644 --- a/src/ui/gui/psppire-output-window.c +++ b/src/ui/gui/psppire-output-window.c @@ -20,11 +20,11 @@ #include #include "helper.h" +#include #include #include -#include -#include -#include +#include +#include #include #include "about.h" @@ -118,147 +118,105 @@ psppire_output_window_base_finalize (PsppireOutputWindowClass *class, /* Output driver class. */ -static PsppireOutputWindow *the_output_viewer = NULL; +struct psppire_output_driver + { + struct output_driver driver; + PsppireOutputWindow *viewer; + struct xr_driver *xr; + }; + +static struct output_driver_class psppire_output_class; + +static struct psppire_output_driver * +psppire_output_cast (struct output_driver *driver) +{ + assert (driver->class == &psppire_output_class); + return UP_CAST (driver, struct psppire_output_driver, driver); +} static gboolean expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) { - struct som_entity *entity = g_object_get_data (G_OBJECT (widget), "entity"); - GdkWindow *window = widget->window; - 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; - void *rendering; - - rendering = entity->class->render_init (entity, driver, tab_l (t), - tab_r (t), tab_t (t), tab_b (t)); - - entity->class->title (rendering, 0, 0, - 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)); - - entity->class->render_free (rendering); - driver->class->close_driver (driver); - outp_free_driver (driver); + struct xr_rendering *r = g_object_get_data (G_OBJECT (widget), "rendering"); + cairo_t *cr; + + cr = gdk_cairo_create (widget->window); + xr_rendering_draw (r, cr); + cairo_destroy (cr); + return TRUE; } static void -psppire_output_submit (struct outp_driver *this, struct som_entity *entity) +psppire_output_submit (struct output_driver *this, + const struct output_item *item) { - if (the_output_viewer == NULL) - { - the_output_viewer = PSPPIRE_OUTPUT_WINDOW (psppire_output_window_new ()); - gtk_widget_show_all (GTK_WIDGET (the_output_viewer)); - } + struct psppire_output_driver *pod = psppire_output_cast (this); + GtkWidget *drawing_area; + struct xr_rendering *r; + cairo_t *cr; + int tw, th; - if (entity->type == SOM_TABLE) + if (pod->viewer == NULL) { - GdkWindow *window = GTK_WIDGET (the_output_viewer)->window; - 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); - rendering = entity->class->render_init (entity, driver, tab_l (t), - tab_r (t), tab_t (t), tab_b (t)); - 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", 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); - gtk_widget_show (drawing_area); - g_signal_connect (G_OBJECT (drawing_area), "expose_event", - G_CALLBACK (expose_event_callback), NULL); - - entity->class->render_free (rendering); - driver->class->close_driver (driver); - outp_free_driver (driver); - - 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), - COL_Y, the_output_viewer->y, - -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), - COL_Y, the_output_viewer->y, - -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); - - 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); + pod->viewer = PSPPIRE_OUTPUT_WINDOW (psppire_output_window_new ()); + gtk_widget_show_all (GTK_WIDGET (pod->viewer)); + pod->viewer->driver = pod; } - gtk_window_set_urgency_hint (GTK_WINDOW (the_output_viewer), TRUE); + cr = gdk_cairo_create (GTK_WIDGET (pod->viewer)->window); + if (pod->xr == NULL) + pod->xr = xr_create_driver (cr); + + r = xr_rendering_create (pod->xr, item, cr); + if (r == NULL) + goto done; + + xr_rendering_measure (r, &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), "rendering", r); + gtk_widget_set_size_request (drawing_area, tw, th); + gtk_layout_put (pod->viewer->output, drawing_area, 0, pod->viewer->y); + gtk_widget_show (drawing_area); + g_signal_connect (G_OBJECT (drawing_area), "expose_event", + G_CALLBACK (expose_event_callback), NULL); + + if (pod->viewer->max_width < tw) + pod->viewer->max_width = tw; + pod->viewer->y += th; + + gtk_layout_set_size (pod->viewer->output, + pod->viewer->max_width, pod->viewer->y); + + gtk_window_set_urgency_hint (GTK_WINDOW (pod->viewer), TRUE); + +done: + cairo_destroy (cr); } -static struct outp_class psppire_output_class = +static struct output_driver_class psppire_output_class = { "PSPPIRE", /* name */ - true, /* special */ - NULL, /* open_driver */ - NULL, /* close_driver */ - NULL, /* open_page */ - NULL, /* close_page */ - NULL, /* flush */ - NULL, /* output_chart */ + NULL, /* create */ + NULL, /* destroy */ psppire_output_submit, /* submit */ - NULL, /* line */ - NULL, /* text_metrics */ - NULL, /* text_draw */ + NULL, /* flush */ }; void psppire_output_window_setup (void) { - outp_register_driver (outp_allocate_driver (&psppire_output_class, - "PSPPIRE", 0)); + struct psppire_output_driver *pod; + struct output_driver *d; + + pod = xzalloc (sizeof *pod); + d = &pod->driver; + output_driver_init (d, &psppire_output_class, "PSPPIRE", 0); + output_driver_register (d); } int viewer_length = 16; @@ -273,7 +231,7 @@ on_delete (GtkWidget *w, GdkEvent *event, gpointer user_data) gtk_widget_destroy (GTK_WIDGET (ow)); - the_output_viewer = NULL; + ow->driver->viewer = NULL; return FALSE; }