#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
+#include <gdk/gdkkeysyms-compat.h>
#include <string.h>
#include "ui/gui/psppire-marshal.h"
static void pspp_sheet_view_search_disable_popdown (GtkEntry *entry,
GtkMenu *menu,
gpointer data);
+#if GTK3_TRANSITION
static void pspp_sheet_view_search_preedit_changed (GtkIMContext *im_context,
PsppSheetView *tree_view);
+#endif
static void pspp_sheet_view_search_activate (GtkEntry *entry,
PsppSheetView *tree_view);
static gboolean pspp_sheet_view_real_search_enable_popdown(gpointer data);
GdkWindowAttr attributes;
gint attributes_mask;
GtkAllocation allocation;
+ GtkAllocation old_allocation;
gtk_widget_set_realized (widget, TRUE);
gtk_widget_get_allocation (widget, &allocation);
+ gtk_widget_get_allocation (widget, &old_allocation);
/* Make the main, clipping window */
attributes.window_type = GDK_WINDOW_CHILD;
attributes.height = allocation.height;
attributes.wclass = GDK_INPUT_OUTPUT;
attributes.visual = gtk_widget_get_visual (widget);
- attributes.colormap = gtk_widget_get_colormap (widget);
attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK;
- attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
gtk_widget_set_window (widget,
gdk_window_new (gtk_widget_get_parent_window (widget),
/* Make the window for the tree */
attributes.x = 0;
attributes.y = TREE_VIEW_HEADER_HEIGHT (tree_view);
- attributes.width = MAX (tree_view->priv->width, widget->allocation.width);
- attributes.height = widget->allocation.height;
+ attributes.width = MAX (tree_view->priv->width, old_allocation.width);
+ attributes.height = old_allocation.height;
attributes.event_mask = (GDK_EXPOSURE_MASK |
GDK_SCROLL_MASK |
GDK_POINTER_MOTION_MASK |
/* Make the column header window */
attributes.x = 0;
attributes.y = 0;
- attributes.width = MAX (tree_view->priv->width, widget->allocation.width);
+ attributes.width = MAX (tree_view->priv->width, old_allocation.width);
attributes.height = tree_view->priv->header_height;
attributes.event_mask = (GDK_EXPOSURE_MASK |
GDK_SCROLL_MASK |
gdk_window_set_user_data (tree_view->priv->header_window, widget);
/* Add them all up. */
- widget->style = gtk_style_attach (gtk_widget_get_style (widget), gtk_widget_get_window (widget));
- gdk_window_set_back_pixmap (gtk_widget_get_window (widget), NULL, FALSE);
+ gtk_widget_set_style (widget,
+ gtk_style_attach (gtk_widget_get_style (widget), gtk_widget_get_window (widget)));
gdk_window_set_background (tree_view->priv->bin_window, >k_widget_get_style (widget)->base[gtk_widget_get_state (widget)]);
gtk_style_set_background (gtk_widget_get_style (widget), tree_view->priv->header_window, GTK_STATE_NORMAL);
}
}
+
static void
prelight_or_select (PsppSheetView *tree_view,
int node,
tree_view->priv->rubber_band_end_node = end_node;
}
+#define GDK_RECTANGLE_PTR(X) ((GdkRectangle *)(X))
+
static void
pspp_sheet_view_update_rubber_band (PsppSheetView *tree_view)
{
gint x, y;
- GdkRectangle old_area;
- GdkRectangle new_area;
- GdkRectangle common;
- GdkRegion *invalid_region;
+ cairo_rectangle_int_t old_area;
+ cairo_rectangle_int_t new_area;
+ cairo_rectangle_int_t common;
+ cairo_region_t *invalid_region;
PsppSheetViewColumn *column;
old_area.x = MIN (tree_view->priv->press_start_x, tree_view->priv->rubber_band_x);
new_area.width = ABS (x - tree_view->priv->press_start_x) + 1;
new_area.height = ABS (y - tree_view->priv->press_start_y) + 1;
- invalid_region = gdk_region_rectangle (&old_area);
- gdk_region_union_with_rect (invalid_region, &new_area);
+ invalid_region = cairo_region_create_rectangle (&old_area);
+ cairo_region_union_rectangle (invalid_region, &new_area);
- gdk_rectangle_intersect (&old_area, &new_area, &common);
+ gdk_rectangle_intersect (GDK_RECTANGLE_PTR (&old_area),
+ GDK_RECTANGLE_PTR (&new_area), GDK_RECTANGLE_PTR (&common));
if (common.width > 2 && common.height > 2)
{
- GdkRegion *common_region;
+ cairo_region_t *common_region;
/* make sure the border is invalidated */
common.x += 1;
common.width -= 2;
common.height -= 2;
- common_region = gdk_region_rectangle (&common);
+ common_region = cairo_region_create_rectangle (&common);
- gdk_region_subtract (invalid_region, common_region);
- gdk_region_destroy (common_region);
+ cairo_region_subtract (invalid_region, common_region);
+ cairo_region_destroy (common_region);
}
- gdk_window_invalidate_region (tree_view->priv->bin_window, invalid_region, TRUE);
+#if GTK_MAJOR_VERSION == 3
+ gdk_window_invalidate_region (tree_view->priv->bin_window, invalid_region, TRUE);
+#else
+ {
+ cairo_rectangle_int_t extents;
+ GdkRegion *ereg;
+ cairo_region_get_extents (invalid_region, &extents);
+ ereg = gdk_region_rectangle (GDK_RECTANGLE_PTR (&extents));
+ gdk_window_invalidate_region (tree_view->priv->bin_window, ereg, TRUE);
+ gdk_region_destroy (ereg);
+ }
+#endif
- gdk_region_destroy (invalid_region);
+ cairo_region_destroy (invalid_region);
tree_view->priv->rubber_band_x = x;
tree_view->priv->rubber_band_y = y;
pspp_sheet_view_update_rubber_band_selection (tree_view);
}
+#if GTK3_TRANSITION
static void
pspp_sheet_view_paint_rubber_band (PsppSheetView *tree_view,
GdkRectangle *area)
cairo_t *cr;
GdkRectangle rect;
GdkRectangle rubber_rect;
+ GtkStyle *style;
return;
rubber_rect.x = MIN (tree_view->priv->press_start_x, tree_view->priv->rubber_band_x);
cr = gdk_cairo_create (tree_view->priv->bin_window);
cairo_set_line_width (cr, 1.0);
+ style = gtk_widget_get_style (GTK_WIDGET (tree_view));
cairo_set_source_rgba (cr,
- GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].red / 65535.,
- GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].green / 65535.,
- GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].blue / 65535.,
+ style->fg[GTK_STATE_NORMAL].red / 65535.,
+ style->fg[GTK_STATE_NORMAL].green / 65535.,
+ style->fg[GTK_STATE_NORMAL].blue / 65535.,
.25);
gdk_cairo_rectangle (cr, &rect);
cairo_paint (cr);
cairo_set_source_rgb (cr,
- GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].red / 65535.,
- GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].green / 65535.,
- GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].blue / 65535.);
+ style->fg[GTK_STATE_NORMAL].red / 65535.,
+ style->fg[GTK_STATE_NORMAL].green / 65535.,
+ style->fg[GTK_STATE_NORMAL].blue / 65535.);
cairo_rectangle (cr,
rubber_rect.x + 0.5, rubber_rect.y + 0.5,
cairo_destroy (cr);
}
+#endif
+
static gboolean
pspp_sheet_view_motion_bin_window (GtkWidget *widget,
* is empty.
*/
static void
-draw_empty_focus (PsppSheetView *tree_view, GdkRectangle *clip_area)
+draw_empty_focus (PsppSheetView *tree_view)
{
GtkWidget *widget = GTK_WIDGET (tree_view);
gint w, h;
+ cairo_t *cr = gdk_cairo_create (tree_view->priv->bin_window);
if (!gtk_widget_has_focus (widget))
return;
if (w > 0 && h > 0)
gtk_paint_focus (gtk_widget_get_style (widget),
- tree_view->priv->bin_window,
+ cr,
gtk_widget_get_state (widget),
- clip_area,
widget,
NULL,
1, 1, w, h);
+ cairo_destroy (cr);
}
static void
pspp_sheet_view_draw_vertical_grid_lines (PsppSheetView *tree_view,
- GdkEventExpose *event,
- gint n_visible_columns,
- gint min_y,
- gint max_y)
+ cairo_t *cr,
+ gint n_visible_columns,
+ gint min_y,
+ gint max_y)
{
GList *list = tree_view->priv->columns;
gint i = 0;
current_x += column->width;
- if (current_x - 1 >= event->area.x
- && current_x - 1 < event->area.x + event->area.width)
- {
-#if GTK3_TRANSITION
- gdk_draw_line (event->window,
- tree_view->priv->grid_line_gc[GTK_WIDGET(tree_view)->state],
- current_x - 1, min_y,
- current_x - 1, max_y - min_y);
-#else
-
- cairo_t *cr = gdk_cairo_create (event->window);
- cairo_set_line_width (cr, 1.0);
- cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
- cairo_move_to (cr, current_x - 0.5, min_y);
- cairo_line_to (cr, current_x - 0.5 , max_y - min_y);
-
- cairo_stroke (cr);
- cairo_destroy (cr);
-#endif
- }
+ cairo_set_line_width (cr, 1.0);
+ cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
+ cairo_move_to (cr, current_x - 0.5, min_y);
+ cairo_line_to (cr, current_x - 0.5 , max_y - min_y);
+
+ cairo_stroke (cr);
}
}
gboolean row_ending_details;
gboolean draw_vgrid_lines, draw_hgrid_lines;
gint min_y, max_y;
+ cairo_t *cr = gdk_cairo_create (event->window);
+ GdkRectangle Zarea;
+ GtkAllocation allocation;
+ gtk_widget_get_allocation (widget, &allocation);
+
+ Zarea.x = 0;
+ Zarea.y = 0;
+ Zarea.width = gdk_window_get_width (event->window);
+ Zarea.height = allocation.height;
rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
if (tree_view->priv->row_count == 0)
{
- draw_empty_focus (tree_view, &event->area);
+ draw_empty_focus (tree_view);
return TRUE;
}
+#if GTK3_TRANSITION
/* clip event->area to the visible area */
- if (event->area.height < 0.5)
+ if (Zarea.height < 0.5)
return TRUE;
+#endif
validate_visible_area (tree_view);
- new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, event->area.y);
+ new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, Zarea.y);
if (new_y < 0)
new_y = 0;
event->window,
gtk_widget_get_state (widget),
GTK_SHADOW_NONE,
- &event->area,
+ &Zarea,
widget,
"cell_even",
0, tree_view->priv->height,
cell_offset = 0;
- background_area.y = y_offset + event->area.y;
+ background_area.y = y_offset + Zarea.y;
background_area.height = max_height;
max_y = background_area.y + max_height;
else
selected_column = TRUE;
- if (cell_offset > event->area.x + event->area.width ||
- cell_offset + column->width < event->area.x)
+#if GTK3_TRANSITION
+ if (cell_offset > Zarea.x + Zarea.width ||
+ cell_offset + column->width < Zarea.x)
{
cell_offset += column->width;
continue;
}
+#endif
if (selected && selected_column)
flags |= GTK_CELL_RENDERER_SELECTED;
cell_area.height -= grid_line_width;
}
+#if GTK3_TRANSITION
if (gdk_region_rect_in (event->region, &background_area) == GDK_OVERLAP_RECTANGLE_OUT)
{
cell_offset += column->width;
continue;
}
+#endif
pspp_sheet_view_column_cell_set_cell_data (column,
tree_view->priv->model,
event->window,
state,
GTK_SHADOW_NONE,
- &event->area,
+ &Zarea,
widget,
new_detail,
background_area.x,
event->window,
state,
GTK_SHADOW_NONE,
- &event->area,
+ &Zarea,
widget,
detail,
background_area.x,
if (draw_hgrid_lines)
{
- cairo_t *cr = gdk_cairo_create (event->window);
cairo_set_line_width (cr, 1.0);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
#endif
}
- if (y_offset + max_height >= event->area.height - 0.5)
+ if (y_offset + max_height >= Zarea.height - 0.5)
{
#if GTK3_TRANSITION
gdk_draw_line (event->window,
#endif
}
cairo_stroke (cr);
- cairo_destroy (cr);
}
_pspp_sheet_view_column_cell_render (column,
- event->window,
+ cr,
&background_area,
&cell_area,
- &event->area,
flags);
if (node == cursor && has_special_cell &&
(column == tree_view->priv->edited_column)))
{
_pspp_sheet_view_column_cell_draw_focus (column,
- event->window,
+ cr,
&background_area,
&cell_area,
- &event->area,
flags);
}
cell_offset += column->width;
}
- if (cell_offset < event->area.x)
+ if (cell_offset < Zarea.x)
{
gtk_paint_flat_box (gtk_widget_get_style (widget),
event->window,
GTK_STATE_NORMAL,
GTK_SHADOW_NONE,
- &event->area,
+ &Zarea,
widget,
"base",
cell_offset,
background_area.y,
- event->area.x - cell_offset,
+ Zarea.x - cell_offset,
background_area.height);
}
gtk_paint_focus (gtk_widget_get_style (widget),
tree_view->priv->bin_window,
gtk_widget_get_state (widget),
- &event->area,
+ &Zarea,
widget,
(is_first
? (is_last ? "treeview-drop-indicator" : "treeview-drop-indicator-left" )
gtk_paint_focus (gtk_widget_get_style (widget),
tree_view->priv->bin_window,
gtk_widget_get_state (widget),
- &event->area,
+ &Zarea,
widget,
"treeview-drop-indicator",
0, BACKGROUND_FIRST_PIXEL (tree_view, node)
gtk_paint_focus (gtk_widget_get_style (widget),
tree_view->priv->bin_window,
focus_rect_state,
- &event->area,
+ &Zarea,
widget,
(is_first
? (is_last ? "treeview" : "treeview-left" )
gtk_paint_focus (gtk_widget_get_style (widget),
tree_view->priv->bin_window,
focus_rect_state,
- &event->area,
+ &Zarea,
widget,
"treeview",
0, tmp_y,
}
while (!done);
}
- while (y_offset < event->area.height);
+ while (y_offset < Zarea.height);
done:
- pspp_sheet_view_draw_vertical_grid_lines (tree_view, event, n_visible_columns,
+ pspp_sheet_view_draw_vertical_grid_lines (tree_view, cr, n_visible_columns,
min_y, max_y);
+#if GTK3_TRANSITION
if (tree_view->priv->rubber_band_status == RUBBER_BAND_ACTIVE)
{
GdkRectangle *rectangles;
g_free (rectangles);
}
+#endif
if (cursor_path)
gtk_tree_path_free (cursor_path);
GdkEventExpose *event)
{
PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
+ cairo_t *cr = gdk_cairo_create (event->window);
if (event->window == tree_view->priv->bin_window)
{
n_visible_columns ++;
}
pspp_sheet_view_draw_vertical_grid_lines (tree_view,
- event,
- n_visible_columns,
- event->area.y,
- event->area.height);
+ cr,
+ n_visible_columns,
+ event->area.y,
+ event->area.height);
}
else if (event->window == tree_view->priv->drag_window)
{
}
+
static void
pspp_sheet_view_drag_begin (GtkWidget *widget,
GdkDragContext *context)
{
+#if GTK3_TRANSITION
PsppSheetView *tree_view;
GtkTreePath *path = NULL;
gint cell_x, cell_y;
g_object_unref (row_pix);
gtk_tree_path_free (path);
+#endif
}
+
static void
pspp_sheet_view_drag_end (GtkWidget *widget,
GdkDragContext *context)
if (gtk_widget_get_realized (widget))
{
- gdk_window_set_back_pixmap (gtk_widget_get_window (widget), NULL, FALSE);
gdk_window_set_background (tree_view->priv->bin_window, >k_widget_get_style (widget)->base[gtk_widget_get_state (widget)]);
gtk_style_set_background (gtk_widget_get_style (widget), tree_view->priv->header_window, GTK_STATE_NORMAL);
pspp_sheet_view_set_grid_lines (tree_view, tree_view->priv->grid_lines);
attributes.width = column->allocation.width;
attributes.height = column->allocation.height;
attributes.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view));
- attributes.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view));
attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK;
- attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL ;
tree_view->priv->drag_window = gdk_window_new (tree_view->priv->bin_window,
&attributes,
const GdkRectangle *clip_rect)
{
GdkRectangle rect;
+ GtkAllocation allocation;
if (!gtk_widget_get_realized (GTK_WIDGET (tree_view)))
return;
+ gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
rect.x = 0;
- rect.width = MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width);
+ rect.width = MAX (tree_view->priv->width, allocation.width);
rect.y = BACKGROUND_FIRST_PIXEL (tree_view, node);
rect.height = ROW_HEIGHT (tree_view);
g_signal_connect (tree_view->priv->search_entry,
"activate", G_CALLBACK (pspp_sheet_view_search_activate),
tree_view);
+
+#if GTK3_TRANSITION
g_signal_connect (GTK_ENTRY (tree_view->priv->search_entry)->im_context,
"preedit-changed",
G_CALLBACK (pspp_sheet_view_search_preedit_changed),
tree_view);
+#endif
+
gtk_container_add (GTK_CONTAINER (vbox),
tree_view->priv->search_entry);
gpointer data)
{
ScrollData *scroll_data = data;
-
+ GtkAllocation allocation;
+ gtk_widget_get_allocation (widget, &allocation);
/* Need to really size allocate instead of just poking
* into widget->allocation if the widget is not realized.
* FIXME someone figure out why this was.
{
if (gtk_widget_get_visible (widget))
{
- GdkRectangle tmp_rectangle = widget->allocation;
+ GdkRectangle tmp_rectangle = allocation;
tmp_rectangle.x += scroll_data->dx;
tmp_rectangle.y += scroll_data->dy;
{
if (ALLOCATION_WINDOW (widget) == scroll_data->window)
{
- widget->allocation.x += scroll_data->dx;
- widget->allocation.y += scroll_data->dy;
+ allocation.x += scroll_data->dx;
+ allocation.y += scroll_data->dy;
if (GTK_IS_CONTAINER (widget))
gtk_container_forall (GTK_CONTAINER (widget),
gint x, y;
GList *list;
PsppSheetViewColumn *column;
+ GtkAllocation allocation;
g_return_if_fail (PSPP_IS_SHEET_VIEW (tree_view));
+ gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
+
headers_visible = !! headers_visible;
if (PSPP_SHEET_VIEW_FLAG_SET (tree_view, PSPP_SHEET_VIEW_HEADERS_VISIBLE) == headers_visible)
gdk_window_get_position (tree_view->priv->bin_window, &x, &y);
if (headers_visible)
{
- gdk_window_move_resize (tree_view->priv->bin_window, x, y + TREE_VIEW_HEADER_HEIGHT (tree_view), tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.height - + TREE_VIEW_HEADER_HEIGHT (tree_view));
+ gdk_window_move_resize (tree_view->priv->bin_window, x, y + TREE_VIEW_HEADER_HEIGHT (tree_view),
+ tree_view->priv->width, allocation.height - + TREE_VIEW_HEADER_HEIGHT (tree_view));
if (gtk_widget_get_mapped (GTK_WIDGET (tree_view)))
pspp_sheet_view_map_buttons (tree_view);
}
}
- gtk_adjustment_set_page_size (tree_view->priv->vadjustment, GTK_WIDGET (tree_view)->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view));
- gtk_adjustment_set_page_increment (tree_view->priv->vadjustment, (GTK_WIDGET (tree_view)->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view)) / 2);
+ gtk_adjustment_set_page_size (tree_view->priv->vadjustment, allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view));
+ gtk_adjustment_set_page_increment (tree_view->priv->vadjustment, (allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view)) / 2);
gtk_adjustment_set_lower (tree_view->priv->vadjustment, 0);
gtk_adjustment_set_upper (tree_view->priv->vadjustment, tree_view->priv->height);
gtk_adjustment_changed (tree_view->priv->vadjustment);
}
-
+#if GTK3_TRANSITION
/* KEEP IN SYNC WITH PSPP_SHEET_VIEW_BIN_EXPOSE */
/**
* pspp_sheet_view_create_row_drag_icon:
return drawable;
}
-
+#endif
/**
* pspp_sheet_view_set_destroy_count_func:
G_CALLBACK (pspp_sheet_view_search_enable_popdown), data);
}
+#if GTK3_TRANSITION
/* Because we're visible but offscreen, we just set a flag in the preedit
* callback.
*/
}
}
+#endif
static void
pspp_sheet_view_search_activate (GtkEntry *entry,
gtk_tree_path_free (path);
handled = gtk_binding_set_activate (edit_bindings, keyval, event->state,
- GTK_OBJECT (tree_view));
+ G_OBJECT (tree_view));
if (handled)
g_signal_stop_emission_by_name (widget, "event");
if (gtk_widget_get_realized (widget))
{
- gdk_window_set_back_pixmap (gtk_widget_get_window (widget), NULL, FALSE);
- gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[gtk_widget_get_state (widget)]);
+ GtkStyle *style = gtk_widget_get_style (widget);
+ gdk_window_set_background (tree_view->priv->bin_window, &style->base[gtk_widget_get_state (widget)]);
}
gtk_widget_queue_draw (widget);