Added an arrow cursor for the draggable columns. Made the clickable column
2000-01-27 Christopher James Lahey <clahey@helixcode.com> * widgets/e-reflow.h, widgets/e-reflow.c: Added an arrow cursor for the draggable columns. Made the clickable column area larger. * widgets/e-text.h, widgets/e-text.c: Added an I beam cursor for the text item when it is editable. * widgets/e-minicard-label.c: Forward enter and leave notifications to the contained editable text item. svn path=/trunk/; revision=1647
This commit is contained in:
committed by
Chris Lahey
parent
eb1bc09da6
commit
bbcecaf6b7
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
||||
2000-01-27 Christopher James Lahey <clahey@helixcode.com>
|
||||
|
||||
* widgets/e-reflow.h, widgets/e-reflow.c: Added an arrow cursor
|
||||
for the draggable columns. Made the clickable column area
|
||||
larger.
|
||||
|
||||
* widgets/e-text.h, widgets/e-text.c: Added an I beam cursor for
|
||||
the text item when it is editable.
|
||||
|
||||
* widgets/e-minicard-label.c: Forward enter and leave
|
||||
notifications to the contained editable text item.
|
||||
|
||||
2000-01-26 Matt Loper <matt.loper@splashtech.com>
|
||||
|
||||
* camel/camel-formatter.c: By looking up a mimetype in a
|
||||
|
||||
@ -335,12 +335,14 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
break;
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
case GDK_MOTION_NOTIFY: {
|
||||
case GDK_MOTION_NOTIFY:
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY: {
|
||||
GnomeCanvasItem *field;
|
||||
ArtPoint p;
|
||||
double inv[6], affine[6];
|
||||
gboolean return_val;
|
||||
|
||||
|
||||
field = e_minicard_label->field;
|
||||
art_affine_identity (affine);
|
||||
|
||||
@ -354,26 +356,40 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
}
|
||||
|
||||
art_affine_invert (inv, affine);
|
||||
if (event->type == GDK_MOTION_NOTIFY) {
|
||||
switch(event->type) {
|
||||
case GDK_MOTION_NOTIFY:
|
||||
p.x = event->motion.x;
|
||||
p.y = event->motion.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->motion.x = p.x;
|
||||
event->motion.y = p.y;
|
||||
} else {
|
||||
break;
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
p.x = event->button.x;
|
||||
p.y = event->button.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->button.x = p.x;
|
||||
event->button.y = p.y;
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
p.x = event->crossing.x;
|
||||
p.y = event->crossing.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->crossing.x = p.x;
|
||||
event->crossing.y = p.y;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
gtk_signal_emit_by_name(GTK_OBJECT(e_minicard_label->field), "event", event, &return_val);
|
||||
return return_val;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event)
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include <gnome.h>
|
||||
#include <math.h>
|
||||
#include "e-reflow.h"
|
||||
#include "e-canvas-utils.h"
|
||||
static void e_reflow_init (EReflow *card);
|
||||
@ -132,6 +133,13 @@ e_reflow_init (EReflow *reflow)
|
||||
reflow->idle = 0;
|
||||
|
||||
reflow->column_drag = FALSE;
|
||||
|
||||
reflow->need_height_update = FALSE;
|
||||
reflow->need_column_resize = FALSE;
|
||||
|
||||
reflow->default_cursor_shown = TRUE;
|
||||
reflow->arrow_cursor = NULL;
|
||||
reflow->default_cursor = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -146,8 +154,7 @@ e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
||||
switch (arg_id){
|
||||
case ARG_HEIGHT:
|
||||
e_reflow->height = GTK_VALUE_DOUBLE (*arg);
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update (item);
|
||||
_queue_reflow(e_reflow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -185,6 +192,9 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
|
||||
(* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
|
||||
|
||||
e_reflow->arrow_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
|
||||
e_reflow->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
|
||||
|
||||
for(list = e_reflow->items; list; list = g_list_next(list)) {
|
||||
GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data);
|
||||
gtk_signal_connect(GTK_OBJECT(item),
|
||||
@ -196,7 +206,7 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
NULL);
|
||||
}
|
||||
|
||||
_update_reflow( e_reflow );
|
||||
_queue_reflow( e_reflow );
|
||||
|
||||
if (!item->canvas->aa) {
|
||||
}
|
||||
@ -213,6 +223,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
{
|
||||
}
|
||||
|
||||
gdk_cursor_destroy (e_reflow->arrow_cursor);
|
||||
gdk_cursor_destroy (e_reflow->default_cursor);
|
||||
|
||||
g_list_free (e_reflow->items);
|
||||
g_list_free (e_reflow->columns);
|
||||
|
||||
@ -221,9 +234,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
}
|
||||
|
||||
static gint
|
||||
e_reflow_pick_line (EReflow *e_reflow, gint x)
|
||||
e_reflow_pick_line (EReflow *e_reflow, double x)
|
||||
{
|
||||
x += 6;
|
||||
x += 9;
|
||||
x /= e_reflow->column_width + 16;
|
||||
return x;
|
||||
}
|
||||
@ -269,15 +282,23 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
case GDK_BUTTON_PRESS:
|
||||
{
|
||||
GdkEventButton *button = (GdkEventButton *) event;
|
||||
int n_x;
|
||||
double n_x;
|
||||
n_x = button->x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) {
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x);
|
||||
e_reflow->start_x = button->x;
|
||||
e_reflow->start_x = e_reflow->which_column_dragged * (e_reflow->column_width + 16) - 1;
|
||||
e_reflow->temp_column_width = e_reflow->column_width;
|
||||
e_reflow->column_drag = TRUE;
|
||||
|
||||
gnome_canvas_item_grab (item,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
|
||||
e_reflow->arrow_cursor,
|
||||
button->time);
|
||||
|
||||
e_reflow->previous_temp_column_width = -1;
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
return TRUE;
|
||||
}
|
||||
@ -294,8 +315,8 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width));
|
||||
e_reflow->column_width = e_reflow->temp_column_width;
|
||||
e_reflow->column_drag = FALSE;
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update(item);
|
||||
_queue_reflow(e_reflow);
|
||||
gnome_canvas_item_ungrab (item, button->time);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
@ -308,9 +329,58 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
(motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
|
||||
if (e_reflow->temp_column_width < 50)
|
||||
e_reflow->temp_column_width = 50;
|
||||
if (old_width != e_reflow->temp_column_width)
|
||||
if (old_width != e_reflow->temp_column_width) {
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
}
|
||||
return TRUE;
|
||||
} else {
|
||||
GdkEventMotion *motion = (GdkEventMotion *) event;
|
||||
double n_x;
|
||||
n_x = motion->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( motion->y >= 7 && motion->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
} else
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( !( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) ) {
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -344,7 +414,7 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
int x, int y, int width, int height)
|
||||
{
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
gint running_width;
|
||||
gdouble running_width;
|
||||
EReflow *e_reflow = E_REFLOW(item);
|
||||
int i;
|
||||
double column_width;
|
||||
@ -417,25 +487,73 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
static void
|
||||
e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
|
||||
{
|
||||
EReflow *e_reflow;
|
||||
double x0, x1, y0, y1;
|
||||
|
||||
e_reflow = E_REFLOW (item);
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update)
|
||||
GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags);
|
||||
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
if (e_reflow->need_height_update) {
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
|
||||
gnome_canvas_update_bbox(item, x0, y0, x1, y1);
|
||||
gnome_canvas_request_redraw(item->canvas, x0, y0, x1, y1);
|
||||
e_reflow->need_height_update = FALSE;
|
||||
} else if (e_reflow->need_column_resize) {
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
int start_line = e_reflow_pick_line(e_reflow,
|
||||
gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
|
||||
gdouble running_width;
|
||||
int i;
|
||||
double column_width;
|
||||
|
||||
if ( e_reflow->previous_temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->previous_temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
if ( e_reflow->temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
e_reflow->previous_temp_column_width = e_reflow->temp_column_width;
|
||||
e_reflow->need_column_resize = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static double
|
||||
@ -452,11 +570,11 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
return 0;
|
||||
|
||||
if (y >= 7 && y <= e_reflow->height - 7) {
|
||||
int n_x;
|
||||
float n_x;
|
||||
n_x = x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if (n_x < 4) {
|
||||
n_x += 9.0;
|
||||
n_x = fmod(n_x, (e_reflow->column_width + 16));
|
||||
if (n_x < 16.0) {
|
||||
*actual_item = item;
|
||||
return 0;
|
||||
}
|
||||
@ -467,7 +585,7 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
static void
|
||||
_reflow( EReflow *e_reflow )
|
||||
{
|
||||
int running_height;
|
||||
gdouble running_height;
|
||||
GList *list;
|
||||
double item_height;
|
||||
|
||||
@ -514,8 +632,8 @@ _update_reflow( EReflow *e_reflow )
|
||||
{
|
||||
if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
|
||||
|
||||
gint old_width;
|
||||
gint running_width;
|
||||
gdouble old_width;
|
||||
gdouble running_width;
|
||||
|
||||
_reflow (e_reflow);
|
||||
|
||||
@ -528,7 +646,7 @@ _update_reflow( EReflow *e_reflow )
|
||||
GList *list;
|
||||
GList *next_column;
|
||||
gdouble item_height;
|
||||
gint running_height;
|
||||
gdouble running_height;
|
||||
|
||||
running_height = 7;
|
||||
|
||||
@ -579,6 +697,8 @@ _idle_reflow(gpointer data)
|
||||
{
|
||||
EReflow *e_reflow = E_REFLOW(data);
|
||||
_update_reflow(e_reflow);
|
||||
e_reflow->need_height_update = TRUE;
|
||||
gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(e_reflow));
|
||||
e_reflow->idle = 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -71,6 +71,14 @@ struct _EReflow
|
||||
gdouble start_x;
|
||||
gint which_column_dragged;
|
||||
double temp_column_width;
|
||||
double previous_temp_column_width;
|
||||
|
||||
guint need_height_update : 1;
|
||||
guint need_column_resize : 1;
|
||||
|
||||
guint default_cursor_shown : 1;
|
||||
GdkCursor *arrow_cursor;
|
||||
GdkCursor *default_cursor;
|
||||
};
|
||||
|
||||
struct _EReflowClass
|
||||
|
||||
@ -335,12 +335,14 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
break;
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
case GDK_MOTION_NOTIFY: {
|
||||
case GDK_MOTION_NOTIFY:
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY: {
|
||||
GnomeCanvasItem *field;
|
||||
ArtPoint p;
|
||||
double inv[6], affine[6];
|
||||
gboolean return_val;
|
||||
|
||||
|
||||
field = e_minicard_label->field;
|
||||
art_affine_identity (affine);
|
||||
|
||||
@ -354,26 +356,40 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
}
|
||||
|
||||
art_affine_invert (inv, affine);
|
||||
if (event->type == GDK_MOTION_NOTIFY) {
|
||||
switch(event->type) {
|
||||
case GDK_MOTION_NOTIFY:
|
||||
p.x = event->motion.x;
|
||||
p.y = event->motion.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->motion.x = p.x;
|
||||
event->motion.y = p.y;
|
||||
} else {
|
||||
break;
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
p.x = event->button.x;
|
||||
p.y = event->button.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->button.x = p.x;
|
||||
event->button.y = p.y;
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
p.x = event->crossing.x;
|
||||
p.y = event->crossing.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->crossing.x = p.x;
|
||||
event->crossing.y = p.y;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
gtk_signal_emit_by_name(GTK_OBJECT(e_minicard_label->field), "event", event, &return_val);
|
||||
return return_val;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event)
|
||||
|
||||
@ -335,12 +335,14 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
break;
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
case GDK_MOTION_NOTIFY: {
|
||||
case GDK_MOTION_NOTIFY:
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY: {
|
||||
GnomeCanvasItem *field;
|
||||
ArtPoint p;
|
||||
double inv[6], affine[6];
|
||||
gboolean return_val;
|
||||
|
||||
|
||||
field = e_minicard_label->field;
|
||||
art_affine_identity (affine);
|
||||
|
||||
@ -354,26 +356,40 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
}
|
||||
|
||||
art_affine_invert (inv, affine);
|
||||
if (event->type == GDK_MOTION_NOTIFY) {
|
||||
switch(event->type) {
|
||||
case GDK_MOTION_NOTIFY:
|
||||
p.x = event->motion.x;
|
||||
p.y = event->motion.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->motion.x = p.x;
|
||||
event->motion.y = p.y;
|
||||
} else {
|
||||
break;
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
p.x = event->button.x;
|
||||
p.y = event->button.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->button.x = p.x;
|
||||
event->button.y = p.y;
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
p.x = event->crossing.x;
|
||||
p.y = event->crossing.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->crossing.x = p.x;
|
||||
event->crossing.y = p.y;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
gtk_signal_emit_by_name(GTK_OBJECT(e_minicard_label->field), "event", event, &return_val);
|
||||
return return_val;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event)
|
||||
|
||||
@ -335,12 +335,14 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
break;
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
case GDK_MOTION_NOTIFY: {
|
||||
case GDK_MOTION_NOTIFY:
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY: {
|
||||
GnomeCanvasItem *field;
|
||||
ArtPoint p;
|
||||
double inv[6], affine[6];
|
||||
gboolean return_val;
|
||||
|
||||
|
||||
field = e_minicard_label->field;
|
||||
art_affine_identity (affine);
|
||||
|
||||
@ -354,26 +356,40 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
}
|
||||
|
||||
art_affine_invert (inv, affine);
|
||||
if (event->type == GDK_MOTION_NOTIFY) {
|
||||
switch(event->type) {
|
||||
case GDK_MOTION_NOTIFY:
|
||||
p.x = event->motion.x;
|
||||
p.y = event->motion.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->motion.x = p.x;
|
||||
event->motion.y = p.y;
|
||||
} else {
|
||||
break;
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
p.x = event->button.x;
|
||||
p.y = event->button.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->button.x = p.x;
|
||||
event->button.y = p.y;
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
p.x = event->crossing.x;
|
||||
p.y = event->crossing.y;
|
||||
art_affine_point (&p, &p, inv);
|
||||
event->crossing.x = p.x;
|
||||
event->crossing.y = p.y;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
gtk_signal_emit_by_name(GTK_OBJECT(e_minicard_label->field), "event", event, &return_val);
|
||||
return return_val;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event)
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include <gnome.h>
|
||||
#include <math.h>
|
||||
#include "e-reflow.h"
|
||||
#include "e-canvas-utils.h"
|
||||
static void e_reflow_init (EReflow *card);
|
||||
@ -132,6 +133,13 @@ e_reflow_init (EReflow *reflow)
|
||||
reflow->idle = 0;
|
||||
|
||||
reflow->column_drag = FALSE;
|
||||
|
||||
reflow->need_height_update = FALSE;
|
||||
reflow->need_column_resize = FALSE;
|
||||
|
||||
reflow->default_cursor_shown = TRUE;
|
||||
reflow->arrow_cursor = NULL;
|
||||
reflow->default_cursor = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -146,8 +154,7 @@ e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
||||
switch (arg_id){
|
||||
case ARG_HEIGHT:
|
||||
e_reflow->height = GTK_VALUE_DOUBLE (*arg);
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update (item);
|
||||
_queue_reflow(e_reflow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -185,6 +192,9 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
|
||||
(* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
|
||||
|
||||
e_reflow->arrow_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
|
||||
e_reflow->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
|
||||
|
||||
for(list = e_reflow->items; list; list = g_list_next(list)) {
|
||||
GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data);
|
||||
gtk_signal_connect(GTK_OBJECT(item),
|
||||
@ -196,7 +206,7 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
NULL);
|
||||
}
|
||||
|
||||
_update_reflow( e_reflow );
|
||||
_queue_reflow( e_reflow );
|
||||
|
||||
if (!item->canvas->aa) {
|
||||
}
|
||||
@ -213,6 +223,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
{
|
||||
}
|
||||
|
||||
gdk_cursor_destroy (e_reflow->arrow_cursor);
|
||||
gdk_cursor_destroy (e_reflow->default_cursor);
|
||||
|
||||
g_list_free (e_reflow->items);
|
||||
g_list_free (e_reflow->columns);
|
||||
|
||||
@ -221,9 +234,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
}
|
||||
|
||||
static gint
|
||||
e_reflow_pick_line (EReflow *e_reflow, gint x)
|
||||
e_reflow_pick_line (EReflow *e_reflow, double x)
|
||||
{
|
||||
x += 6;
|
||||
x += 9;
|
||||
x /= e_reflow->column_width + 16;
|
||||
return x;
|
||||
}
|
||||
@ -269,15 +282,23 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
case GDK_BUTTON_PRESS:
|
||||
{
|
||||
GdkEventButton *button = (GdkEventButton *) event;
|
||||
int n_x;
|
||||
double n_x;
|
||||
n_x = button->x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) {
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x);
|
||||
e_reflow->start_x = button->x;
|
||||
e_reflow->start_x = e_reflow->which_column_dragged * (e_reflow->column_width + 16) - 1;
|
||||
e_reflow->temp_column_width = e_reflow->column_width;
|
||||
e_reflow->column_drag = TRUE;
|
||||
|
||||
gnome_canvas_item_grab (item,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
|
||||
e_reflow->arrow_cursor,
|
||||
button->time);
|
||||
|
||||
e_reflow->previous_temp_column_width = -1;
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
return TRUE;
|
||||
}
|
||||
@ -294,8 +315,8 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width));
|
||||
e_reflow->column_width = e_reflow->temp_column_width;
|
||||
e_reflow->column_drag = FALSE;
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update(item);
|
||||
_queue_reflow(e_reflow);
|
||||
gnome_canvas_item_ungrab (item, button->time);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
@ -308,9 +329,58 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
(motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
|
||||
if (e_reflow->temp_column_width < 50)
|
||||
e_reflow->temp_column_width = 50;
|
||||
if (old_width != e_reflow->temp_column_width)
|
||||
if (old_width != e_reflow->temp_column_width) {
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
}
|
||||
return TRUE;
|
||||
} else {
|
||||
GdkEventMotion *motion = (GdkEventMotion *) event;
|
||||
double n_x;
|
||||
n_x = motion->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( motion->y >= 7 && motion->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
} else
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( !( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) ) {
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -344,7 +414,7 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
int x, int y, int width, int height)
|
||||
{
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
gint running_width;
|
||||
gdouble running_width;
|
||||
EReflow *e_reflow = E_REFLOW(item);
|
||||
int i;
|
||||
double column_width;
|
||||
@ -417,25 +487,73 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
static void
|
||||
e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
|
||||
{
|
||||
EReflow *e_reflow;
|
||||
double x0, x1, y0, y1;
|
||||
|
||||
e_reflow = E_REFLOW (item);
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update)
|
||||
GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags);
|
||||
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
if (e_reflow->need_height_update) {
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
|
||||
gnome_canvas_update_bbox(item, x0, y0, x1, y1);
|
||||
gnome_canvas_request_redraw(item->canvas, x0, y0, x1, y1);
|
||||
e_reflow->need_height_update = FALSE;
|
||||
} else if (e_reflow->need_column_resize) {
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
int start_line = e_reflow_pick_line(e_reflow,
|
||||
gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
|
||||
gdouble running_width;
|
||||
int i;
|
||||
double column_width;
|
||||
|
||||
if ( e_reflow->previous_temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->previous_temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
if ( e_reflow->temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
e_reflow->previous_temp_column_width = e_reflow->temp_column_width;
|
||||
e_reflow->need_column_resize = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static double
|
||||
@ -452,11 +570,11 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
return 0;
|
||||
|
||||
if (y >= 7 && y <= e_reflow->height - 7) {
|
||||
int n_x;
|
||||
float n_x;
|
||||
n_x = x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if (n_x < 4) {
|
||||
n_x += 9.0;
|
||||
n_x = fmod(n_x, (e_reflow->column_width + 16));
|
||||
if (n_x < 16.0) {
|
||||
*actual_item = item;
|
||||
return 0;
|
||||
}
|
||||
@ -467,7 +585,7 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
static void
|
||||
_reflow( EReflow *e_reflow )
|
||||
{
|
||||
int running_height;
|
||||
gdouble running_height;
|
||||
GList *list;
|
||||
double item_height;
|
||||
|
||||
@ -514,8 +632,8 @@ _update_reflow( EReflow *e_reflow )
|
||||
{
|
||||
if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
|
||||
|
||||
gint old_width;
|
||||
gint running_width;
|
||||
gdouble old_width;
|
||||
gdouble running_width;
|
||||
|
||||
_reflow (e_reflow);
|
||||
|
||||
@ -528,7 +646,7 @@ _update_reflow( EReflow *e_reflow )
|
||||
GList *list;
|
||||
GList *next_column;
|
||||
gdouble item_height;
|
||||
gint running_height;
|
||||
gdouble running_height;
|
||||
|
||||
running_height = 7;
|
||||
|
||||
@ -579,6 +697,8 @@ _idle_reflow(gpointer data)
|
||||
{
|
||||
EReflow *e_reflow = E_REFLOW(data);
|
||||
_update_reflow(e_reflow);
|
||||
e_reflow->need_height_update = TRUE;
|
||||
gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(e_reflow));
|
||||
e_reflow->idle = 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -71,6 +71,14 @@ struct _EReflow
|
||||
gdouble start_x;
|
||||
gint which_column_dragged;
|
||||
double temp_column_width;
|
||||
double previous_temp_column_width;
|
||||
|
||||
guint need_height_update : 1;
|
||||
guint need_column_resize : 1;
|
||||
|
||||
guint default_cursor_shown : 1;
|
||||
GdkCursor *arrow_cursor;
|
||||
GdkCursor *default_cursor;
|
||||
};
|
||||
|
||||
struct _EReflowClass
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include <gnome.h>
|
||||
#include <math.h>
|
||||
#include "e-reflow.h"
|
||||
#include "e-canvas-utils.h"
|
||||
static void e_reflow_init (EReflow *card);
|
||||
@ -132,6 +133,13 @@ e_reflow_init (EReflow *reflow)
|
||||
reflow->idle = 0;
|
||||
|
||||
reflow->column_drag = FALSE;
|
||||
|
||||
reflow->need_height_update = FALSE;
|
||||
reflow->need_column_resize = FALSE;
|
||||
|
||||
reflow->default_cursor_shown = TRUE;
|
||||
reflow->arrow_cursor = NULL;
|
||||
reflow->default_cursor = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -146,8 +154,7 @@ e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
||||
switch (arg_id){
|
||||
case ARG_HEIGHT:
|
||||
e_reflow->height = GTK_VALUE_DOUBLE (*arg);
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update (item);
|
||||
_queue_reflow(e_reflow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -185,6 +192,9 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
|
||||
(* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
|
||||
|
||||
e_reflow->arrow_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
|
||||
e_reflow->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
|
||||
|
||||
for(list = e_reflow->items; list; list = g_list_next(list)) {
|
||||
GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data);
|
||||
gtk_signal_connect(GTK_OBJECT(item),
|
||||
@ -196,7 +206,7 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
NULL);
|
||||
}
|
||||
|
||||
_update_reflow( e_reflow );
|
||||
_queue_reflow( e_reflow );
|
||||
|
||||
if (!item->canvas->aa) {
|
||||
}
|
||||
@ -213,6 +223,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
{
|
||||
}
|
||||
|
||||
gdk_cursor_destroy (e_reflow->arrow_cursor);
|
||||
gdk_cursor_destroy (e_reflow->default_cursor);
|
||||
|
||||
g_list_free (e_reflow->items);
|
||||
g_list_free (e_reflow->columns);
|
||||
|
||||
@ -221,9 +234,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
}
|
||||
|
||||
static gint
|
||||
e_reflow_pick_line (EReflow *e_reflow, gint x)
|
||||
e_reflow_pick_line (EReflow *e_reflow, double x)
|
||||
{
|
||||
x += 6;
|
||||
x += 9;
|
||||
x /= e_reflow->column_width + 16;
|
||||
return x;
|
||||
}
|
||||
@ -269,15 +282,23 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
case GDK_BUTTON_PRESS:
|
||||
{
|
||||
GdkEventButton *button = (GdkEventButton *) event;
|
||||
int n_x;
|
||||
double n_x;
|
||||
n_x = button->x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) {
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x);
|
||||
e_reflow->start_x = button->x;
|
||||
e_reflow->start_x = e_reflow->which_column_dragged * (e_reflow->column_width + 16) - 1;
|
||||
e_reflow->temp_column_width = e_reflow->column_width;
|
||||
e_reflow->column_drag = TRUE;
|
||||
|
||||
gnome_canvas_item_grab (item,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
|
||||
e_reflow->arrow_cursor,
|
||||
button->time);
|
||||
|
||||
e_reflow->previous_temp_column_width = -1;
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
return TRUE;
|
||||
}
|
||||
@ -294,8 +315,8 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width));
|
||||
e_reflow->column_width = e_reflow->temp_column_width;
|
||||
e_reflow->column_drag = FALSE;
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update(item);
|
||||
_queue_reflow(e_reflow);
|
||||
gnome_canvas_item_ungrab (item, button->time);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
@ -308,9 +329,58 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
(motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
|
||||
if (e_reflow->temp_column_width < 50)
|
||||
e_reflow->temp_column_width = 50;
|
||||
if (old_width != e_reflow->temp_column_width)
|
||||
if (old_width != e_reflow->temp_column_width) {
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
}
|
||||
return TRUE;
|
||||
} else {
|
||||
GdkEventMotion *motion = (GdkEventMotion *) event;
|
||||
double n_x;
|
||||
n_x = motion->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( motion->y >= 7 && motion->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
} else
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( !( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) ) {
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -344,7 +414,7 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
int x, int y, int width, int height)
|
||||
{
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
gint running_width;
|
||||
gdouble running_width;
|
||||
EReflow *e_reflow = E_REFLOW(item);
|
||||
int i;
|
||||
double column_width;
|
||||
@ -417,25 +487,73 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
static void
|
||||
e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
|
||||
{
|
||||
EReflow *e_reflow;
|
||||
double x0, x1, y0, y1;
|
||||
|
||||
e_reflow = E_REFLOW (item);
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update)
|
||||
GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags);
|
||||
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
if (e_reflow->need_height_update) {
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
|
||||
gnome_canvas_update_bbox(item, x0, y0, x1, y1);
|
||||
gnome_canvas_request_redraw(item->canvas, x0, y0, x1, y1);
|
||||
e_reflow->need_height_update = FALSE;
|
||||
} else if (e_reflow->need_column_resize) {
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
int start_line = e_reflow_pick_line(e_reflow,
|
||||
gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
|
||||
gdouble running_width;
|
||||
int i;
|
||||
double column_width;
|
||||
|
||||
if ( e_reflow->previous_temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->previous_temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
if ( e_reflow->temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
e_reflow->previous_temp_column_width = e_reflow->temp_column_width;
|
||||
e_reflow->need_column_resize = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static double
|
||||
@ -452,11 +570,11 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
return 0;
|
||||
|
||||
if (y >= 7 && y <= e_reflow->height - 7) {
|
||||
int n_x;
|
||||
float n_x;
|
||||
n_x = x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if (n_x < 4) {
|
||||
n_x += 9.0;
|
||||
n_x = fmod(n_x, (e_reflow->column_width + 16));
|
||||
if (n_x < 16.0) {
|
||||
*actual_item = item;
|
||||
return 0;
|
||||
}
|
||||
@ -467,7 +585,7 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
static void
|
||||
_reflow( EReflow *e_reflow )
|
||||
{
|
||||
int running_height;
|
||||
gdouble running_height;
|
||||
GList *list;
|
||||
double item_height;
|
||||
|
||||
@ -514,8 +632,8 @@ _update_reflow( EReflow *e_reflow )
|
||||
{
|
||||
if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
|
||||
|
||||
gint old_width;
|
||||
gint running_width;
|
||||
gdouble old_width;
|
||||
gdouble running_width;
|
||||
|
||||
_reflow (e_reflow);
|
||||
|
||||
@ -528,7 +646,7 @@ _update_reflow( EReflow *e_reflow )
|
||||
GList *list;
|
||||
GList *next_column;
|
||||
gdouble item_height;
|
||||
gint running_height;
|
||||
gdouble running_height;
|
||||
|
||||
running_height = 7;
|
||||
|
||||
@ -579,6 +697,8 @@ _idle_reflow(gpointer data)
|
||||
{
|
||||
EReflow *e_reflow = E_REFLOW(data);
|
||||
_update_reflow(e_reflow);
|
||||
e_reflow->need_height_update = TRUE;
|
||||
gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(e_reflow));
|
||||
e_reflow->idle = 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -71,6 +71,14 @@ struct _EReflow
|
||||
gdouble start_x;
|
||||
gint which_column_dragged;
|
||||
double temp_column_width;
|
||||
double previous_temp_column_width;
|
||||
|
||||
guint need_height_update : 1;
|
||||
guint need_column_resize : 1;
|
||||
|
||||
guint default_cursor_shown : 1;
|
||||
GdkCursor *arrow_cursor;
|
||||
GdkCursor *default_cursor;
|
||||
};
|
||||
|
||||
struct _EReflowClass
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include <gnome.h>
|
||||
#include <math.h>
|
||||
#include "e-reflow.h"
|
||||
#include "e-canvas-utils.h"
|
||||
static void e_reflow_init (EReflow *card);
|
||||
@ -132,6 +133,13 @@ e_reflow_init (EReflow *reflow)
|
||||
reflow->idle = 0;
|
||||
|
||||
reflow->column_drag = FALSE;
|
||||
|
||||
reflow->need_height_update = FALSE;
|
||||
reflow->need_column_resize = FALSE;
|
||||
|
||||
reflow->default_cursor_shown = TRUE;
|
||||
reflow->arrow_cursor = NULL;
|
||||
reflow->default_cursor = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -146,8 +154,7 @@ e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
||||
switch (arg_id){
|
||||
case ARG_HEIGHT:
|
||||
e_reflow->height = GTK_VALUE_DOUBLE (*arg);
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update (item);
|
||||
_queue_reflow(e_reflow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -185,6 +192,9 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
|
||||
(* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
|
||||
|
||||
e_reflow->arrow_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
|
||||
e_reflow->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
|
||||
|
||||
for(list = e_reflow->items; list; list = g_list_next(list)) {
|
||||
GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data);
|
||||
gtk_signal_connect(GTK_OBJECT(item),
|
||||
@ -196,7 +206,7 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
NULL);
|
||||
}
|
||||
|
||||
_update_reflow( e_reflow );
|
||||
_queue_reflow( e_reflow );
|
||||
|
||||
if (!item->canvas->aa) {
|
||||
}
|
||||
@ -213,6 +223,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
{
|
||||
}
|
||||
|
||||
gdk_cursor_destroy (e_reflow->arrow_cursor);
|
||||
gdk_cursor_destroy (e_reflow->default_cursor);
|
||||
|
||||
g_list_free (e_reflow->items);
|
||||
g_list_free (e_reflow->columns);
|
||||
|
||||
@ -221,9 +234,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
}
|
||||
|
||||
static gint
|
||||
e_reflow_pick_line (EReflow *e_reflow, gint x)
|
||||
e_reflow_pick_line (EReflow *e_reflow, double x)
|
||||
{
|
||||
x += 6;
|
||||
x += 9;
|
||||
x /= e_reflow->column_width + 16;
|
||||
return x;
|
||||
}
|
||||
@ -269,15 +282,23 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
case GDK_BUTTON_PRESS:
|
||||
{
|
||||
GdkEventButton *button = (GdkEventButton *) event;
|
||||
int n_x;
|
||||
double n_x;
|
||||
n_x = button->x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) {
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x);
|
||||
e_reflow->start_x = button->x;
|
||||
e_reflow->start_x = e_reflow->which_column_dragged * (e_reflow->column_width + 16) - 1;
|
||||
e_reflow->temp_column_width = e_reflow->column_width;
|
||||
e_reflow->column_drag = TRUE;
|
||||
|
||||
gnome_canvas_item_grab (item,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
|
||||
e_reflow->arrow_cursor,
|
||||
button->time);
|
||||
|
||||
e_reflow->previous_temp_column_width = -1;
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
return TRUE;
|
||||
}
|
||||
@ -294,8 +315,8 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width));
|
||||
e_reflow->column_width = e_reflow->temp_column_width;
|
||||
e_reflow->column_drag = FALSE;
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update(item);
|
||||
_queue_reflow(e_reflow);
|
||||
gnome_canvas_item_ungrab (item, button->time);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
@ -308,9 +329,58 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
(motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
|
||||
if (e_reflow->temp_column_width < 50)
|
||||
e_reflow->temp_column_width = 50;
|
||||
if (old_width != e_reflow->temp_column_width)
|
||||
if (old_width != e_reflow->temp_column_width) {
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
}
|
||||
return TRUE;
|
||||
} else {
|
||||
GdkEventMotion *motion = (GdkEventMotion *) event;
|
||||
double n_x;
|
||||
n_x = motion->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( motion->y >= 7 && motion->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
} else
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( !( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) ) {
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -344,7 +414,7 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
int x, int y, int width, int height)
|
||||
{
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
gint running_width;
|
||||
gdouble running_width;
|
||||
EReflow *e_reflow = E_REFLOW(item);
|
||||
int i;
|
||||
double column_width;
|
||||
@ -417,25 +487,73 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
static void
|
||||
e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
|
||||
{
|
||||
EReflow *e_reflow;
|
||||
double x0, x1, y0, y1;
|
||||
|
||||
e_reflow = E_REFLOW (item);
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update)
|
||||
GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags);
|
||||
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
if (e_reflow->need_height_update) {
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
|
||||
gnome_canvas_update_bbox(item, x0, y0, x1, y1);
|
||||
gnome_canvas_request_redraw(item->canvas, x0, y0, x1, y1);
|
||||
e_reflow->need_height_update = FALSE;
|
||||
} else if (e_reflow->need_column_resize) {
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
int start_line = e_reflow_pick_line(e_reflow,
|
||||
gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
|
||||
gdouble running_width;
|
||||
int i;
|
||||
double column_width;
|
||||
|
||||
if ( e_reflow->previous_temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->previous_temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
if ( e_reflow->temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
e_reflow->previous_temp_column_width = e_reflow->temp_column_width;
|
||||
e_reflow->need_column_resize = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static double
|
||||
@ -452,11 +570,11 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
return 0;
|
||||
|
||||
if (y >= 7 && y <= e_reflow->height - 7) {
|
||||
int n_x;
|
||||
float n_x;
|
||||
n_x = x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if (n_x < 4) {
|
||||
n_x += 9.0;
|
||||
n_x = fmod(n_x, (e_reflow->column_width + 16));
|
||||
if (n_x < 16.0) {
|
||||
*actual_item = item;
|
||||
return 0;
|
||||
}
|
||||
@ -467,7 +585,7 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
static void
|
||||
_reflow( EReflow *e_reflow )
|
||||
{
|
||||
int running_height;
|
||||
gdouble running_height;
|
||||
GList *list;
|
||||
double item_height;
|
||||
|
||||
@ -514,8 +632,8 @@ _update_reflow( EReflow *e_reflow )
|
||||
{
|
||||
if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
|
||||
|
||||
gint old_width;
|
||||
gint running_width;
|
||||
gdouble old_width;
|
||||
gdouble running_width;
|
||||
|
||||
_reflow (e_reflow);
|
||||
|
||||
@ -528,7 +646,7 @@ _update_reflow( EReflow *e_reflow )
|
||||
GList *list;
|
||||
GList *next_column;
|
||||
gdouble item_height;
|
||||
gint running_height;
|
||||
gdouble running_height;
|
||||
|
||||
running_height = 7;
|
||||
|
||||
@ -579,6 +697,8 @@ _idle_reflow(gpointer data)
|
||||
{
|
||||
EReflow *e_reflow = E_REFLOW(data);
|
||||
_update_reflow(e_reflow);
|
||||
e_reflow->need_height_update = TRUE;
|
||||
gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(e_reflow));
|
||||
e_reflow->idle = 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -71,6 +71,14 @@ struct _EReflow
|
||||
gdouble start_x;
|
||||
gint which_column_dragged;
|
||||
double temp_column_width;
|
||||
double previous_temp_column_width;
|
||||
|
||||
guint need_height_update : 1;
|
||||
guint need_column_resize : 1;
|
||||
|
||||
guint default_cursor_shown : 1;
|
||||
GdkCursor *arrow_cursor;
|
||||
GdkCursor *default_cursor;
|
||||
};
|
||||
|
||||
struct _EReflowClass
|
||||
|
||||
@ -311,6 +311,9 @@ e_text_init (EText *text)
|
||||
text->primary_length = 0;
|
||||
text->clipboard_selection = NULL;
|
||||
text->clipboard_length = 0;
|
||||
|
||||
text->pointer_in = FALSE;
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
|
||||
/* Destroy handler for the text item */
|
||||
@ -1031,6 +1034,9 @@ e_text_realize (GnomeCanvasItem *item)
|
||||
(* parent_class->realize) (item);
|
||||
|
||||
text->gc = gdk_gc_new (item->canvas->layout.bin_window);
|
||||
|
||||
text->i_cursor = gdk_cursor_new (GDK_XTERM);
|
||||
text->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
|
||||
}
|
||||
|
||||
/* Unrealize handler for the text item */
|
||||
@ -1044,6 +1050,9 @@ e_text_unrealize (GnomeCanvasItem *item)
|
||||
gdk_gc_unref (text->gc);
|
||||
text->gc = NULL;
|
||||
|
||||
gdk_cursor_destroy (text->i_cursor);
|
||||
gdk_cursor_destroy (text->default_cursor);
|
||||
|
||||
if (parent_class->unrealize)
|
||||
(* parent_class->unrealize) (item);
|
||||
}
|
||||
@ -1700,6 +1709,12 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
if (focus_event->in) {
|
||||
if(!text->editing) {
|
||||
text->editing = TRUE;
|
||||
if ( text->pointer_in ) {
|
||||
if ( text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
|
||||
text->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
text->selection_start = 0;
|
||||
text->selection_end = 0;
|
||||
text->select_by_word = FALSE;
|
||||
@ -1712,6 +1727,10 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
}
|
||||
} else {
|
||||
text->editing = FALSE;
|
||||
if ( ! text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
if (text->timeout_id) {
|
||||
g_source_remove(text->timeout_id);
|
||||
text->timeout_id = 0;
|
||||
@ -1765,6 +1784,14 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
if (event->type == GDK_BUTTON_PRESS && text->timer) {
|
||||
g_timer_reset(text->timer);
|
||||
}
|
||||
if (event->type == GDK_BUTTON_PRESS) {
|
||||
gnome_canvas_item_grab (item,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
|
||||
text->i_cursor,
|
||||
button.time);
|
||||
} else {
|
||||
gnome_canvas_item_ungrab (item, button.time);
|
||||
}
|
||||
} else if (text->editable && event->type == GDK_BUTTON_RELEASE) {
|
||||
gnome_canvas_item_grab_focus (item);
|
||||
return 1;
|
||||
@ -1784,6 +1811,24 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
text->last_state = motion.state;
|
||||
}
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
text->pointer_in = TRUE;
|
||||
if (text->editing) {
|
||||
if ( text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
|
||||
text->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
text->pointer_in = FALSE;
|
||||
if (text->editing) {
|
||||
if ( ! text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -167,6 +167,12 @@ struct _EText {
|
||||
gint primary_length; /* Primary selection text length */
|
||||
gchar *clipboard_selection; /* Clipboard selection text */
|
||||
gint clipboard_length; /* Clipboard selection text length*/
|
||||
|
||||
guint pointer_in : 1;
|
||||
guint default_cursor_shown : 1;
|
||||
|
||||
GdkCursor *default_cursor;
|
||||
GdkCursor *i_cursor;
|
||||
};
|
||||
|
||||
struct _ETextClass {
|
||||
|
||||
@ -311,6 +311,9 @@ e_text_init (EText *text)
|
||||
text->primary_length = 0;
|
||||
text->clipboard_selection = NULL;
|
||||
text->clipboard_length = 0;
|
||||
|
||||
text->pointer_in = FALSE;
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
|
||||
/* Destroy handler for the text item */
|
||||
@ -1031,6 +1034,9 @@ e_text_realize (GnomeCanvasItem *item)
|
||||
(* parent_class->realize) (item);
|
||||
|
||||
text->gc = gdk_gc_new (item->canvas->layout.bin_window);
|
||||
|
||||
text->i_cursor = gdk_cursor_new (GDK_XTERM);
|
||||
text->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
|
||||
}
|
||||
|
||||
/* Unrealize handler for the text item */
|
||||
@ -1044,6 +1050,9 @@ e_text_unrealize (GnomeCanvasItem *item)
|
||||
gdk_gc_unref (text->gc);
|
||||
text->gc = NULL;
|
||||
|
||||
gdk_cursor_destroy (text->i_cursor);
|
||||
gdk_cursor_destroy (text->default_cursor);
|
||||
|
||||
if (parent_class->unrealize)
|
||||
(* parent_class->unrealize) (item);
|
||||
}
|
||||
@ -1700,6 +1709,12 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
if (focus_event->in) {
|
||||
if(!text->editing) {
|
||||
text->editing = TRUE;
|
||||
if ( text->pointer_in ) {
|
||||
if ( text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
|
||||
text->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
text->selection_start = 0;
|
||||
text->selection_end = 0;
|
||||
text->select_by_word = FALSE;
|
||||
@ -1712,6 +1727,10 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
}
|
||||
} else {
|
||||
text->editing = FALSE;
|
||||
if ( ! text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
if (text->timeout_id) {
|
||||
g_source_remove(text->timeout_id);
|
||||
text->timeout_id = 0;
|
||||
@ -1765,6 +1784,14 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
if (event->type == GDK_BUTTON_PRESS && text->timer) {
|
||||
g_timer_reset(text->timer);
|
||||
}
|
||||
if (event->type == GDK_BUTTON_PRESS) {
|
||||
gnome_canvas_item_grab (item,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
|
||||
text->i_cursor,
|
||||
button.time);
|
||||
} else {
|
||||
gnome_canvas_item_ungrab (item, button.time);
|
||||
}
|
||||
} else if (text->editable && event->type == GDK_BUTTON_RELEASE) {
|
||||
gnome_canvas_item_grab_focus (item);
|
||||
return 1;
|
||||
@ -1784,6 +1811,24 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
text->last_state = motion.state;
|
||||
}
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
text->pointer_in = TRUE;
|
||||
if (text->editing) {
|
||||
if ( text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
|
||||
text->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
text->pointer_in = FALSE;
|
||||
if (text->editing) {
|
||||
if ( ! text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -167,6 +167,12 @@ struct _EText {
|
||||
gint primary_length; /* Primary selection text length */
|
||||
gchar *clipboard_selection; /* Clipboard selection text */
|
||||
gint clipboard_length; /* Clipboard selection text length*/
|
||||
|
||||
guint pointer_in : 1;
|
||||
guint default_cursor_shown : 1;
|
||||
|
||||
GdkCursor *default_cursor;
|
||||
GdkCursor *i_cursor;
|
||||
};
|
||||
|
||||
struct _ETextClass {
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include <gnome.h>
|
||||
#include <math.h>
|
||||
#include "e-reflow.h"
|
||||
#include "e-canvas-utils.h"
|
||||
static void e_reflow_init (EReflow *card);
|
||||
@ -132,6 +133,13 @@ e_reflow_init (EReflow *reflow)
|
||||
reflow->idle = 0;
|
||||
|
||||
reflow->column_drag = FALSE;
|
||||
|
||||
reflow->need_height_update = FALSE;
|
||||
reflow->need_column_resize = FALSE;
|
||||
|
||||
reflow->default_cursor_shown = TRUE;
|
||||
reflow->arrow_cursor = NULL;
|
||||
reflow->default_cursor = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -146,8 +154,7 @@ e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
||||
switch (arg_id){
|
||||
case ARG_HEIGHT:
|
||||
e_reflow->height = GTK_VALUE_DOUBLE (*arg);
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update (item);
|
||||
_queue_reflow(e_reflow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -185,6 +192,9 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
|
||||
(* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
|
||||
|
||||
e_reflow->arrow_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
|
||||
e_reflow->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
|
||||
|
||||
for(list = e_reflow->items; list; list = g_list_next(list)) {
|
||||
GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data);
|
||||
gtk_signal_connect(GTK_OBJECT(item),
|
||||
@ -196,7 +206,7 @@ e_reflow_realize (GnomeCanvasItem *item)
|
||||
NULL);
|
||||
}
|
||||
|
||||
_update_reflow( e_reflow );
|
||||
_queue_reflow( e_reflow );
|
||||
|
||||
if (!item->canvas->aa) {
|
||||
}
|
||||
@ -213,6 +223,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
{
|
||||
}
|
||||
|
||||
gdk_cursor_destroy (e_reflow->arrow_cursor);
|
||||
gdk_cursor_destroy (e_reflow->default_cursor);
|
||||
|
||||
g_list_free (e_reflow->items);
|
||||
g_list_free (e_reflow->columns);
|
||||
|
||||
@ -221,9 +234,9 @@ e_reflow_unrealize (GnomeCanvasItem *item)
|
||||
}
|
||||
|
||||
static gint
|
||||
e_reflow_pick_line (EReflow *e_reflow, gint x)
|
||||
e_reflow_pick_line (EReflow *e_reflow, double x)
|
||||
{
|
||||
x += 6;
|
||||
x += 9;
|
||||
x /= e_reflow->column_width + 16;
|
||||
return x;
|
||||
}
|
||||
@ -269,15 +282,23 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
case GDK_BUTTON_PRESS:
|
||||
{
|
||||
GdkEventButton *button = (GdkEventButton *) event;
|
||||
int n_x;
|
||||
double n_x;
|
||||
n_x = button->x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) {
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x);
|
||||
e_reflow->start_x = button->x;
|
||||
e_reflow->start_x = e_reflow->which_column_dragged * (e_reflow->column_width + 16) - 1;
|
||||
e_reflow->temp_column_width = e_reflow->column_width;
|
||||
e_reflow->column_drag = TRUE;
|
||||
|
||||
gnome_canvas_item_grab (item,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
|
||||
e_reflow->arrow_cursor,
|
||||
button->time);
|
||||
|
||||
e_reflow->previous_temp_column_width = -1;
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
return TRUE;
|
||||
}
|
||||
@ -294,8 +315,8 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width));
|
||||
e_reflow->column_width = e_reflow->temp_column_width;
|
||||
e_reflow->column_drag = FALSE;
|
||||
_update_reflow(e_reflow);
|
||||
gnome_canvas_item_request_update(item);
|
||||
_queue_reflow(e_reflow);
|
||||
gnome_canvas_item_ungrab (item, button->time);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
@ -308,9 +329,58 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
(motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
|
||||
if (e_reflow->temp_column_width < 50)
|
||||
e_reflow->temp_column_width = 50;
|
||||
if (old_width != e_reflow->temp_column_width)
|
||||
if (old_width != e_reflow->temp_column_width) {
|
||||
e_reflow->need_column_resize = TRUE;
|
||||
gnome_canvas_item_request_update(item);
|
||||
}
|
||||
return TRUE;
|
||||
} else {
|
||||
GdkEventMotion *motion = (GdkEventMotion *) event;
|
||||
double n_x;
|
||||
n_x = motion->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( motion->y >= 7 && motion->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
} else
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) {
|
||||
if ( e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
|
||||
e_reflow->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
if (!e_reflow->column_drag) {
|
||||
GdkEventCrossing *crossing = (GdkEventCrossing *) event;
|
||||
double n_x;
|
||||
n_x = crossing->x;
|
||||
n_x += 9;
|
||||
n_x = fmod(n_x,(e_reflow->column_width + 16));
|
||||
if ( !( crossing->y >= 7 && crossing->y <= e_reflow->height - 7 && n_x < 16 ) ) {
|
||||
if ( ! e_reflow->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
|
||||
e_reflow->default_cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -344,7 +414,7 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
int x, int y, int width, int height)
|
||||
{
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
gint running_width;
|
||||
gdouble running_width;
|
||||
EReflow *e_reflow = E_REFLOW(item);
|
||||
int i;
|
||||
double column_width;
|
||||
@ -417,25 +487,73 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
||||
static void
|
||||
e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
|
||||
{
|
||||
EReflow *e_reflow;
|
||||
double x0, x1, y0, y1;
|
||||
|
||||
e_reflow = E_REFLOW (item);
|
||||
|
||||
if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update)
|
||||
GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags);
|
||||
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
if (e_reflow->need_height_update) {
|
||||
x0 = item->x1;
|
||||
y0 = item->y1;
|
||||
x1 = item->x2;
|
||||
y1 = item->y2;
|
||||
if ( x0 > 0 )
|
||||
x0 = 0;
|
||||
if ( y0 > 0 )
|
||||
y0 = 0;
|
||||
if ( x1 < E_REFLOW(item)->width )
|
||||
x1 = E_REFLOW(item)->width;
|
||||
if ( x1 < E_REFLOW(item)->height )
|
||||
x1 = E_REFLOW(item)->height;
|
||||
|
||||
gnome_canvas_update_bbox(item, x0, y0, x1, y1);
|
||||
gnome_canvas_request_redraw(item->canvas, x0, y0, x1, y1);
|
||||
e_reflow->need_height_update = FALSE;
|
||||
} else if (e_reflow->need_column_resize) {
|
||||
int x_rect, y_rect, width_rect, height_rect;
|
||||
int start_line = e_reflow_pick_line(e_reflow,
|
||||
gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
|
||||
gdouble running_width;
|
||||
int i;
|
||||
double column_width;
|
||||
|
||||
if ( e_reflow->previous_temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->previous_temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
if ( e_reflow->temp_column_width != -1 ) {
|
||||
running_width = start_line * (e_reflow->column_width + 16);
|
||||
column_width = e_reflow->temp_column_width;
|
||||
running_width -= start_line * (column_width + 16);
|
||||
running_width += 7 + column_width + 7;
|
||||
y_rect = 7;
|
||||
width_rect = 2;
|
||||
height_rect = e_reflow->height - 14;
|
||||
|
||||
for ( i = 0; i < e_reflow->column_count - 1; i++) {
|
||||
x_rect = running_width;
|
||||
gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
|
||||
running_width += 2 + 7 + column_width + 7;
|
||||
}
|
||||
}
|
||||
|
||||
e_reflow->previous_temp_column_width = e_reflow->temp_column_width;
|
||||
e_reflow->need_column_resize = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static double
|
||||
@ -452,11 +570,11 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
return 0;
|
||||
|
||||
if (y >= 7 && y <= e_reflow->height - 7) {
|
||||
int n_x;
|
||||
float n_x;
|
||||
n_x = x;
|
||||
n_x += 3;
|
||||
n_x %= (int)(e_reflow->column_width + 16);
|
||||
if (n_x < 4) {
|
||||
n_x += 9.0;
|
||||
n_x = fmod(n_x, (e_reflow->column_width + 16));
|
||||
if (n_x < 16.0) {
|
||||
*actual_item = item;
|
||||
return 0;
|
||||
}
|
||||
@ -467,7 +585,7 @@ e_reflow_point (GnomeCanvasItem *item,
|
||||
static void
|
||||
_reflow( EReflow *e_reflow )
|
||||
{
|
||||
int running_height;
|
||||
gdouble running_height;
|
||||
GList *list;
|
||||
double item_height;
|
||||
|
||||
@ -514,8 +632,8 @@ _update_reflow( EReflow *e_reflow )
|
||||
{
|
||||
if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
|
||||
|
||||
gint old_width;
|
||||
gint running_width;
|
||||
gdouble old_width;
|
||||
gdouble running_width;
|
||||
|
||||
_reflow (e_reflow);
|
||||
|
||||
@ -528,7 +646,7 @@ _update_reflow( EReflow *e_reflow )
|
||||
GList *list;
|
||||
GList *next_column;
|
||||
gdouble item_height;
|
||||
gint running_height;
|
||||
gdouble running_height;
|
||||
|
||||
running_height = 7;
|
||||
|
||||
@ -579,6 +697,8 @@ _idle_reflow(gpointer data)
|
||||
{
|
||||
EReflow *e_reflow = E_REFLOW(data);
|
||||
_update_reflow(e_reflow);
|
||||
e_reflow->need_height_update = TRUE;
|
||||
gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(e_reflow));
|
||||
e_reflow->idle = 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -71,6 +71,14 @@ struct _EReflow
|
||||
gdouble start_x;
|
||||
gint which_column_dragged;
|
||||
double temp_column_width;
|
||||
double previous_temp_column_width;
|
||||
|
||||
guint need_height_update : 1;
|
||||
guint need_column_resize : 1;
|
||||
|
||||
guint default_cursor_shown : 1;
|
||||
GdkCursor *arrow_cursor;
|
||||
GdkCursor *default_cursor;
|
||||
};
|
||||
|
||||
struct _EReflowClass
|
||||
|
||||
@ -311,6 +311,9 @@ e_text_init (EText *text)
|
||||
text->primary_length = 0;
|
||||
text->clipboard_selection = NULL;
|
||||
text->clipboard_length = 0;
|
||||
|
||||
text->pointer_in = FALSE;
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
|
||||
/* Destroy handler for the text item */
|
||||
@ -1031,6 +1034,9 @@ e_text_realize (GnomeCanvasItem *item)
|
||||
(* parent_class->realize) (item);
|
||||
|
||||
text->gc = gdk_gc_new (item->canvas->layout.bin_window);
|
||||
|
||||
text->i_cursor = gdk_cursor_new (GDK_XTERM);
|
||||
text->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
|
||||
}
|
||||
|
||||
/* Unrealize handler for the text item */
|
||||
@ -1044,6 +1050,9 @@ e_text_unrealize (GnomeCanvasItem *item)
|
||||
gdk_gc_unref (text->gc);
|
||||
text->gc = NULL;
|
||||
|
||||
gdk_cursor_destroy (text->i_cursor);
|
||||
gdk_cursor_destroy (text->default_cursor);
|
||||
|
||||
if (parent_class->unrealize)
|
||||
(* parent_class->unrealize) (item);
|
||||
}
|
||||
@ -1700,6 +1709,12 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
if (focus_event->in) {
|
||||
if(!text->editing) {
|
||||
text->editing = TRUE;
|
||||
if ( text->pointer_in ) {
|
||||
if ( text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
|
||||
text->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
text->selection_start = 0;
|
||||
text->selection_end = 0;
|
||||
text->select_by_word = FALSE;
|
||||
@ -1712,6 +1727,10 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
}
|
||||
} else {
|
||||
text->editing = FALSE;
|
||||
if ( ! text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
if (text->timeout_id) {
|
||||
g_source_remove(text->timeout_id);
|
||||
text->timeout_id = 0;
|
||||
@ -1765,6 +1784,14 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
if (event->type == GDK_BUTTON_PRESS && text->timer) {
|
||||
g_timer_reset(text->timer);
|
||||
}
|
||||
if (event->type == GDK_BUTTON_PRESS) {
|
||||
gnome_canvas_item_grab (item,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
|
||||
text->i_cursor,
|
||||
button.time);
|
||||
} else {
|
||||
gnome_canvas_item_ungrab (item, button.time);
|
||||
}
|
||||
} else if (text->editable && event->type == GDK_BUTTON_RELEASE) {
|
||||
gnome_canvas_item_grab_focus (item);
|
||||
return 1;
|
||||
@ -1784,6 +1811,24 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
text->last_state = motion.state;
|
||||
}
|
||||
break;
|
||||
case GDK_ENTER_NOTIFY:
|
||||
text->pointer_in = TRUE;
|
||||
if (text->editing) {
|
||||
if ( text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
|
||||
text->default_cursor_shown = FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
text->pointer_in = FALSE;
|
||||
if (text->editing) {
|
||||
if ( ! text->default_cursor_shown ) {
|
||||
gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
|
||||
text->default_cursor_shown = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -167,6 +167,12 @@ struct _EText {
|
||||
gint primary_length; /* Primary selection text length */
|
||||
gchar *clipboard_selection; /* Clipboard selection text */
|
||||
gint clipboard_length; /* Clipboard selection text length*/
|
||||
|
||||
guint pointer_in : 1;
|
||||
guint default_cursor_shown : 1;
|
||||
|
||||
GdkCursor *default_cursor;
|
||||
GdkCursor *i_cursor;
|
||||
};
|
||||
|
||||
struct _ETextClass {
|
||||
|
||||
Reference in New Issue
Block a user