aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/misc/e-reflow.c31
-rw-r--r--widgets/misc/e-reflow.h11
-rw-r--r--widgets/misc/e-selection-model.c62
-rw-r--r--widgets/misc/e-selection-model.h6
4 files changed, 83 insertions, 27 deletions
diff --git a/widgets/misc/e-reflow.c b/widgets/misc/e-reflow.c
index 88e9dc590a..735d965120 100644
--- a/widgets/misc/e-reflow.c
+++ b/widgets/misc/e-reflow.c
@@ -42,7 +42,7 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags);
static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item);
static void e_reflow_reflow (GnomeCanvasItem *item, int flags);
-static void e_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
+static void e_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item, gint *position);
static void set_empty(EReflow *e_reflow);
static void e_reflow_resize_children (GnomeCanvasItem *item);
@@ -109,17 +109,17 @@ e_reflow_class_init (EReflowClass *klass)
klass->add_item = e_reflow_real_add_item;
- object_class->set_arg = e_reflow_set_arg;
- object_class->get_arg = e_reflow_get_arg;
- object_class->destroy = e_reflow_destroy;
+ object_class->set_arg = e_reflow_set_arg;
+ object_class->get_arg = e_reflow_get_arg;
+ object_class->destroy = e_reflow_destroy;
/* GnomeCanvasItem method overrides */
- item_class->event = e_reflow_event;
- item_class->realize = e_reflow_realize;
- item_class->unrealize = e_reflow_unrealize;
- item_class->draw = e_reflow_draw;
- item_class->update = e_reflow_update;
- item_class->point = e_reflow_point;
+ item_class->event = e_reflow_event;
+ item_class->realize = e_reflow_realize;
+ item_class->unrealize = e_reflow_unrealize;
+ item_class->draw = e_reflow_draw;
+ item_class->update = e_reflow_update;
+ item_class->point = e_reflow_point;
}
static void
@@ -481,18 +481,19 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
}
static void
-e_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
+e_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item, gint *position)
{
e_reflow->items = g_list_append(e_reflow->items, item);
gtk_object_ref(GTK_OBJECT(item));
- if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
+ if (GTK_OBJECT_FLAGS (e_reflow) & GNOME_CANVAS_ITEM_REALIZED) {
gnome_canvas_item_set(item,
"width", (double) e_reflow->column_width,
NULL);
e_reflow_post_add_item(e_reflow, item);
e_canvas_item_request_reflow(item);
}
-
+ if (position)
+ *position = g_list_index(e_reflow->items, item);
}
static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
@@ -847,10 +848,10 @@ e_reflow_reflow( GnomeCanvasItem *item, int flags )
}
void
-e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
+e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item, gint *position)
{
if (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item)
- (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item) (e_reflow, item);
+ (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item) (e_reflow, item, position);
}
void
diff --git a/widgets/misc/e-reflow.h b/widgets/misc/e-reflow.h
index eb66b094a5..b4c1dcb372 100644
--- a/widgets/misc/e-reflow.h
+++ b/widgets/misc/e-reflow.h
@@ -89,7 +89,7 @@ struct _EReflowClass
GnomeCanvasGroupClass parent_class;
/* Virtual methods. */
- void (* add_item) (EReflow *reflow, GnomeCanvasItem *item);
+ void (* add_item) (EReflow *reflow, GnomeCanvasItem *item, gint *position);
};
/*
@@ -98,11 +98,14 @@ struct _EReflowClass
* should also do an ECanvas parent reflow request if its size
* changes.
*/
-void e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-GtkType e_reflow_get_type (void);
+void e_reflow_add_item (EReflow *e_reflow,
+ GnomeCanvasItem *item,
+ gint *position);
+GtkType e_reflow_get_type (void);
/* Internal usage only: */
-void e_reflow_post_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
+void e_reflow_post_add_item (EReflow *e_reflow,
+ GnomeCanvasItem *item);
#ifdef __cplusplus
}
diff --git a/widgets/misc/e-selection-model.c b/widgets/misc/e-selection-model.c
index e1f558f1e0..de48bc3952 100644
--- a/widgets/misc/e-selection-model.c
+++ b/widgets/misc/e-selection-model.c
@@ -27,6 +27,7 @@
static GtkObjectClass *e_selection_model_parent_class;
+static void change_one_row(ESelectionModel *selection, int row, gboolean grow);
static void esm_select_single_row (ESelectionModel *selection, int row);
enum {
@@ -47,8 +48,8 @@ enum {
ARG_CURSOR_MODE,
};
-void
-e_selection_model_insert_row(ESelectionModel *esm, int row)
+static void
+e_selection_model_insert_row_real(ESelectionModel *esm, int row)
{
int box;
int i;
@@ -74,8 +75,8 @@ e_selection_model_insert_row(ESelectionModel *esm, int row)
esm->cursor_row ++;
}
-void
-e_selection_model_delete_row(ESelectionModel *esm, int row)
+static void
+e_selection_model_delete_row_real(ESelectionModel *esm, int row)
{
int box;
int i;
@@ -115,6 +116,51 @@ e_selection_model_delete_row(ESelectionModel *esm, int row)
esm->cursor_row --;
}
+void
+e_selection_model_delete_row(ESelectionModel *esm, int row)
+{
+ e_selection_model_delete_row_real(esm, row);
+ gtk_signal_emit(GTK_OBJECT(esm),
+ e_selection_model_signals [SELECTION_CHANGED]);
+ gtk_signal_emit(GTK_OBJECT(esm),
+ e_selection_model_signals [CURSOR_CHANGED], esm->cursor_row, esm->cursor_col);
+}
+
+void
+e_selection_model_insert_row(ESelectionModel *esm, int row)
+{
+ e_selection_model_insert_row_real(esm, row);
+ gtk_signal_emit(GTK_OBJECT(esm),
+ e_selection_model_signals [SELECTION_CHANGED]);
+ gtk_signal_emit(GTK_OBJECT(esm),
+ e_selection_model_signals [CURSOR_CHANGED], esm->cursor_row, esm->cursor_col);
+}
+
+/* FIXME: Implement this more efficiently. */
+void
+e_selection_model_move_row(ESelectionModel *esm, int old_row, int new_row)
+{
+ gint selected = e_selection_model_is_row_selected(esm, old_row);
+ gint cursor = esm->cursor_row == old_row;
+
+ e_selection_model_delete_row_real(esm, old_row);
+ e_selection_model_insert_row_real(esm, new_row);
+
+ if (selected) {
+ if (esm->mode == GTK_SELECTION_SINGLE)
+ esm_select_single_row (esm, new_row);
+ else
+ change_one_row(esm, new_row, TRUE);
+ }
+ if (cursor) {
+ esm->cursor_row = new_row;
+ }
+ gtk_signal_emit(GTK_OBJECT(esm),
+ e_selection_model_signals [SELECTION_CHANGED]);
+ gtk_signal_emit(GTK_OBJECT(esm),
+ e_selection_model_signals [CURSOR_CHANGED], esm->cursor_row, esm->cursor_col);
+}
+
inline static void
add_sorter(ESelectionModel *esm, ESorter *sorter)
{
@@ -288,7 +334,7 @@ gboolean
e_selection_model_is_row_selected (ESelectionModel *selection,
gint n)
{
- if (selection->row_count < n)
+ if (selection->row_count < n || selection->row_count == 0)
return 0;
else
return (selection->selection[BOX(n)] >> OFFSET(n)) & 0x1;
@@ -451,9 +497,9 @@ esm_set_selection_end (ESelectionModel *selection, int row)
*/
void
e_selection_model_do_something (ESelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state)
+ guint row,
+ guint col,
+ GdkModifierType state)
{
gint shift_p = state & GDK_SHIFT_MASK;
gint ctrl_p = state & GDK_CONTROL_MASK;
diff --git a/widgets/misc/e-selection-model.h b/widgets/misc/e-selection-model.h
index 564a3e6e50..74cbcb50d2 100644
--- a/widgets/misc/e-selection-model.h
+++ b/widgets/misc/e-selection-model.h
@@ -65,6 +65,7 @@ typedef struct {
} ESelectionModelClass;
GtkType e_selection_model_get_type (void);
+
gboolean e_selection_model_is_row_selected (ESelectionModel *selection,
gint n);
void e_selection_model_foreach (ESelectionModel *selection,
@@ -84,10 +85,15 @@ void e_selection_model_clear (ESelectionModel *selection);
gint e_selection_model_selected_count (ESelectionModel *selection);
void e_selection_model_select_all (ESelectionModel *selection);
void e_selection_model_invert_selection (ESelectionModel *selection);
+
+/* Private Functions */
void e_selection_model_insert_row (ESelectionModel *esm,
int row);
void e_selection_model_delete_row (ESelectionModel *esm,
int row);
+void e_selection_model_move_row (ESelectionModel *esm,
+ int old_row,
+ int new_row);
/* Virtual Function */
gint e_selection_model_get_row_count (ESelectionModel *esm);