X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-output-view.c;fp=src%2Fui%2Fgui%2Fpsppire-output-view.c;h=2f92b2696a6ec30f1c1abe7c23deeb2a4be5f3fb;hb=b754fbf65fcd1b4fb466bbba6af71e6717df01e3;hp=3a7ce4d357bb70b8e2a9e5a6f5e812fa33826b44;hpb=94864f7df42dc6495de1f785ec4ba45f33b63515;p=pspp diff --git a/src/ui/gui/psppire-output-view.c b/src/ui/gui/psppire-output-view.c index 3a7ce4d357..2f92b2696a 100644 --- a/src/ui/gui/psppire-output-view.c +++ b/src/ui/gui/psppire-output-view.c @@ -30,6 +30,7 @@ #include "output/group-item.h" #include "output/message-item.h" #include "output/output-item.h" +#include "output/output-item-provider.h" #include "output/table-item.h" #include "output/text-item.h" @@ -59,8 +60,7 @@ struct psppire_output_view struct string_map render_opts; GtkTreeView *overview; - GtkTreeIter cur_command; - bool in_command; + GtkTreePath *cur_group; GtkWidget *toplevel; @@ -245,6 +245,9 @@ rerender (struct psppire_output_view *view) if (view->y > 0) view->y += view->font_height / 2; + if (is_group_open_item (item->item)) + continue; + r = xr_rendering_create (view->xr, item->item, cr); if (r == NULL) { @@ -304,21 +307,21 @@ psppire_output_view_put (struct psppire_output_view *view, { struct output_view_item *view_item; GtkWidget *drawing_area; - struct xr_rendering *r; struct string name; - GtkTreeStore *store; cairo_t *cr = NULL; - GtkTreePath *path; - GtkTreeIter iter; int tw, th; if (is_group_close_item (item)) { - if (output_get_group_level () == 0) + if (view->cur_group) { - view->in_command = false; - return; + if (!gtk_tree_path_up (view->cur_group)) + { + gtk_tree_path_free (view->cur_group); + view->cur_group = NULL; + } } + return; } else if (is_text_item (item)) { @@ -335,7 +338,9 @@ psppire_output_view_put (struct psppire_output_view *view, view_item->item = output_item_ref (item); view_item->drawing_area = NULL; - if (gtk_widget_get_window (GTK_WIDGET (view->output))) + if (is_group_open_item (item)) + tw = th = 0; + else if (gtk_widget_get_window (GTK_WIDGET (view->output))) { view_item->drawing_area = drawing_area = gtk_drawing_area_new (); @@ -346,7 +351,7 @@ psppire_output_view_put (struct psppire_output_view *view, if (view->y > 0) view->y += view->font_height / 2; - r = xr_rendering_create (view->xr, item, cr); + struct xr_rendering *r = xr_rendering_create (view->xr, item, cr); if (r == NULL) goto done; @@ -357,29 +362,38 @@ psppire_output_view_put (struct psppire_output_view *view, else tw = th = 0; - if (view->overview - && (!is_text_item (item) - || text_item_get_type (to_text_item (item)) != TEXT_ITEM_SYNTAX - || !view->in_command)) + if (view->overview) { - store = GTK_TREE_STORE (gtk_tree_view_get_model (view->overview)); + GtkTreeStore *store = GTK_TREE_STORE ( + gtk_tree_view_get_model (view->overview)); ds_init_empty (&name); - if (is_group_open_item (item) && output_get_group_level () == 1) - { - gtk_tree_store_append (store, &iter, NULL); - view->cur_command = iter; /* XXX shouldn't save a GtkTreeIter */ - view->in_command = true; - } + + /* Create a new node in the tree and puts a reference to it in 'iter'. */ + GtkTreeIter iter; + GtkTreeIter parent; + if (view->cur_group + && gtk_tree_path_get_depth (view->cur_group) > 0 + && gtk_tree_model_get_iter (GTK_TREE_MODEL (store), + &parent, view->cur_group)) + gtk_tree_store_append (store, &iter, &parent); else + gtk_tree_store_append (store, &iter, NULL); + + if (is_group_open_item (item)) { - GtkTreeIter *p = view->in_command ? &view->cur_command : NULL; - gtk_tree_store_append (store, &iter, p); + gtk_tree_path_free (view->cur_group); + view->cur_group = gtk_tree_model_get_path (GTK_TREE_MODEL (store), + &iter); } ds_clear (&name); if (is_text_item (item)) - ds_put_cstr (&name, text_item_get_text (to_text_item (item))); + { + const struct text_item *text_item = to_text_item (item); + ds_put_cstr (&name, text_item_type_to_string ( + text_item_get_type (text_item))); + } else if (is_message_item (item)) { const struct message_item *msg_item = to_message_item (item); @@ -413,7 +427,8 @@ psppire_output_view_put (struct psppire_output_view *view, -1); ds_destroy (&name); - path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter); + GtkTreePath *path = gtk_tree_model_get_path ( + GTK_TREE_MODEL (store), &iter); gtk_tree_view_expand_row (view->overview, path, TRUE); gtk_tree_path_free (path); } @@ -704,8 +719,7 @@ psppire_output_view_new (GtkLayout *output, GtkTreeView *overview) view->y = 0; string_map_init (&view->render_opts); view->overview = overview; - memset (&view->cur_command, 0, sizeof view->cur_command); - view->in_command = false; + view->cur_group = NULL; view->toplevel = gtk_widget_get_toplevel (GTK_WIDGET (output)); view->items = NULL; view->n_items = view->allocated_items = 0;