- PsppSheetViewColumnReorder *reorder = tree_view->priv->cur_reorder;
- GtkWidget *widget = GTK_WIDGET (tree_view);
- GdkBitmap *mask = NULL;
- gint x;
- gint y;
- gint width;
- gint height;
- gint arrow_type = DRAG_COLUMN_WINDOW_STATE_UNSET;
- GdkWindowAttr attributes;
- guint attributes_mask;
-
- if (!reorder ||
- reorder->left_column == tree_view->priv->drag_column ||
- reorder->right_column == tree_view->priv->drag_column)
- arrow_type = DRAG_COLUMN_WINDOW_STATE_ORIGINAL;
- else if (reorder->left_column || reorder->right_column)
- {
- GdkRectangle visible_rect;
- pspp_sheet_view_get_visible_rect (tree_view, &visible_rect);
- if (reorder->left_column)
- x = reorder->left_column->allocation.x + reorder->left_column->allocation.width;
- else
- x = reorder->right_column->allocation.x;
-
- if (x < visible_rect.x)
- arrow_type = DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT;
- else if (x > visible_rect.x + visible_rect.width)
- arrow_type = DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT;
- else
- arrow_type = DRAG_COLUMN_WINDOW_STATE_ARROW;
- }
-
- /* We want to draw the rectangle over the initial location. */
- if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ORIGINAL)
- {
- GdkGC *gc;
- GdkColor col;
-
- if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ORIGINAL)
- {
- if (tree_view->priv->drag_highlight_window)
- {
- gdk_window_set_user_data (tree_view->priv->drag_highlight_window,
- NULL);
- gdk_window_destroy (tree_view->priv->drag_highlight_window);
- }
-
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.x = tree_view->priv->drag_column_x;
- attributes.y = 0;
- width = attributes.width = tree_view->priv->drag_column->allocation.width;
- height = attributes.height = tree_view->priv->drag_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;
- tree_view->priv->drag_highlight_window = gdk_window_new (tree_view->priv->header_window, &attributes, attributes_mask);
- gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
-
- mask = gdk_pixmap_new (tree_view->priv->drag_highlight_window, width, height, 1);
- gc = gdk_gc_new (mask);
- col.pixel = 1;
- gdk_gc_set_foreground (gc, &col);
- gdk_draw_rectangle (mask, gc, TRUE, 0, 0, width, height);
- col.pixel = 0;
- gdk_gc_set_foreground(gc, &col);
- gdk_draw_rectangle (mask, gc, TRUE, 2, 2, width - 4, height - 4);
- g_object_unref (gc);
-
- gdk_window_shape_combine_mask (tree_view->priv->drag_highlight_window,
- mask, 0, 0);
- if (mask) g_object_unref (mask);
- tree_view->priv->drag_column_window_state = DRAG_COLUMN_WINDOW_STATE_ORIGINAL;
- }
- }
- else if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW)
- {
- gint i, j = 1;
- GdkGC *gc;
- GdkColor col;
-
- width = tree_view->priv->expander_size;
-
- /* Get x, y, width, height of arrow */
- gdk_window_get_origin (tree_view->priv->header_window, &x, &y);
- if (reorder->left_column)
- {
- x += reorder->left_column->allocation.x + reorder->left_column->allocation.width - width/2;
- height = reorder->left_column->allocation.height;
- }
- else
- {
- x += reorder->right_column->allocation.x - width/2;
- height = reorder->right_column->allocation.height;
- }
- y -= tree_view->priv->expander_size/2; /* The arrow takes up only half the space */
- height += tree_view->priv->expander_size;
-
- /* Create the new window */
- if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW)
- {
- if (tree_view->priv->drag_highlight_window)
- {
- gdk_window_set_user_data (tree_view->priv->drag_highlight_window,
- NULL);
- gdk_window_destroy (tree_view->priv->drag_highlight_window);
- }
-
- attributes.window_type = GDK_WINDOW_TEMP;
- attributes.wclass = GDK_INPUT_OUTPUT;
- 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.x = x;
- attributes.y = y;
- attributes.width = width;
- attributes.height = height;
- tree_view->priv->drag_highlight_window = gdk_window_new (gtk_widget_get_root_window (widget),
- &attributes, attributes_mask);
- gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
-
- mask = gdk_pixmap_new (tree_view->priv->drag_highlight_window, width, height, 1);
- gc = gdk_gc_new (mask);
- col.pixel = 1;
- gdk_gc_set_foreground (gc, &col);
- gdk_draw_rectangle (mask, gc, TRUE, 0, 0, width, height);
-
- /* Draw the 2 arrows as per above */
- col.pixel = 0;
- gdk_gc_set_foreground (gc, &col);
- for (i = 0; i < width; i ++)
- {
- if (i == (width/2 - 1))
- continue;
- gdk_draw_line (mask, gc, i, j, i, height - j);
- if (i < (width/2 - 1))
- j++;
- else
- j--;
- }
- g_object_unref (gc);
- gdk_window_shape_combine_mask (tree_view->priv->drag_highlight_window,
- mask, 0, 0);
- if (mask) g_object_unref (mask);
- }
-
- tree_view->priv->drag_column_window_state = DRAG_COLUMN_WINDOW_STATE_ARROW;
- gdk_window_move (tree_view->priv->drag_highlight_window, x, y);
- }
- else if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT ||
- arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT)
- {
- gint i, j = 1;
- GdkGC *gc;
- GdkColor col;
-
- width = tree_view->priv->expander_size;
-
- /* Get x, y, width, height of arrow */
- width = width/2; /* remember, the arrow only takes half the available width */
- gdk_window_get_origin (widget->window, &x, &y);
- if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT)
- x += widget->allocation.width - width;
-
- if (reorder->left_column)
- height = reorder->left_column->allocation.height;
- else
- height = reorder->right_column->allocation.height;
-
- y -= tree_view->priv->expander_size;
- height += 2*tree_view->priv->expander_size;
-
- /* Create the new window */
- if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT &&
- tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT)
- {
- if (tree_view->priv->drag_highlight_window)
- {
- gdk_window_set_user_data (tree_view->priv->drag_highlight_window,
- NULL);
- gdk_window_destroy (tree_view->priv->drag_highlight_window);
- }
-
- attributes.window_type = GDK_WINDOW_TEMP;
- attributes.wclass = GDK_INPUT_OUTPUT;
- 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.x = x;
- attributes.y = y;
- attributes.width = width;
- attributes.height = height;
- tree_view->priv->drag_highlight_window = gdk_window_new (NULL, &attributes, attributes_mask);
- gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
-
- mask = gdk_pixmap_new (tree_view->priv->drag_highlight_window, width, height, 1);
- gc = gdk_gc_new (mask);
- col.pixel = 1;
- gdk_gc_set_foreground (gc, &col);
- gdk_draw_rectangle (mask, gc, TRUE, 0, 0, width, height);
-
- /* Draw the 2 arrows as per above */
- col.pixel = 0;
- gdk_gc_set_foreground (gc, &col);
- j = tree_view->priv->expander_size;
- for (i = 0; i < width; i ++)
- {
- gint k;
- if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT)
- k = width - i - 1;
- else
- k = i;
- gdk_draw_line (mask, gc, k, j, k, height - j);
- gdk_draw_line (mask, gc, k, 0, k, tree_view->priv->expander_size - j);
- gdk_draw_line (mask, gc, k, height, k, height - tree_view->priv->expander_size + j);
- j--;
- }
- g_object_unref (gc);
- gdk_window_shape_combine_mask (tree_view->priv->drag_highlight_window,
- mask, 0, 0);
- if (mask) g_object_unref (mask);
- }
-
- tree_view->priv->drag_column_window_state = arrow_type;
- gdk_window_move (tree_view->priv->drag_highlight_window, x, y);
- }
- else
- {
- g_warning (G_STRLOC"Invalid PsppSheetViewColumnReorder struct");
- gdk_window_hide (tree_view->priv->drag_highlight_window);
- return;
- }
-
- gdk_window_show (tree_view->priv->drag_highlight_window);
- gdk_window_raise (tree_view->priv->drag_highlight_window);