* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+
+/*
+ * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GTK+ Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
#include <stdlib.h>
#include <string.h>
#include "config.h"
#include "gtkclist.h"
#include "gtkbindings.h"
#include "gtkdnd.h"
-#include <gdk/gdkx.h>
#include <gdk/gdkkeysyms.h>
/* length of button_actions array */
#define MAX_BUTTON 5
/* the number rows memchunk expands at a time */
-#define CLIST_OPTIMUM_SIZE 512
+#define CLIST_OPTIMUM_SIZE 64
/* the width of the column resize windows */
#define DRAG_WIDTH 6
return 0;
}
+/* returns the GList item for the nth row */
+#define ROW_ELEMENT(clist, row) (((row) == (clist)->rows - 1) ? \
+ (clist)->row_list_end : \
+ g_list_nth ((clist)->row_list, (row)))
+
+
#define GTK_CLIST_CLASS_FW(_widget_) GTK_CLIST_CLASS (((GtkObject*) (_widget_))->klass)
/* redraw the list if it's not frozen */
/* Signals */
-enum
-{
+enum {
SELECT_ROW,
UNSELECT_ROW,
ROW_MOVE,
LAST_SIGNAL
};
-enum
-{
+enum {
SYNC_REMOVE,
SYNC_INSERT
};
ARG_SHADOW_TYPE,
ARG_SELECTION_MODE,
ARG_ROW_HEIGHT,
+ ARG_TITLES_ACTIVE,
ARG_REORDERABLE,
- ARG_USE_DRAG_ICONS
+ ARG_USE_DRAG_ICONS,
+ ARG_SORT_TYPE
};
/* GtkCList Methods */
gint y,
GtkSelectionData *selection_data,
guint info,
- guint32 time);
+ guint time);
/* GtkContainer Methods */
static void gtk_clist_set_focus_child (GtkContainer *container,
GList *list,
gint num);
/* Misc */
-static gboolean title_focus (GtkCList *clist,
- gint dir);
-static void real_row_move (GtkCList *clist,
- gint source_row,
- gint dest_row);
+static gboolean title_focus (GtkCList *clist,
+ gint dir);
+static void real_row_move (GtkCList *clist,
+ gint source_row,
+ gint dest_row);
+static gint column_title_passive_func (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer data);
+static void drag_dest_cell (GtkCList *clist,
+ gint x,
+ gint y,
+ GtkCListDestInfo *dest_info);
GtkObjectClass *object_class;
GtkWidgetClass *widget_class;
GtkContainerClass *container_class;
+ GtkBindingSet *binding_set;
object_class = (GtkObjectClass *) klass;
widget_class = (GtkWidgetClass *) klass;
GTK_TYPE_BOOL,
GTK_ARG_READWRITE,
ARG_REORDERABLE);
+ gtk_object_add_arg_type ("GtkCList::titles_active",
+ GTK_TYPE_BOOL,
+ GTK_ARG_READWRITE,
+ ARG_TITLES_ACTIVE);
gtk_object_add_arg_type ("GtkCList::use_drag_icons",
GTK_TYPE_BOOL,
GTK_ARG_READWRITE,
ARG_USE_DRAG_ICONS);
-
+ gtk_object_add_arg_type ("GtkCList::sort_type",
+ GTK_TYPE_SORT_TYPE,
+ GTK_ARG_READWRITE,
+ ARG_SORT_TYPE);
object_class->set_arg = gtk_clist_set_arg;
object_class->get_arg = gtk_clist_get_arg;
object_class->destroy = gtk_clist_destroy;
klass->set_cell_contents = set_cell_contents;
klass->cell_size_request = cell_size_request;
- {
- GtkBindingSet *binding_set;
-
- binding_set = gtk_binding_set_by_class (klass);
- gtk_binding_entry_add_signal (binding_set, GDK_Up, 0,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Down, 0,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, 0,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, 0,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Home, GDK_CONTROL_MASK,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_End, GDK_CONTROL_MASK,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 1.0);
-
- gtk_binding_entry_add_signal (binding_set, GDK_Up, GDK_SHIFT_MASK,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_Down, GDK_SHIFT_MASK,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, GDK_SHIFT_MASK,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, GDK_SHIFT_MASK,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_Home,
- GDK_SHIFT_MASK | GDK_CONTROL_MASK,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_End,
- GDK_SHIFT_MASK | GDK_CONTROL_MASK,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE);
-
- gtk_binding_entry_add_signal (binding_set, GDK_Left, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Right, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Home, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_End, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 1.0);
-
- gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
- "undo_selection", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
- "abort_column_resize", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_space, 0,
- "toggle_focus_row", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK,
- "toggle_add_mode", 0);
- gtk_binding_entry_add_signal (binding_set, '/', GDK_CONTROL_MASK,
- "select_all", 0);
- gtk_binding_entry_add_signal (binding_set, '\\', GDK_CONTROL_MASK,
- "unselect_all", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_Shift_L,
- GDK_RELEASE_MASK | GDK_SHIFT_MASK,
- "end_selection", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
- GDK_RELEASE_MASK | GDK_SHIFT_MASK,
- "end_selection", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_Shift_L,
- GDK_RELEASE_MASK | GDK_SHIFT_MASK |
- GDK_CONTROL_MASK,
- "end_selection", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
- GDK_RELEASE_MASK | GDK_SHIFT_MASK |
- GDK_CONTROL_MASK,
- "end_selection", 0);
- }
-
- /*
- {
- GtkBindingSet *binding_set;
-
- binding_set = gtk_binding_set_by_class (klass);
- gtk_binding_entry_add_signal (binding_set, GDK_Up, 0,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Down, 0,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, 0,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, 0,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Home, GDK_CONTROL_MASK,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_End, GDK_CONTROL_MASK,
- "scroll_vertical", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 0);
-
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, 0,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Down, 0,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up, 0,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down, 0,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, 0,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_End, 0,
- "extend_selection", 3,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE);
-
- gtk_binding_entry_add_signal (binding_set, GDK_Left, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Right, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_Home, 0,
- "scroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal (binding_set, GDK_End, 0,
- "sroll_horizontal", 2,
- GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
- GTK_TYPE_FLOAT, 1.0);
-
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Divide, 0,
- "undo_selection", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
- "abort_column_resize", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_space, 0,
- "toggle_focus_row", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Multiply, 0,
- "toggle_add_mode", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, 0,
- "select_all", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, 0,
- "unselect_all", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0,
- "end_selection", 0);
- }
- */
+ binding_set = gtk_binding_set_by_class (klass);
+ gtk_binding_entry_add_signal (binding_set, GDK_Up, 0,
+ "scroll_vertical", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
+ GTK_TYPE_FLOAT, 0.0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Down, 0,
+ "scroll_vertical", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
+ GTK_TYPE_FLOAT, 0.0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, 0,
+ "scroll_vertical", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
+ GTK_TYPE_FLOAT, 0.0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, 0,
+ "scroll_vertical", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
+ GTK_TYPE_FLOAT, 0.0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Home, GDK_CONTROL_MASK,
+ "scroll_vertical", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+ GTK_TYPE_FLOAT, 0.0);
+ gtk_binding_entry_add_signal (binding_set, GDK_End, GDK_CONTROL_MASK,
+ "scroll_vertical", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+ GTK_TYPE_FLOAT, 1.0);
+
+ gtk_binding_entry_add_signal (binding_set, GDK_Up, GDK_SHIFT_MASK,
+ "extend_selection", 3,
+ GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
+ GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+ gtk_binding_entry_add_signal (binding_set, GDK_Down, GDK_SHIFT_MASK,
+ "extend_selection", 3,
+ GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
+ GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+ gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, GDK_SHIFT_MASK,
+ "extend_selection", 3,
+ GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
+ GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+ gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, GDK_SHIFT_MASK,
+ "extend_selection", 3,
+ GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
+ GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+ gtk_binding_entry_add_signal (binding_set, GDK_Home,
+ GDK_SHIFT_MASK | GDK_CONTROL_MASK,
+ "extend_selection", 3,
+ GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+ GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+ gtk_binding_entry_add_signal (binding_set, GDK_End,
+ GDK_SHIFT_MASK | GDK_CONTROL_MASK,
+ "extend_selection", 3,
+ GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+ GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE);
+
+ gtk_binding_entry_add_signal (binding_set, GDK_Left, 0,
+ "scroll_horizontal", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
+ GTK_TYPE_FLOAT, 0.0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Right, 0,
+ "scroll_horizontal", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
+ GTK_TYPE_FLOAT, 0.0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Home, 0,
+ "scroll_horizontal", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+ GTK_TYPE_FLOAT, 0.0);
+ gtk_binding_entry_add_signal (binding_set, GDK_End, 0,
+ "scroll_horizontal", 2,
+ GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+ GTK_TYPE_FLOAT, 1.0);
+
+ gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
+ "undo_selection", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
+ "abort_column_resize", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_space, 0,
+ "toggle_focus_row", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK,
+ "toggle_add_mode", 0);
+ gtk_binding_entry_add_signal (binding_set, '/', GDK_CONTROL_MASK,
+ "select_all", 0);
+ gtk_binding_entry_add_signal (binding_set, '\\', GDK_CONTROL_MASK,
+ "unselect_all", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Shift_L,
+ GDK_RELEASE_MASK | GDK_SHIFT_MASK,
+ "end_selection", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
+ GDK_RELEASE_MASK | GDK_SHIFT_MASK,
+ "end_selection", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Shift_L,
+ GDK_RELEASE_MASK | GDK_SHIFT_MASK |
+ GDK_CONTROL_MASK,
+ "end_selection", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
+ GDK_RELEASE_MASK | GDK_SHIFT_MASK |
+ GDK_CONTROL_MASK,
+ "end_selection", 0);
}
static void
case ARG_REORDERABLE:
gtk_clist_set_reorderable (clist, GTK_VALUE_BOOL (*arg));
break;
+ case ARG_TITLES_ACTIVE:
+ if (GTK_VALUE_BOOL (*arg))
+ gtk_clist_column_titles_active (clist);
+ else
+ gtk_clist_column_titles_passive (clist);
+ break;
case ARG_USE_DRAG_ICONS:
gtk_clist_set_use_drag_icons (clist, GTK_VALUE_BOOL (*arg));
break;
- default:
+ case ARG_SORT_TYPE:
+ gtk_clist_set_sort_type (clist, GTK_VALUE_ENUM (*arg));
break;
}
}
switch (arg_id)
{
+ guint i;
+
case ARG_N_COLUMNS:
GTK_VALUE_UINT (*arg) = clist->columns;
break;
case ARG_REORDERABLE:
GTK_VALUE_BOOL (*arg) = GTK_CLIST_REORDERABLE (clist);
break;
+ case ARG_TITLES_ACTIVE:
+ GTK_VALUE_BOOL (*arg) = TRUE;
+ for (i = 0; i < clist->columns; i++)
+ if (clist->column[i].button &&
+ !GTK_WIDGET_SENSITIVE (clist->column[i].button))
+ {
+ GTK_VALUE_BOOL (*arg) = FALSE;
+ break;
+ }
+ break;
case ARG_USE_DRAG_ICONS:
GTK_VALUE_BOOL (*arg) = GTK_CLIST_USE_DRAG_ICONS (clist);
break;
+ case ARG_SORT_TYPE:
+ GTK_VALUE_ENUM (*arg) = clist->sort_type;
+ break;
default:
arg->type = GTK_TYPE_INVALID;
break;
* gtk_clist_get_hadjustment
* gtk_clist_get_vadjustment
* gtk_clist_set_shadow_type
- * gtk_clist_set_border *** deprecated function ***
* gtk_clist_set_selection_mode
* gtk_clist_freeze
* gtk_clist_thaw
gtk_widget_queue_resize (GTK_WIDGET (clist));
}
-/* deprecated function, use gtk_clist_set_shadow_type instead. */
-void
-gtk_clist_set_border (GtkCList *clist,
- GtkShadowType border)
-{
- g_message ("gtk_clist_set_border() is deprecated");
-
- gtk_clist_set_shadow_type (clist, border);
-}
-
void
gtk_clist_set_selection_mode (GtkCList *clist,
GtkSelectionMode mode)
if (column < 0 || column >= clist->columns)
return;
- if (!clist->column[column].button)
+ if (!clist->column[column].button || !clist->column[column].button_passive)
return;
- if (!GTK_WIDGET_SENSITIVE (clist->column[column].button) ||
- !GTK_WIDGET_CAN_FOCUS (clist->column[column].button))
- {
- GTK_WIDGET_SET_FLAGS (clist->column[column].button,
- GTK_SENSITIVE | GTK_CAN_FOCUS);
- if (GTK_WIDGET_VISIBLE (clist))
- gtk_widget_queue_draw (clist->column[column].button);
- }
+ clist->column[column].button_passive = FALSE;
+
+ gtk_signal_disconnect_by_func (GTK_OBJECT (clist->column[column].button),
+ (GtkSignalFunc) column_title_passive_func,
+ NULL);
+
+ GTK_WIDGET_SET_FLAGS (clist->column[column].button, GTK_CAN_FOCUS);
+ if (GTK_WIDGET_VISIBLE (clist))
+ gtk_widget_queue_draw (clist->column[column].button);
}
void
gtk_clist_column_title_passive (GtkCList *clist,
gint column)
{
+ GtkButton *button;
+
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
if (column < 0 || column >= clist->columns)
return;
- if (!clist->column[column].button)
+ if (!clist->column[column].button || clist->column[column].button_passive)
return;
- if (GTK_WIDGET_SENSITIVE (clist->column[column].button) ||
- GTK_WIDGET_CAN_FOCUS (clist->column[column].button))
- {
- GTK_WIDGET_UNSET_FLAGS (clist->column[column].button,
- GTK_SENSITIVE | GTK_CAN_FOCUS);
- if (GTK_WIDGET_VISIBLE (clist))
- gtk_widget_queue_draw (clist->column[column].button);
- }
+ button = GTK_BUTTON (clist->column[column].button);
+
+ clist->column[column].button_passive = TRUE;
+
+ if (button->button_down)
+ gtk_button_released (button);
+ if (button->in_button)
+ gtk_button_leave (button);
+
+ gtk_signal_connect (GTK_OBJECT (clist->column[column].button), "event",
+ (GtkSignalFunc) column_title_passive_func, NULL);
+
+ GTK_WIDGET_UNSET_FLAGS (clist->column[column].button, GTK_CAN_FOCUS);
+ if (GTK_WIDGET_VISIBLE (clist))
+ gtk_widget_queue_draw (clist->column[column].button);
}
void
else
gtk_widget_hide (clist->column[column].button);
}
+
+ gtk_widget_queue_resize (GTK_WIDGET(clist));
}
void
gtk_clist_set_column_resizeable (GtkCList *clist,
gint column,
- gint resizeable)
+ gboolean resizeable)
{
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
* new_column_width
* column_button_create
* column_button_clicked
+ * column_title_passive_func
*/
static void
column_auto_resize (GtkCList *clist,
gint width = CELL_SPACING;
gint i;
- for (i = clist->columns - 1; i >= 0 && !clist->column[i].visible; i--)
- ;
-
- for (; i >= 0; i--)
+ for (i = clist->columns - 1; i >= 0; i--)
{
if (!clist->column[i].visible)
continue;
gint width;
gint cx;
gint dx;
+ gint last_column;
/* first translate the x position from widget->window
* to clist->clist_window */
cx = *x - xthickness;
+ for (last_column = clist->columns - 1;
+ last_column >= 0 && !clist->column[last_column].visible; last_column--);
+
/* calculate new column width making sure it doesn't end up
* less than the minimum width */
dx = (COLUMN_LEFT_XPIXEL (clist, column) + COLUMN_INSET +
- (column < clist->columns - 1) * CELL_SPACING);
+ (column < last_column) * CELL_SPACING);
width = cx - dx;
if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width))
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) column_button_clicked,
(gpointer) clist);
-
gtk_widget_show (button);
}
gtk_signal_emit (GTK_OBJECT (clist), clist_signals[CLICK_COLUMN], i);
}
-void
-gtk_clist_set_row_height (GtkCList *clist,
- guint height)
+static gint
+column_title_passive_func (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer data)
{
- GtkWidget *widget;
-
- g_return_if_fail (clist != NULL);
- g_return_if_fail (GTK_IS_CLIST (clist));
-
- widget = GTK_WIDGET (clist);
-
- if (height > 0)
- {
- clist->row_height = height;
- GTK_CLIST_SET_FLAG (clist, CLIST_ROW_HEIGHT_SET);
- }
- else
- {
- GTK_CLIST_UNSET_FLAG (clist, CLIST_ROW_HEIGHT_SET);
- clist->row_height = 0;
- }
-
- if (GTK_WIDGET_REALIZED (clist))
- {
- if (!GTK_CLIST_ROW_HEIGHT_SET(clist))
- {
- clist->row_height = (widget->style->font->ascent +
- widget->style->font->descent + 1);
- clist->row_center_offset = widget->style->font->ascent + 1.5;
- }
- else
- clist->row_center_offset = 1.5 + (clist->row_height +
- widget->style->font->ascent -
- widget->style->font->descent - 1) / 2;
+ g_return_val_if_fail (event != NULL, FALSE);
+
+ switch (event->type)
+ {
+ case GDK_MOTION_NOTIFY:
+ case GDK_BUTTON_PRESS:
+ case GDK_2BUTTON_PRESS:
+ case GDK_3BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ case GDK_ENTER_NOTIFY:
+ case GDK_LEAVE_NOTIFY:
+ return TRUE;
+ default:
+ break;
}
-
- CLIST_REFRESH (clist);
+ return FALSE;
}
-void
-gtk_clist_moveto (GtkCList *clist,
- gint row,
- gint column,
- gfloat row_align,
- gfloat col_align)
-{
- g_return_if_fail (clist != NULL);
- g_return_if_fail (GTK_IS_CLIST (clist));
-
- if (row < -1 || row >= clist->rows)
- return;
- if (column < -1 || column >= clist->columns)
- return;
-
- row_align = CLAMP (row_align, 0, 1);
- col_align = CLAMP (col_align, 0, 1);
-
- /* adjust horizontal scrollbar */
- if (clist->hadjustment && column >= 0)
- {
- gint x;
-
- x = (COLUMN_LEFT (clist, column) - CELL_SPACING - COLUMN_INSET -
- (col_align * (clist->clist_window_width - 2 * COLUMN_INSET -
- CELL_SPACING - clist->column[column].area.width)));
- if (x < 0)
- gtk_adjustment_set_value (clist->hadjustment, 0.0);
- else if (x > LIST_WIDTH (clist) - clist->clist_window_width)
- gtk_adjustment_set_value
- (clist->hadjustment, LIST_WIDTH (clist) - clist->clist_window_width);
- else
- gtk_adjustment_set_value (clist->hadjustment, x);
- }
-
- /* adjust vertical scrollbar */
- if (clist->vadjustment && row >= 0)
- move_vertical (clist, row, row_align);
-}
/* PUBLIC CELL FUNCTIONS
* gtk_clist_get_cell_type
if (column < 0 || column >= clist->columns)
return -1;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
return clist_row->cell[column].type;
}
if (column < 0 || column >= clist->columns)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
/* if text is null, then the cell is empty */
GTK_CLIST_CLASS_FW (clist)->set_cell_contents
if (column < 0 || column >= clist->columns)
return 0;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (clist_row->cell[column].type != GTK_CELL_TEXT)
return 0;
if (column < 0 || column >= clist->columns)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
gdk_pixmap_ref (pixmap);
if (column < 0 || column >= clist->columns)
return 0;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (clist_row->cell[column].type != GTK_CELL_PIXMAP)
return 0;
if (column < 0 || column >= clist->columns)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
gdk_pixmap_ref (pixmap);
if (mask) gdk_pixmap_ref (mask);
if (column < 0 || column >= clist->columns)
return 0;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (clist_row->cell[column].type != GTK_CELL_PIXTEXT)
return 0;
gint vertical,
gint horizontal)
{
- GtkRequisition requisition;
+ GtkRequisition requisition = { 0 };
GtkCListRow *clist_row;
g_return_if_fail (clist != NULL);
if (column < 0 || column >= clist->columns)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (clist->column[column].auto_resize &&
!GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
clist_row))->next;
else
clist->row_list = g_list_insert (clist->row_list, clist_row, row);
+
}
-
clist->rows++;
if (row < ROW_FROM_YPIXEL (clist, 0))
/* syncronize the selection list */
sync_selection (clist, row, SYNC_INSERT);
+ if (clist->rows == 1)
+ {
+ clist->focus_row = 0;
+ if (clist->selection_mode == GTK_SELECTION_BROWSE)
+ gtk_clist_select_row (clist, 0, -1);
+ }
+
/* redraw the list if it isn't frozen */
if (CLIST_UNFROZEN (clist))
{
was_selected = 0;
/* get the row we're going to delete */
- list = g_list_nth (clist->row_list, row);
+ list = ROW_ELEMENT (clist, row);
+ g_assert (list != NULL);
clist_row = list->data;
/* if we're removing a selected row, we have to make sure
gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW],
row, -1, NULL);
- /* reset the row end pointer if we're removing at the
- * end of the list */
+ /* reset the row end pointer if we're removing at the end of the list */
clist->rows--;
- clist->row_list = g_list_remove (clist->row_list, clist_row);
+ if (clist->row_list == list)
+ clist->row_list = g_list_next (list);
+ if (clist->row_list_end == list)
+ clist->row_list_end = g_list_previous (list);
+ g_list_remove (list, clist_row);
- if (row == clist->rows)
- clist->row_list_end = list->prev;
/*if (clist->focus_row >=0 &&
(row <= clist->focus_row || clist->focus_row >= clist->rows))
clist->focus_row--;*/
sync_selection (clist, row, SYNC_REMOVE);
- if ((clist->selection_mode == GTK_SELECTION_BROWSE ||
- clist->selection_mode == GTK_SELECTION_EXTENDED) && !clist->selection)
+ if (clist->selection_mode == GTK_SELECTION_BROWSE && !clist->selection &&
+ clist->focus_row >= 0)
gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
clist->focus_row, -1, NULL);
gtk_clist_freeze (clist);
/* unlink source row */
- clist_row = g_list_nth_data (clist->row_list, source_row);
+ clist_row = ROW_ELEMENT (clist, source_row)->data;
if (source_row == clist->rows - 1)
clist->row_list_end = clist->row_list_end->prev;
clist->row_list = g_list_remove (clist->row_list, clist_row);
}
/* PUBLIC ROW FUNCTIONS
+ * gtk_clist_moveto
+ * gtk_clist_set_row_height
* gtk_clist_set_row_data
* gtk_clist_set_row_data_full
* gtk_clist_get_row_data
* gtk_clist_set_foreground
* gtk_clist_set_background
*/
+void
+gtk_clist_moveto (GtkCList *clist,
+ gint row,
+ gint column,
+ gfloat row_align,
+ gfloat col_align)
+{
+ g_return_if_fail (clist != NULL);
+ g_return_if_fail (GTK_IS_CLIST (clist));
+
+ if (row < -1 || row >= clist->rows)
+ return;
+ if (column < -1 || column >= clist->columns)
+ return;
+
+ row_align = CLAMP (row_align, 0, 1);
+ col_align = CLAMP (col_align, 0, 1);
+
+ /* adjust horizontal scrollbar */
+ if (clist->hadjustment && column >= 0)
+ {
+ gint x;
+
+ x = (COLUMN_LEFT (clist, column) - CELL_SPACING - COLUMN_INSET -
+ (col_align * (clist->clist_window_width - 2 * COLUMN_INSET -
+ CELL_SPACING - clist->column[column].area.width)));
+ if (x < 0)
+ gtk_adjustment_set_value (clist->hadjustment, 0.0);
+ else if (x > LIST_WIDTH (clist) - clist->clist_window_width)
+ gtk_adjustment_set_value
+ (clist->hadjustment, LIST_WIDTH (clist) - clist->clist_window_width);
+ else
+ gtk_adjustment_set_value (clist->hadjustment, x);
+ }
+
+ /* adjust vertical scrollbar */
+ if (clist->vadjustment && row >= 0)
+ move_vertical (clist, row, row_align);
+}
+
+void
+gtk_clist_set_row_height (GtkCList *clist,
+ guint height)
+{
+ GtkWidget *widget;
+
+ g_return_if_fail (clist != NULL);
+ g_return_if_fail (GTK_IS_CLIST (clist));
+
+ widget = GTK_WIDGET (clist);
+
+ if (height > 0)
+ {
+ clist->row_height = height;
+ GTK_CLIST_SET_FLAG (clist, CLIST_ROW_HEIGHT_SET);
+ }
+ else
+ {
+ GTK_CLIST_UNSET_FLAG (clist, CLIST_ROW_HEIGHT_SET);
+ clist->row_height = 0;
+ }
+
+ if (GTK_WIDGET_REALIZED (clist))
+ {
+ if (!GTK_CLIST_ROW_HEIGHT_SET(clist))
+ {
+ clist->row_height = (widget->style->font->ascent +
+ widget->style->font->descent + 1);
+ clist->row_center_offset = widget->style->font->ascent + 1.5;
+ }
+ else
+ clist->row_center_offset = 1.5 + (clist->row_height +
+ widget->style->font->ascent -
+ widget->style->font->descent - 1) / 2;
+ }
+
+ CLIST_REFRESH (clist);
+}
+
void
gtk_clist_set_row_data (GtkCList *clist,
gint row,
if (row < 0 || row > (clist->rows - 1))
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
+
+ if (clist_row->destroy)
+ clist_row->destroy (clist_row->data);
+
clist_row->data = data;
clist_row->destroy = destroy;
}
if (row < 0 || row > (clist->rows - 1))
return NULL;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
return clist_row->data;
}
if (row < 0 || row >= clist->rows)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (color)
{
if (row < 0 || row >= clist->rows)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (color)
{
gint column,
GtkStyle *style)
{
- GtkRequisition requisition;
+ GtkRequisition requisition = { 0 };
GtkCListRow *clist_row;
g_return_if_fail (clist != NULL);
if (column < 0 || column >= clist->columns)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (clist_row->cell[column].style == style)
return;
if (row < 0 || row >= clist->rows || column < 0 || column >= clist->columns)
return NULL;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
return clist_row->cell[column].style;
}
if (row < 0 || row >= clist->rows)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (clist_row->style == style)
return;
if (row < 0 || row >= clist->rows)
return NULL;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
return clist_row->style;
}
if (row < 0 || row >= clist->rows)
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (selectable == clist_row->selectable)
return;
if (row < 0 || row >= clist->rows)
return FALSE;
- return GTK_CLIST_ROW (g_list_nth (clist->row_list, row))->selectable;
+ return GTK_CLIST_ROW (ROW_ELEMENT (clist, row))->selectable;
}
void
case GTK_SELECTION_EXTENDED:
case GTK_SELECTION_MULTIPLE:
case GTK_SELECTION_SINGLE:
- clist_row = g_list_nth (clist->row_list, row)->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (!clist_row)
return;
{
GList *work;
- work = g_list_nth (clist->row_list, row);
+ work = ROW_ELEMENT (clist, row);
if (!work || !GTK_CLIST_ROW (work)->selectable)
return;
break;
}
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (clist_row->state != GTK_STATE_NORMAL || !clist_row->selectable)
return;
if (row < 0 || row > (clist->rows - 1))
return;
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
if (clist_row->state == GTK_STATE_SELECTED)
{
GList *work;
gint i;
- if (row >= 0 && (work = g_list_nth (clist->row_list, row)))
+ if (row >= 0 && (work = ROW_ELEMENT (clist, row)))
{
if (GTK_CLIST_ROW (work)->state == GTK_STATE_NORMAL &&
GTK_CLIST_ROW (work)->selectable)
clist->undo_selection = clist->selection;
clist->selection = NULL;
clist->selection_end = NULL;
-
+
for (list = clist->undo_selection; list; list = list->next)
{
if ((i = GPOINTER_TO_INT (list->data)) == row ||
clist->selection_mode != GTK_SELECTION_EXTENDED)
return;
- if (clist->anchor >= 0)
- GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL);
+ GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL);
if (!(clist->undo_selection || clist->undo_unselection))
{
GPOINTER_TO_INT (work->data), -1, NULL);
for (work = clist->undo_unselection; work; work = work->next)
- gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW],
- GPOINTER_TO_INT (work->data), -1, NULL);
+ {
+ /* g_print ("unselect %d\n",GPOINTER_TO_INT (work->data)); */
+ gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW],
+ GPOINTER_TO_INT (work->data), -1, NULL);
+ }
if (GTK_WIDGET_HAS_FOCUS(clist) && clist->focus_row != clist->undo_anchor)
{
GList *list;
GtkCListRow *clist_row;
- if (clist->anchor < 0)
+ if (clist->selection_mode != GTK_SELECTION_EXTENDED)
+ return;
+
+ if (clist->anchor < 0 || clist->drag_pos < 0)
return;
gtk_clist_freeze (clist);
}
}
- for (list = g_list_nth (clist->row_list, i); i <= e; i++, list = list->next)
- if (GTK_CLIST_ROW (list)->selectable)
- {
- if (g_list_find (clist->selection, GINT_TO_POINTER(i)))
+ if (clist->anchor < clist->drag_pos)
+ {
+ for (list = g_list_nth (clist->row_list, i); i <= e;
+ i++, list = list->next)
+ if (GTK_CLIST_ROW (list)->selectable)
{
- if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL)
+ if (g_list_find (clist->selection, GINT_TO_POINTER(i)))
{
- GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED;
- gtk_signal_emit (GTK_OBJECT (clist),
- clist_signals[UNSELECT_ROW], i, -1, event);
- clist->undo_selection = g_list_prepend (clist->undo_selection,
- GINT_TO_POINTER (i));
+ if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL)
+ {
+ GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED;
+ gtk_signal_emit (GTK_OBJECT (clist),
+ clist_signals[UNSELECT_ROW],
+ i, -1, event);
+ clist->undo_selection =
+ g_list_prepend (clist->undo_selection,
+ GINT_TO_POINTER (i));
+ }
+ }
+ else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED)
+ {
+ GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL;
+ clist->undo_unselection =
+ g_list_prepend (clist->undo_unselection,
+ GINT_TO_POINTER (i));
}
}
- else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED)
+ }
+ else
+ {
+ for (list = g_list_nth (clist->row_list, e); i <= e;
+ e--, list = list->prev)
+ if (GTK_CLIST_ROW (list)->selectable)
{
- GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL;
- clist->undo_unselection = g_list_prepend (clist->undo_unselection,
- GINT_TO_POINTER (i));
+ if (g_list_find (clist->selection, GINT_TO_POINTER(e)))
+ {
+ if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL)
+ {
+ GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED;
+ gtk_signal_emit (GTK_OBJECT (clist),
+ clist_signals[UNSELECT_ROW],
+ e, -1, event);
+ clist->undo_selection =
+ g_list_prepend (clist->undo_selection,
+ GINT_TO_POINTER (e));
+ }
+ }
+ else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED)
+ {
+ GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL;
+ clist->undo_unselection =
+ g_list_prepend (clist->undo_unselection,
+ GINT_TO_POINTER (e));
+ }
}
- }
-
+ }
+
+ clist->undo_unselection = g_list_reverse (clist->undo_unselection);
for (list = clist->undo_unselection; list; list = list->next)
gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
GPOINTER_TO_INT (list->data), -1, event);
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
- if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_FOCUS(clist)) ||
- clist->anchor == -1)
+ if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_FOCUS(clist))
return;
-
+
GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL);
}
clist->focus_row = clist->rows - 1;
}
- if (clist->selection_mode == GTK_SELECTION_BROWSE && clist->anchor != -1)
- GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL);
+ GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL);
g_list_free (clist->undo_selection);
g_list_free (clist->undo_unselection);
/* We'll use this gc to do scrolling as well */
gdk_gc_set_exposures (clist->fg_gc, TRUE);
- values.foreground = widget->style->white;
+ values.foreground = (widget->style->white.pixel==0 ?
+ widget->style->black:widget->style->white);
values.function = GDK_XOR;
values.subwindow_mode = GDK_INCLUDE_INFERIORS;
clist->xor_gc = gdk_gc_new_with_values (widget->window,
/* freeze the list */
clist->freeze_count++;
- /* detach optional row/cell styles */
+ if (GTK_WIDGET_MAPPED (widget))
+ gtk_clist_unmap (widget);
+ GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
+
+ /* detach optional row/cell styles */
if (GTK_WIDGET_REALIZED (widget))
{
GtkCListRow *clist_row;
gdk_gc_destroy (clist->bg_gc);
for (i = 0; i < clist->columns; i++)
- if (clist->column[i].window)
- {
- gdk_window_set_user_data (clist->column[i].window, NULL);
- gdk_window_destroy (clist->column[i].window);
- clist->column[i].window = NULL;
- }
+ {
+ if (clist->column[i].button)
+ gtk_widget_unrealize (clist->column[i].button);
+ if (clist->column[i].window)
+ {
+ gdk_window_set_user_data (clist->column[i].window, NULL);
+ gdk_window_destroy (clist->column[i].window);
+ clist->column[i].window = NULL;
+ }
+ }
gdk_window_set_user_data (clist->clist_window, NULL);
gdk_window_destroy (clist->clist_window);
{
GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
- gdk_window_show (widget->window);
- gdk_window_show (clist->title_window);
- gdk_window_show (clist->clist_window);
-
/* map column buttons */
for (i = 0; i < clist->columns; i++)
- if (clist->column[i].button &&
- GTK_WIDGET_VISIBLE (clist->column[i].button) &&
- !GTK_WIDGET_MAPPED (clist->column[i].button))
- gtk_widget_map (clist->column[i].button);
+ {
+ if (clist->column[i].button &&
+ GTK_WIDGET_VISIBLE (clist->column[i].button) &&
+ !GTK_WIDGET_MAPPED (clist->column[i].button))
+ gtk_widget_map (clist->column[i].button);
+ }
- /* map resize windows AFTER column buttons (above) */
for (i = 0; i < clist->columns; i++)
if (clist->column[i].window && clist->column[i].button)
- gdk_window_show (clist->column[i].window);
-
+ {
+ gdk_window_raise (clist->column[i].window);
+ gdk_window_show (clist->column[i].window);
+ }
+
+ gdk_window_show (clist->title_window);
+ gdk_window_show (clist->clist_window);
+ gdk_window_show (widget->window);
+
/* unfreeze the list */
clist->freeze_count = 0;
}
{
GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
+ if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+ {
+ remove_grab (clist);
+
+ GTK_CLIST_CLASS_FW (widget)->resync_selection (clist, NULL);
+
+ clist->click_cell.row = -1;
+ clist->click_cell.column = -1;
+ clist->drag_button = 0;
+
+ if (GTK_CLIST_IN_DRAG(clist))
+ {
+ gpointer drag_data;
+
+ GTK_CLIST_UNSET_FLAG (clist, CLIST_IN_DRAG);
+ drag_data = gtk_object_get_data (GTK_OBJECT (clist),
+ "gtk-site-data");
+ if (drag_data)
+ gtk_signal_handler_unblock_by_data (GTK_OBJECT (clist),
+ drag_data);
+ }
+ }
+
for (i = 0; i < clist->columns; i++)
if (clist->column[i].window)
gdk_window_hide (clist->column[i].window);
(2 * widget->style->klass->ythickness) +
clist->column_title_area.height);
- gdk_window_clear_area (clist->clist_window, 0, 0, -1, -1);
+ gdk_window_clear_area (clist->clist_window, 0, 0, 0, 0);
draw_rows (clist, NULL);
for (i = 0; i < clist->columns; i++)
/* selections on the list */
if (event->window == clist->clist_window)
{
- if (clist->drag_button)
- return FALSE;
-
x = event->x;
y = event->y;
GDK_POINTER_MOTION_HINT_MASK |
GDK_BUTTON_RELEASE_MASK);
+ if (gdk_pointer_grab (clist->clist_window, FALSE, mask,
+ NULL, NULL, event->time))
+ return FALSE;
+ gtk_grab_add (widget);
+
clist->click_cell.row = row;
clist->click_cell.column = column;
-
clist->drag_button = event->button;
- gdk_pointer_grab (clist->clist_window, FALSE, mask,
- NULL, NULL, event->time);
- gtk_grab_add (widget);
}
else
{
- if (clist->click_cell.row >= 0 || clist->click_cell.column >= 0)
- return FALSE;
-
clist->click_cell.row = -1;
clist->click_cell.column = -1;
case GTK_SELECTION_SINGLE:
case GTK_SELECTION_MULTIPLE:
if (event->type != GDK_BUTTON_PRESS)
- gtk_signal_emit (GTK_OBJECT (clist),
- clist_signals[SELECT_ROW],
- row, column, event);
+ {
+ gtk_signal_emit (GTK_OBJECT (clist),
+ clist_signals[SELECT_ROW],
+ row, column, event);
+ clist->anchor = -1;
+ }
else
clist->anchor = row;
break;
if (clist->column[i].resizeable && clist->column[i].window &&
event->window == clist->column[i].window)
{
- gdk_pointer_grab (clist->column[i].window, FALSE,
- GDK_POINTER_MOTION_HINT_MASK |
- GDK_BUTTON1_MOTION_MASK |
- GDK_BUTTON_RELEASE_MASK,
- NULL, NULL, event->time);
+ gpointer drag_data;
+
+ if (gdk_pointer_grab (clist->column[i].window, FALSE,
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_BUTTON1_MOTION_MASK |
+ GDK_BUTTON_RELEASE_MASK,
+ NULL, NULL, event->time))
+ return FALSE;
+
gtk_grab_add (widget);
GTK_CLIST_SET_FLAG (clist, CLIST_IN_DRAG);
+ /* block attached dnd signal handler */
+ drag_data = gtk_object_get_data (GTK_OBJECT (clist), "gtk-site-data");
+ if (drag_data)
+ gtk_signal_handler_block_by_data (GTK_OBJECT (clist), drag_data);
+
if (!GTK_WIDGET_HAS_FOCUS(widget))
gtk_widget_grab_focus (widget);
/* release on resize windows */
if (GTK_CLIST_IN_DRAG(clist))
{
+ gpointer drag_data;
gint width;
gint x;
gint i;
i = clist->drag_pos;
clist->drag_pos = -1;
+ /* unblock attached dnd signal handler */
+ drag_data = gtk_object_get_data (GTK_OBJECT (clist), "gtk-site-data");
+ if (drag_data)
+ gtk_signal_handler_unblock_by_data (GTK_OBJECT (clist), drag_data);
+
GTK_CLIST_UNSET_FLAG (clist, CLIST_IN_DRAG);
gtk_widget_get_pointer (widget, &x, NULL);
gtk_grab_remove (widget);
{
case GTK_SELECTION_EXTENDED:
if (!(event->state & GDK_SHIFT_MASK) ||
+ !GTK_WIDGET_CAN_FOCUS (widget) ||
event->x < 0 || event->x >= clist->clist_window_width ||
event->y < 0 || event->y >= clist->clist_window_height)
GTK_CLIST_CLASS_FW (clist)->resync_selection
for (i = 0; i < clist->columns; i++)
if (clist->column[i].button)
{
+ GtkRequisition child_requisition;
+
gtk_widget_size_request (clist->column[i].button,
- &clist->column[i].button->requisition);
+ &child_requisition);
clist->column_title_area.height =
MAX (clist->column_title_area.height,
- clist->column[i].button->requisition.height);
+ child_requisition.height);
}
requisition->width += (widget->style->klass->xthickness +
gdk_draw_pixmap (window, fg_gc, pixmap, xsrc, ysrc, x, y, width, height);
gdk_gc_set_clip_origin (fg_gc, 0, 0);
+ if (mask)
+ gdk_gc_set_clip_mask (fg_gc, NULL);
return x + MAX (width, 0);
}
GdkRectangle cell_rectangle;
GdkRectangle clip_rectangle;
GdkRectangle intersect_rectangle;
+ gint last_column;
gint state;
gint i;
/* if the function is passed the pointer to the row instead of null,
* it avoids this expensive lookup */
if (!clist_row)
- clist_row = (g_list_nth (clist->row_list, row))->data;
+ clist_row = ROW_ELEMENT (clist, row)->data;
/* rectangle of the entire row */
row_rectangle.x = 0;
cell_rectangle.width = row_rectangle.width;
cell_rectangle.height = CELL_SPACING;
- /* rectangle used to clip drawing operations, it's y and height
+ /* rectangle used to clip drawing operations, its y and height
* positions only need to be set once, so we set them once here.
* the x and width are set withing the drawing loop below once per
* column */
intersect_rectangle.width,
intersect_rectangle.height);
- /* the last row has to clear it's bottom cell spacing too */
+ /* the last row has to clear its bottom cell spacing too */
if (clist_row == clist->row_list_end->data)
{
cell_rectangle.y += clist->row_height + CELL_SPACING;
cell_rectangle.width,
cell_rectangle.height);
- /* the last row has to clear it's bottom cell spacing too */
+ /* the last row has to clear its bottom cell spacing too */
if (clist_row == clist->row_list_end->data)
{
cell_rectangle.y += clist->row_height + CELL_SPACING;
}
}
+ for (last_column = clist->columns - 1;
+ last_column >= 0 && !clist->column[last_column].visible; last_column--)
+ ;
+
/* iterate and draw all the columns (row cells) and draw their contents */
for (i = 0; i < clist->columns; i++)
{
/* calculate clipping region clipping region */
clip_rectangle.x -= COLUMN_INSET + CELL_SPACING;
clip_rectangle.width += (2 * COLUMN_INSET + CELL_SPACING +
- (i + 1 == clist->columns) * CELL_SPACING);
+ (i == last_column) * CELL_SPACING);
if (area && !gdk_rectangle_intersect (area, &clip_rectangle,
&intersect_rectangle))
clip_rectangle.x += COLUMN_INSET + CELL_SPACING;
clip_rectangle.width -= (2 * COLUMN_INSET + CELL_SPACING +
- (i + 1 == clist->columns) * CELL_SPACING);
+ (i == last_column) * CELL_SPACING);
/* calculate real width for column justification */
pixmap_width = 0;
}
/* draw focus rectangle */
- if (clist->focus_row == row && GTK_WIDGET_HAS_FOCUS(widget))
+ if (clist->focus_row == row &&
+ GTK_WIDGET_CAN_FOCUS (widget) && GTK_WIDGET_HAS_FOCUS(widget))
{
if (!area)
gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE,
if (clist->rows == first_row)
first_row--;
- list = g_list_nth (clist->row_list, first_row);
+ list = ROW_ELEMENT (clist, first_row);
i = first_row;
while (list)
{
}
if (!area)
- gdk_window_clear_area (clist->clist_window,
- 0, ROW_TOP_YPIXEL (clist, i), -1, -1);
+ gdk_window_clear_area (clist->clist_window, 0,
+ ROW_TOP_YPIXEL (clist, i), 0, 0);
}
static void
clist->vadjustment->lower = 0;
clist->vadjustment->upper = LIST_HEIGHT (clist);
- if (clist->clist_window_height - clist->voffset > LIST_HEIGHT (clist))
+ if (clist->clist_window_height - clist->voffset > LIST_HEIGHT (clist) ||
+ (clist->voffset + (gint)clist->vadjustment->value) != 0)
{
clist->vadjustment->value = MAX (0, (LIST_HEIGHT (clist) -
clist->clist_window_height));
clist->hadjustment->lower = 0;
clist->hadjustment->upper = LIST_WIDTH (clist);
- if (clist->clist_window_width - clist->hoffset > LIST_WIDTH (clist))
+ if (clist->clist_window_width - clist->hoffset > LIST_WIDTH (clist) ||
+ (clist->hoffset + (gint)clist->hadjustment->value) != 0)
{
clist->hadjustment->value = MAX (0, (LIST_WIDTH (clist) -
clist->clist_window_width));
if (!block_resize && (!clist->vadjustment || !clist->hadjustment))
{
GtkWidget *widget;
+ GtkRequisition requisition;
widget = GTK_WIDGET (clist);
- gtk_widget_size_request (widget, &widget->requisition);
+ gtk_widget_size_request (widget, &requisition);
if ((!clist->hadjustment &&
- widget->requisition.width != widget->allocation.width) ||
+ requisition.width != widget->allocation.width) ||
(!clist->vadjustment &&
- widget->requisition.height != widget->allocation.height))
+ requisition.height != widget->allocation.height))
gtk_widget_queue_resize (widget);
}
}
return;
}
- if (GTK_WIDGET_HAS_FOCUS(clist) && !GTK_CLIST_CHILD_HAS_FOCUS(clist) &&
- GTK_CLIST_ADD_MODE(clist))
+ if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
+ !GTK_CLIST_CHILD_HAS_FOCUS(clist) && GTK_CLIST_ADD_MODE(clist))
{
y = ROW_TOP_YPIXEL (clist, clist->focus_row);
return;
}
- if (GTK_WIDGET_HAS_FOCUS(clist) && !GTK_CLIST_CHILD_HAS_FOCUS(clist) &&
- GTK_CLIST_ADD_MODE(clist))
+ if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
+ !GTK_CLIST_CHILD_HAS_FOCUS(clist) && GTK_CLIST_ADD_MODE(clist))
{
y = ROW_TOP_YPIXEL (clist, clist->focus_row);
check_exposures (clist);
- if (GTK_WIDGET_HAS_FOCUS(clist) && !GTK_CLIST_CHILD_HAS_FOCUS(clist))
+ if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
+ !GTK_CLIST_CHILD_HAS_FOCUS(clist))
{
if (GTK_CLIST_ADD_MODE(clist))
{
column[i].width_set = FALSE;
column[i].resizeable = TRUE;
column[i].auto_resize = FALSE;
+ column[i].button_passive = FALSE;
column[i].justification = GTK_JUSTIFY_LEFT;
}
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_CLIST (widget));
- if (!GTK_WIDGET_DRAWABLE (widget))
+ if (!GTK_WIDGET_DRAWABLE (widget) || !GTK_WIDGET_CAN_FOCUS (widget))
return;
clist = GTK_CLIST (widget);
clist = GTK_CLIST (widget);
- if (clist->anchor != -1 && clist->selection_mode == GTK_SELECTION_EXTENDED)
- GTK_CLIST_CLASS_FW (widget)->resync_selection (clist, (GdkEvent *) event);
+ GTK_CLIST_CLASS_FW (widget)->resync_selection (clist, (GdkEvent *) event);
return FALSE;
}
{
GtkWidget *focus_child;
gboolean return_val = FALSE;
+ gint last_column;
gint d = 1;
gint i = 0;
gint j;
return FALSE;
focus_child = GTK_CONTAINER (clist)->focus_child;
+
+ for (last_column = clist->columns - 1;
+ last_column >= 0 && !clist->column[last_column].visible; last_column--)
+ ;
switch (dir)
{
if (dir == GTK_DIR_UP)
i = COLUMN_FROM_XPIXEL (clist, 0);
else
- i = clist->columns - 1;
+ i = last_column;
focus_child = clist->column[i].button;
dir = GTK_DIR_TAB_FORWARD;
}
d = -1;
if (!focus_child)
{
- i = clist->columns - 1;
+ i = last_column;
focus_child = clist->column[i].button;
}
break;
else if (COLUMN_LEFT_XPIXEL(clist, j) + clist->column[j].area.width >
clist->clist_window_width)
{
- if (j == clist->columns-1)
+ if (j == last_column)
gtk_clist_moveto (clist, -1, j, 0, 0);
else
gtk_clist_moveto (clist, -1, j, 0, 1);
gfloat position)
{
gint column = 0;
+ gint last_column;
g_return_if_fail (clist != 0);
g_return_if_fail (GTK_IS_CLIST (clist));
if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
return;
+ for (last_column = clist->columns - 1;
+ last_column >= 0 && !clist->column[last_column].visible; last_column--)
+ ;
+
switch (scroll_type)
{
case GTK_SCROLL_STEP_BACKWARD:
column--;
break;
case GTK_SCROLL_STEP_FORWARD:
- column = COLUMN_FROM_XPIXEL (clist, clist->clist_window_width);
+ column = COLUMN_FROM_XPIXEL (clist, clist->clist_window_width);
if (column < 0)
return;
if (COLUMN_LEFT_XPIXEL (clist, column) +
clist->column[column].area.width +
CELL_SPACING + COLUMN_INSET - 1 <= clist->clist_window_width &&
- column < clist->columns - 1)
+ column < last_column)
column++;
break;
case GTK_SCROLL_PAGE_BACKWARD:
return;
case GTK_SCROLL_JUMP:
if (position >= 0 && position <= 1)
- column = position * (clist->columns - 1);
+ {
+ gint vis_columns = 0;
+ gint i;
+
+ for (i = 0; i <= last_column; i++)
+ if (clist->column[i].visible)
+ vis_columns++;
+
+ column = position * vis_columns;
+
+ for (i = 0; i <= last_column && column > 0; i++)
+ if (clist->column[i].visible)
+ column--;
+
+ column = i;
+ }
else
return;
break;
else if (COLUMN_LEFT_XPIXEL (clist, column) + CELL_SPACING + COLUMN_INSET - 1
+ clist->column[column].area.width > clist->clist_window_width)
{
- if (column == clist->columns - 1)
+ if (column == last_column)
gtk_clist_moveto (clist, -1, column, 0, 0);
else
gtk_clist_moveto (clist, -1, column, 0, 1);
static gint
horizontal_timeout (GtkCList *clist)
{
- gint x, y;
- GdkEventMotion event;
- GdkModifierType mask;
+ GdkEventMotion event = { 0 };
GDK_THREADS_ENTER ();
clist->htimer = 0;
- gdk_window_get_pointer (clist->clist_window, &x, &y, &mask);
- event.is_hint = 0;
- event.x = x;
- event.y = y;
- event.state = mask;
+ event.type = GDK_MOTION_NOTIFY;
+ event.send_event = TRUE;
gtk_clist_motion (GTK_WIDGET (clist), &event);
static gint
vertical_timeout (GtkCList *clist)
{
- gint x, y;
- GdkEventMotion event;
- GdkModifierType mask;
+ GdkEventMotion event = { 0 };
GDK_THREADS_ENTER ();
clist->vtimer = 0;
- gdk_window_get_pointer (clist->clist_window, &x, &y, &mask);
- event.is_hint = 0;
- event.x = x;
- event.y = y;
- event.state = mask;
+ event.type = GDK_MOTION_NOTIFY;
+ event.send_event = TRUE;
gtk_clist_motion (GTK_WIDGET (clist), &event);
static void
remove_grab (GtkCList *clist)
{
- if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+ if (GTK_WIDGET_HAS_GRAB (clist))
{
gtk_grab_remove (GTK_WIDGET (clist));
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
+ if (gdk_pointer_is_grabbed ())
+ gdk_pointer_ungrab (GDK_CURRENT_TIME);
}
if (clist->htimer)
g_free (info);
}
+static void
+drag_dest_cell (GtkCList *clist,
+ gint x,
+ gint y,
+ GtkCListDestInfo *dest_info)
+{
+ GtkWidget *widget;
+
+ widget = GTK_WIDGET (clist);
+
+ dest_info->insert_pos = GTK_CLIST_DRAG_NONE;
+
+ y -= (GTK_CONTAINER (clist)->border_width +
+ widget->style->klass->ythickness +
+ clist->column_title_area.height);
+
+ dest_info->cell.row = ROW_FROM_YPIXEL (clist, y);
+ if (dest_info->cell.row >= clist->rows)
+ {
+ dest_info->cell.row = clist->rows - 1;
+ y = ROW_TOP_YPIXEL (clist, dest_info->cell.row) + clist->row_height;
+ }
+ if (dest_info->cell.row < -1)
+ dest_info->cell.row = -1;
+
+ x -= GTK_CONTAINER (widget)->border_width + widget->style->klass->xthickness;
+ dest_info->cell.column = COLUMN_FROM_XPIXEL (clist, x);
+
+ if (dest_info->cell.row >= 0)
+ {
+ gint y_delta;
+ gint h = 0;
+
+ y_delta = y - ROW_TOP_YPIXEL (clist, dest_info->cell.row);
+
+ if (GTK_CLIST_DRAW_DRAG_RECT(clist))
+ {
+ dest_info->insert_pos = GTK_CLIST_DRAG_INTO;
+ h = clist->row_height / 4;
+ }
+ else if (GTK_CLIST_DRAW_DRAG_LINE(clist))
+ {
+ dest_info->insert_pos = GTK_CLIST_DRAG_BEFORE;
+ h = clist->row_height / 2;
+ }
+
+ if (GTK_CLIST_DRAW_DRAG_LINE(clist))
+ {
+ if (y_delta < h)
+ dest_info->insert_pos = GTK_CLIST_DRAG_BEFORE;
+ else if (clist->row_height - y_delta < h)
+ dest_info->insert_pos = GTK_CLIST_DRAG_AFTER;
+ }
+ }
+}
+
static void
gtk_clist_drag_begin (GtkWidget *widget,
GdkDragContext *context)
guint time)
{
GtkCList *clist;
- gint row, column;
+ GtkCListDestInfo new_info;
GtkCListDestInfo *dest_info;
- gint h = 0;
- gint insert_pos = GTK_CLIST_DRAG_NONE;
- gint y_delta;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
clist = GTK_CLIST (widget);
- y -= (GTK_CONTAINER (widget)->border_width +
- widget->style->klass->ythickness + clist->column_title_area.height);
- row = ROW_FROM_YPIXEL (clist, y);
-
- if (row >= clist->rows)
- {
- row = clist->rows - 1;
- y = ROW_TOP_YPIXEL (clist, row) + clist->row_height;
- }
- if (row < -1)
- row = -1;
-
- x -= GTK_CONTAINER (widget)->border_width + widget->style->klass->xthickness;
- column = COLUMN_FROM_XPIXEL (clist, x);
-
- if (row >= 0)
- {
- y_delta = y - ROW_TOP_YPIXEL (clist, row);
-
- if (GTK_CLIST_DRAW_DRAG_RECT(clist))
- {
- insert_pos = GTK_CLIST_DRAG_INTO;
- h = clist->row_height / 4;
- }
- else if (GTK_CLIST_DRAW_DRAG_LINE(clist))
- {
- insert_pos = GTK_CLIST_DRAG_BEFORE;
- h = clist->row_height / 2;
- }
-
- if (GTK_CLIST_DRAW_DRAG_LINE(clist))
- {
- if (y_delta < h)
- insert_pos = GTK_CLIST_DRAG_BEFORE;
- else if (clist->row_height - y_delta < h)
- insert_pos = GTK_CLIST_DRAG_AFTER;
- }
- }
-
dest_info = g_dataset_get_data (context, "gtk-clist-drag-dest");
if (!dest_info)
drag_dest_info_destroy);
}
+ drag_dest_cell (clist, x, y, &new_info);
+
if (GTK_CLIST_REORDERABLE (clist))
{
GList *list;
if (list)
{
if (gtk_drag_get_source_widget (context) != widget ||
- insert_pos == GTK_CLIST_DRAG_NONE ||
- row == clist->click_cell.row ||
- (row == clist->click_cell.row - 1 &&
- insert_pos == GTK_CLIST_DRAG_AFTER) ||
- (row == clist->click_cell.row + 1 &&
- insert_pos == GTK_CLIST_DRAG_BEFORE))
+ new_info.insert_pos == GTK_CLIST_DRAG_NONE ||
+ new_info.cell.row == clist->click_cell.row ||
+ (new_info.cell.row == clist->click_cell.row - 1 &&
+ new_info.insert_pos == GTK_CLIST_DRAG_AFTER) ||
+ (new_info.cell.row == clist->click_cell.row + 1 &&
+ new_info.insert_pos == GTK_CLIST_DRAG_BEFORE))
{
if (dest_info->cell.row < 0)
{
return TRUE;
}
- if (row != dest_info->cell.row ||
- (row == dest_info->cell.row &&
- dest_info->insert_pos != insert_pos))
+ if (new_info.cell.row != dest_info->cell.row ||
+ (new_info.cell.row == dest_info->cell.row &&
+ dest_info->insert_pos != new_info.insert_pos))
{
if (dest_info->cell.row >= 0)
GTK_CLIST_CLASS_FW (clist)->draw_drag_highlight
dest_info->cell.row)->data,
dest_info->cell.row, dest_info->insert_pos);
- dest_info->insert_pos = insert_pos;
- dest_info->cell.row = row;
- dest_info->cell.column = column;
+ dest_info->insert_pos = new_info.insert_pos;
+ dest_info->cell.row = new_info.cell.row;
+ dest_info->cell.column = new_info.cell.column;
GTK_CLIST_CLASS_FW (clist)->draw_drag_highlight
(clist, g_list_nth (clist->row_list,
}
}
- dest_info->insert_pos = insert_pos;
- dest_info->cell.row = row;
- dest_info->cell.column = column;
+ dest_info->insert_pos = new_info.insert_pos;
+ dest_info->cell.row = new_info.cell.row;
+ dest_info->cell.column = new_info.cell.column;
return TRUE;
}
gint y,
GtkSelectionData *selection_data,
guint info,
- guint32 time)
+ guint time)
{
GtkCList *clist;
selection_data->length == sizeof (GtkCListCellInfo))
{
GtkCListCellInfo *source_info;
- GtkCListDestInfo *dest_info;
source_info = (GtkCListCellInfo *)(selection_data->data);
- dest_info = g_dataset_get_data (context, "gtk-clist-drag-dest");
-
- if (dest_info && source_info)
+ if (source_info)
{
- if (dest_info->insert_pos == GTK_CLIST_DRAG_AFTER)
- dest_info->cell.row++;
- if (source_info->row < dest_info->cell.row)
- dest_info->cell.row--;
-
- if (dest_info->cell.row != source_info->row)
- gtk_clist_row_move (GTK_CLIST (widget),
- source_info->row,
- dest_info->cell.row);
+ GtkCListDestInfo dest_info;
+
+ drag_dest_cell (clist, x, y, &dest_info);
+
+ if (dest_info.insert_pos == GTK_CLIST_DRAG_AFTER)
+ dest_info.cell.row++;
+ if (source_info->row < dest_info.cell.row)
+ dest_info.cell.row--;
+ if (dest_info.cell.row != source_info->row)
+ gtk_clist_row_move (clist, source_info->row, dest_info.cell.row);
+
g_dataset_remove_data (context, "gtk-clist-drag-dest");
}
}
if (info)
{
- GtkCListCellInfo *ret_info;
+ GtkCListCellInfo ret_info;
- ret_info = g_new (GtkCListCellInfo, 1);
- ret_info->row = info->row;
- ret_info->column = info->column;
+ ret_info.row = info->row;
+ ret_info.column = info->column;
- gtk_selection_data_set (selection_data,
- selection_data->target,
- GTK_TYPE_POINTER,
- (guchar *) ret_info,
+ gtk_selection_data_set (selection_data, selection_data->target,
+ GTK_TYPE_POINTER, (guchar *) &ret_info,
sizeof (GtkCListCellInfo));
}
else
gtk_selection_data_set (selection_data, selection_data->target,
- GTK_TYPE_POINTER, NULL, 0);
+ GTK_TYPE_POINTER, NULL, 0);
}
}
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
- if (button <= MAX_BUTTON)
+ if (button < MAX_BUTTON)
{
if (gdk_pointer_is_grabbed () || GTK_WIDGET_HAS_GRAB (clist))
{
clist->drag_button = 0;
}
- if (clist->anchor >= 0 &&
- clist->selection_mode == GTK_SELECTION_EXTENDED)
- GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL);
+ GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL);
clist->button_actions[button] = button_actions;
}