summaryrefslogtreecommitdiff
path: root/gtk/gtklabel.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2004-11-12 21:52:04 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2004-11-12 21:52:04 +0000
commitcb87aa11c9eb58c22dc19f054393ee71766a2d84 (patch)
tree02bdcfd11c0a34bd71008a641dd504ee6507b6aa /gtk/gtklabel.c
parent9e847e411f7c4891b998666b82fff5a2fd076960 (diff)
downloadgtk+-cb87aa11c9eb58c22dc19f054393ee71766a2d84.tar.gz
Implement DND for selectable labels.
2004-11-12 Matthias Clasen <mclasen@redhat.com> * gtk/gtklabel.c (gtk_label_button_press, gtk_label_button_release) (gtk_label_drag_data_get): Implement DND for selectable labels.
Diffstat (limited to 'gtk/gtklabel.c')
-rw-r--r--gtk/gtklabel.c129
1 files changed, 98 insertions, 31 deletions
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 769275f4f2..8c94d4db01 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -57,6 +57,11 @@ struct _GtkLabelSelectionInfo
gint selection_anchor;
gint selection_end;
GtkWidget *popup_menu;
+
+ gint drag_start_x;
+ gint drag_start_y;
+
+ guint in_drag : 1;
};
enum {
@@ -160,6 +165,12 @@ static gboolean gtk_label_mnemonic_activate (GtkWidget *widget,
gboolean group_cycling);
static void gtk_label_setup_mnemonic (GtkLabel *label,
guint last_key);
+static void gtk_label_drag_data_get (GtkWidget *widget,
+ GdkDragContext *context,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time);
+
/* For selectable lables: */
static void gtk_label_move_cursor (GtkLabel *label,
@@ -261,6 +272,7 @@ gtk_label_class_init (GtkLabelClass *class)
widget_class->hierarchy_changed = gtk_label_hierarchy_changed;
widget_class->screen_changed = gtk_label_screen_changed;
widget_class->mnemonic_activate = gtk_label_mnemonic_activate;
+ widget_class->drag_data_get = gtk_label_drag_data_get;
class->move_cursor = gtk_label_move_cursor;
class->copy_clipboard = gtk_label_copy_clipboard;
@@ -2497,12 +2509,14 @@ gtk_label_button_press (GtkWidget *widget,
{
GtkLabel *label;
gint index = 0;
+ gint min, max;
label = GTK_LABEL (widget);
if (label->select_info == NULL)
return FALSE;
+ label->select_info->in_drag = FALSE;
if (event->button == 1)
{
if (!GTK_WIDGET_HAS_FOCUS (widget))
@@ -2522,18 +2536,16 @@ gtk_label_button_press (GtkWidget *widget,
get_layout_index (label, event->x, event->y, &index);
+ min = MIN (label->select_info->selection_anchor,
+ label->select_info->selection_end);
+ max = MAX (label->select_info->selection_anchor,
+ label->select_info->selection_end);
+
if ((label->select_info->selection_anchor !=
label->select_info->selection_end) &&
(event->state & GDK_SHIFT_MASK))
{
- gint min, max;
-
/* extend (same as motion) */
- min = MIN (label->select_info->selection_anchor,
- label->select_info->selection_end);
- max = MAX (label->select_info->selection_anchor,
- label->select_info->selection_end);
-
min = MIN (min, index);
max = MAX (max, index);
@@ -2547,13 +2559,19 @@ gtk_label_button_press (GtkWidget *widget,
gtk_label_select_region_index (label, min, max);
}
- else
+ else
{
if (event->type == GDK_3BUTTON_PRESS)
- gtk_label_select_region_index (label, 0, strlen (label->text));
+ gtk_label_select_region_index (label, 0, strlen (label->text));
else if (event->type == GDK_2BUTTON_PRESS)
- gtk_label_select_word (label);
- else
+ gtk_label_select_word (label);
+ else if (min < max && min <= index && index <= max)
+ {
+ label->select_info->in_drag = TRUE;
+ label->select_info->drag_start_x = event->x;
+ label->select_info->drag_start_y = event->y;
+ }
+ else
/* start a replacement */
gtk_label_select_region_index (label, index, index);
}
@@ -2575,13 +2593,22 @@ gtk_label_button_release (GtkWidget *widget,
GdkEventButton *event)
{
- GtkLabel *label;
-
- label = GTK_LABEL (widget);
+ GtkLabel *label = GTK_LABEL (widget);
+ gint index;
if (label->select_info == NULL)
return FALSE;
+ if (label->select_info->in_drag)
+ {
+ label->select_info->in_drag = 0;
+
+ get_layout_index (label, event->x, event->y, &index);
+ gtk_label_select_region_index (label, index, index);
+
+ return FALSE;
+ }
+
if (event->button != 1)
return FALSE;
@@ -2605,18 +2632,45 @@ gtk_label_motion (GtkWidget *widget,
if (label->select_info == NULL)
return FALSE;
+
if ((event->state & GDK_BUTTON1_MASK) == 0)
return FALSE;
gdk_window_get_pointer (label->select_info->window,
&x, &y, NULL);
- get_layout_index (label, x, y, &index);
+ if (label->select_info->in_drag)
+ {
+ if (gtk_drag_check_threshold (widget,
+ label->select_info->drag_start_x,
+ label->select_info->drag_start_y,
+ event->x, event->y))
+ {
+ GdkDragContext *context;
+ GtkTargetList *target_list = gtk_target_list_new (NULL, 0);
+
+ gtk_target_list_add_text_targets (target_list, 0);
+
+ context = gtk_drag_begin (widget, target_list,
+ GDK_ACTION_COPY,
+ 1, (GdkEvent *)event);
+
+
+ label->select_info->in_drag = FALSE;
+
+ gtk_target_list_unref (target_list);
+ gtk_drag_set_icon_default (context);
+ }
+ }
+ else
+ {
+ get_layout_index (label, x, y, &index);
+
+ gtk_label_select_region_index (label,
+ label->select_info->selection_anchor,
+ index);
+ }
- gtk_label_select_region_index (label,
- label->select_info->selection_anchor,
- index);
-
return TRUE;
}
@@ -2753,15 +2807,9 @@ gtk_label_get_selectable (GtkLabel *label)
}
static void
-get_text_callback (GtkClipboard *clipboard,
- GtkSelectionData *selection_data,
- guint info,
- gpointer user_data_or_owner)
+gtk_label_set_selection_text (GtkLabel *label,
+ GtkSelectionData *selection_data)
{
- GtkLabel *label;
-
- label = GTK_LABEL (user_data_or_owner);
-
if ((label->select_info->selection_anchor !=
label->select_info->selection_end) &&
label->text)
@@ -2773,15 +2821,15 @@ get_text_callback (GtkClipboard *clipboard,
label->select_info->selection_end);
end = MAX (label->select_info->selection_anchor,
label->select_info->selection_end);
-
+
len = strlen (label->text);
-
+
if (end > len)
end = len;
-
+
if (start > len)
start = len;
-
+
gtk_selection_data_set_text (selection_data,
label->text + start,
end - start);
@@ -2789,6 +2837,25 @@ get_text_callback (GtkClipboard *clipboard,
}
static void
+gtk_label_drag_data_get (GtkWidget *widget,
+ GdkDragContext *context,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time)
+{
+ gtk_label_set_selection_text (GTK_LABEL (widget), selection_data);
+}
+
+static void
+get_text_callback (GtkClipboard *clipboard,
+ GtkSelectionData *selection_data,
+ guint info,
+ gpointer user_data_or_owner)
+{
+ gtk_label_set_selection_text (GTK_LABEL (user_data_or_owner), selection_data);
+}
+
+static void
clear_text_callback (GtkClipboard *clipboard,
gpointer user_data_or_owner)
{