1/* gtktreednd.h
2 * Copyright (C) 2001 Red Hat, Inc.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef __GTK_TREE_DND_H__
19#define __GTK_TREE_DND_H__
20
21#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
22#error "Only <gtk/gtk.h> can be included directly."
23#endif
24
25#include <gtk/gtktreemodel.h>
26#include <gtk/gtkdnd.h>
27
28G_BEGIN_DECLS
29
30#define GTK_TYPE_TREE_DRAG_SOURCE (gtk_tree_drag_source_get_type ())
31#define GTK_TREE_DRAG_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TREE_DRAG_SOURCE, GtkTreeDragSource))
32#define GTK_IS_TREE_DRAG_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TREE_DRAG_SOURCE))
33#define GTK_TREE_DRAG_SOURCE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GTK_TYPE_TREE_DRAG_SOURCE, GtkTreeDragSourceIface))
34
35typedef struct _GtkTreeDragSource GtkTreeDragSource; /* Dummy typedef */
36typedef struct _GtkTreeDragSourceIface GtkTreeDragSourceIface;
37
38/**
39 * GtkTreeDragSourceIface:
40 * @row_draggable: Asks the #GtkTreeDragSource whether a particular
41 * row can be used as the source of a DND operation.
42 * @drag_data_get: Asks the #GtkTreeDragSource to fill in
43 * selection_data with a representation of the row at path.
44 * @drag_data_delete: Asks the #GtkTreeDragSource to delete the row at
45 * path, because it was moved somewhere else via drag-and-drop.
46 */
47struct _GtkTreeDragSourceIface
48{
49 /*< private >*/
50 GTypeInterface g_iface;
51
52 /*< public >*/
53
54 /* VTable - not signals */
55
56 gboolean (* row_draggable) (GtkTreeDragSource *drag_source,
57 GtkTreePath *path);
58
59 gboolean (* drag_data_get) (GtkTreeDragSource *drag_source,
60 GtkTreePath *path,
61 GtkSelectionData *selection_data);
62
63 gboolean (* drag_data_delete) (GtkTreeDragSource *drag_source,
64 GtkTreePath *path);
65};
66
67GDK_AVAILABLE_IN_ALL
68GType gtk_tree_drag_source_get_type (void) G_GNUC_CONST;
69
70/* Returns whether the given row can be dragged */
71GDK_AVAILABLE_IN_ALL
72gboolean gtk_tree_drag_source_row_draggable (GtkTreeDragSource *drag_source,
73 GtkTreePath *path);
74
75/* Deletes the given row, or returns FALSE if it can't */
76GDK_AVAILABLE_IN_ALL
77gboolean gtk_tree_drag_source_drag_data_delete (GtkTreeDragSource *drag_source,
78 GtkTreePath *path);
79
80/* Fills in selection_data with type selection_data->target based on
81 * the row denoted by path, returns TRUE if it does anything
82 */
83GDK_AVAILABLE_IN_ALL
84gboolean gtk_tree_drag_source_drag_data_get (GtkTreeDragSource *drag_source,
85 GtkTreePath *path,
86 GtkSelectionData *selection_data);
87
88#define GTK_TYPE_TREE_DRAG_DEST (gtk_tree_drag_dest_get_type ())
89#define GTK_TREE_DRAG_DEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TREE_DRAG_DEST, GtkTreeDragDest))
90#define GTK_IS_TREE_DRAG_DEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TREE_DRAG_DEST))
91#define GTK_TREE_DRAG_DEST_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GTK_TYPE_TREE_DRAG_DEST, GtkTreeDragDestIface))
92
93typedef struct _GtkTreeDragDest GtkTreeDragDest; /* Dummy typedef */
94typedef struct _GtkTreeDragDestIface GtkTreeDragDestIface;
95
96/**
97 * GtkTreeDragDestIface:
98 * @drag_data_received: Asks the #GtkTreeDragDest to insert a row
99 * before the path dest, deriving the contents of the row from
100 * selection_data.
101 * @row_drop_possible: Determines whether a drop is possible before
102 * the given dest_path, at the same depth as dest_path.
103 */
104struct _GtkTreeDragDestIface
105{
106 /*< private >*/
107 GTypeInterface g_iface;
108
109 /*< public >*/
110
111 /* VTable - not signals */
112
113 gboolean (* drag_data_received) (GtkTreeDragDest *drag_dest,
114 GtkTreePath *dest,
115 GtkSelectionData *selection_data);
116
117 gboolean (* row_drop_possible) (GtkTreeDragDest *drag_dest,
118 GtkTreePath *dest_path,
119 GtkSelectionData *selection_data);
120};
121
122GDK_AVAILABLE_IN_ALL
123GType gtk_tree_drag_dest_get_type (void) G_GNUC_CONST;
124
125/* Inserts a row before dest which contains data in selection_data,
126 * or returns FALSE if it can't
127 */
128GDK_AVAILABLE_IN_ALL
129gboolean gtk_tree_drag_dest_drag_data_received (GtkTreeDragDest *drag_dest,
130 GtkTreePath *dest,
131 GtkSelectionData *selection_data);
132
133
134/* Returns TRUE if we can drop before path; path may not exist. */
135GDK_AVAILABLE_IN_ALL
136gboolean gtk_tree_drag_dest_row_drop_possible (GtkTreeDragDest *drag_dest,
137 GtkTreePath *dest_path,
138 GtkSelectionData *selection_data);
139
140
141/* The selection data would normally have target type GTK_TREE_MODEL_ROW in this
142 * case. If the target is wrong these functions return FALSE.
143 */
144GDK_AVAILABLE_IN_ALL
145gboolean gtk_tree_set_row_drag_data (GtkSelectionData *selection_data,
146 GtkTreeModel *tree_model,
147 GtkTreePath *path);
148GDK_AVAILABLE_IN_ALL
149gboolean gtk_tree_get_row_drag_data (GtkSelectionData *selection_data,
150 GtkTreeModel **tree_model,
151 GtkTreePath **path);
152
153G_END_DECLS
154
155#endif /* __GTK_TREE_DND_H__ */
156