- GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (view->output));
- GtkStateFlags state = gtk_widget_get_state_flags (GTK_WIDGET (view->output));
- GdkRGBA *fg_color;
-
- gtk_style_context_get (context, state,
- "font", &font_desc, "color", &fg_color, NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET (view->output)));
-
- /* Set the widget's text color as the foreground color for the output driver */
- /* gdk_rgba_to_string() would be perfect, but xr's parse_color does not */
- /* understand the rgb(255,128,33) format. Therefore we do it ourself. */
- fgc = xasprintf("#%4x%4x%4x",(int)(fg_color->red*0xffff),
- (int)(fg_color->green*0xffff),(int)(fg_color->blue*0xffff));
- string_map_insert (&view->render_opts, "foreground-color", fgc);
- g_free (fgc);
- gdk_rgba_free (fg_color);
-
- /* Use GTK+ default font as proportional font. */
- font_name = pango_font_description_to_string (font_desc);
- string_map_insert (&view->render_opts, "prop-font", font_name);
- g_free (font_name);
-
- /* Derived emphasized font from proportional font. */
- pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC);
- font_name = pango_font_description_to_string (font_desc);
- string_map_insert (&view->render_opts, "emph-font", font_name);
- g_free (font_name);
- pango_font_description_free (font_desc);
-
- /* Pretend that the "page" has a reasonable width and a very big length,
- so that most tables can be conveniently viewed on-screen with vertical
- scrolling only. (The length should not be increased very much because
- it is already close enough to INT_MAX when expressed as thousands of a
- point.) */
- string_map_insert_nocopy (&view->render_opts, xstrdup ("paper-size"),
- xasprintf ("%dx1000000pt", view->render_width));
- string_map_insert (&view->render_opts, "left-margin", "0");
- string_map_insert (&view->render_opts, "right-margin", "0");
- string_map_insert (&view->render_opts, "top-margin", "0");
- string_map_insert (&view->render_opts, "bottom-margin", "0");
-
- view->xr = xr_driver_create (cr, &view->render_opts);
-
- text_item = text_item_create (TEXT_ITEM_PARAGRAPH, "X");
- r = xr_rendering_create (view->xr, text_item_super (text_item), cr);
- xr_rendering_measure (r, &font_width, &view->font_height);
- text_item_unref (text_item);
-
- cairo_destroy (cr);
+static void
+clear_selection (struct psppire_output_view *view)
+{
+ if (view == NULL)
+ return;
+ struct output_view_item *item = find_selected_item (view);
+ if (item == NULL)
+ return;
+ set_copy_action (view, FALSE);
+ GtkWidget *widget = GTK_WIDGET (item->drawing_area);
+ if (GTK_IS_WIDGET (widget))
+ {
+ gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_SELECTED);
+ gtk_widget_queue_draw (widget);
+ }
+}
+
+static gboolean
+off_item_button_press_event_cb (GtkWidget *widget,
+ GdkEventButton *event,
+ struct psppire_output_view *view)
+{
+ /* buttontime is set by button_press_event_cb
+ If our event->time is equal to the time from the
+ button_press_event_cb, then we handle the same event.
+ In that case we must not clear the selection because
+ it was just set by button_press_event_cb from the item */
+ if (event->time != view->buttontime)
+ clear_selection (view);
+ return FALSE; /* Forward the event -> DragNDrop */
+}
+
+static gboolean
+button_press_event_cb (GtkWidget *widget,
+ GdkEventButton *event,
+ struct psppire_output_view *view)
+{
+ view->buttontime = event->time;
+ clear_selection (view);
+ set_copy_action (view, TRUE);
+ gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE);
+ gtk_widget_queue_draw (widget);
+ return FALSE; /* Forward Event -> off_item will trigger */
+}
+
+static void
+drag_data_get_cb (GtkWidget *widget, GdkDragContext *context,
+ GtkSelectionData *selection_data,
+ guint target_type, guint time,
+ struct psppire_output_view *view)
+{
+ view->selected_item = find_selected_item (view);
+ clipboard_get_cb (NULL, selection_data, target_type, view);