aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gncal-full-day.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gncal-full-day.c')
-rw-r--r--calendar/gncal-full-day.c168
1 files changed, 93 insertions, 75 deletions
diff --git a/calendar/gncal-full-day.c b/calendar/gncal-full-day.c
index 67756d0482..d7aecccfee 100644
--- a/calendar/gncal-full-day.c
+++ b/calendar/gncal-full-day.c
@@ -2,7 +2,7 @@
*
* Copyright (C) 1998 The Free Software Foundation
*
- * Author: Federico Mena <federico@nuclecu.unam.mx>
+ * Author: Federico Mena <quartic@gimp.org>
*/
#include <string.h>
@@ -260,9 +260,9 @@ child_draw (GncalFullDay *fullday, Child *child, GdkRectangle *area, int draw_ch
/* Left handle */
rect.x = 0;
- rect.y = 0;
+ rect.y = has_focus ? HANDLE_SIZE : 0;
rect.width = HANDLE_SIZE;
- rect.height = has_focus ? (child->height - HANDLE_SIZE) : child->height;
+ rect.height = has_focus ? (child->height - 2 * HANDLE_SIZE) : child->height;
if (gdk_rectangle_intersect (&rect, area, &dest))
view_utils_draw_textured_frame (GTK_WIDGET (fullday), child->window, &rect, GTK_SHADOW_OUT);
@@ -270,9 +270,9 @@ child_draw (GncalFullDay *fullday, Child *child, GdkRectangle *area, int draw_ch
if (has_focus) {
/* Top handle */
- rect.x = HANDLE_SIZE;
+ rect.x = 0;
rect.y = 0;
- rect.width = child->width - HANDLE_SIZE;
+ rect.width = child->width;
rect.height = HANDLE_SIZE;
if (gdk_rectangle_intersect (&rect, area, &dest))
@@ -413,6 +413,58 @@ child_realized_setup (GtkWidget *widget, gpointer data)
strlen (child->ico->summary));
}
+static void
+child_set_pos (GncalFullDay *fullday, Child *child, int x, int y, int width, int height)
+{
+ child->x = x;
+ child->y = y;
+ child->width = width;
+ child->height = height;
+
+ if (!child->window) /* realized? */
+ return;
+
+ child_set_text_pos (child);
+ gdk_window_move_resize (child->window, x, y, width, height);
+}
+
+static int
+calc_row_height (GncalFullDay *fullday)
+{
+ int f_rows;
+ GtkWidget *widget;
+
+ get_tm_range (fullday, fullday->lower, fullday->upper, NULL, NULL, NULL, &f_rows);
+
+ widget = GTK_WIDGET (fullday);
+
+ return (widget->allocation.height - 2 * widget->style->klass->ythickness) / f_rows;
+}
+
+static void
+child_set_size (Child *child)
+{
+ int row_height;
+ int x, y, width, height;
+ GncalFullDay *fullday;
+
+ fullday = GNCAL_FULL_DAY (child->widget->parent);
+
+ row_height = calc_row_height (fullday);
+
+ x = child->x;
+ y = child->lower_row * row_height + GTK_WIDGET (fullday)->style->klass->ythickness;
+ width = child->width;
+ height = child->rows_used * row_height;
+
+ if (GTK_WIDGET_HAS_FOCUS (child->widget)) {
+ y -= HANDLE_SIZE;
+ height += 2 * HANDLE_SIZE;
+ }
+
+ child_set_pos (fullday, child, x, y, width, height);
+}
+
static gint
child_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data)
{
@@ -420,9 +472,7 @@ child_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data)
child = data;
- /* Paint handles on child */
-
- child_set_text_pos (child);
+ child_set_size (child);
return FALSE;
}
@@ -442,9 +492,7 @@ child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data)
child->ico->summary = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
- /* Erase handles from child */
-
- child_set_text_pos (child);
+ child_set_size (child);
/* Notify calendar of change */
@@ -556,21 +604,6 @@ child_destroy (GncalFullDay *fullday, Child *child)
g_free (child);
}
-static void
-child_set_pos (GncalFullDay *fullday, Child *child, int x, int y, int width, int height)
-{
- child->x = x;
- child->y = y;
- child->width = width;
- child->height = height;
-
- if (!child->window) /* realized? */
- return;
-
- child_set_text_pos (child);
- gdk_window_move_resize (child->window, x, y, width, height);
-}
-
static struct layout_row *
layout_get_rows (GncalFullDay *fullday, int *rowcount)
{
@@ -607,12 +640,13 @@ layout_get_rows (GncalFullDay *fullday, int *rowcount)
}
static void
-layout_kill_rows (struct layout_row *rows, int f_rows)
+layout_free_rows (struct layout_row *rows, int f_rows)
{
int i;
-
+
for (i = 0; i < f_rows; i++)
- g_free (rows [i].slots);
+ g_free (rows[i].slots);
+
g_free (rows);
}
@@ -677,44 +711,22 @@ calc_labels_width (GncalFullDay *fullday)
return max_w;
}
-static int
-calc_row_height (GncalFullDay *fullday)
-{
- int f_rows;
- GtkWidget *widget;
-
- get_tm_range (fullday, fullday->lower, fullday->upper, NULL, NULL, NULL, &f_rows);
-
- widget = GTK_WIDGET (fullday);
-
- return (widget->allocation.height - 2 * widget->style->klass->ythickness) / f_rows;
-}
-
static void
layout_child (GncalFullDay *fullday, Child *child, struct layout_row *rows, int left_x)
{
- int c_y, c_width, c_height;
GtkWidget *widget;
- int row_height;
-
- /* Calculate child position */
widget = GTK_WIDGET (fullday);
- row_height = calc_row_height (fullday);
-
- c_y = widget->style->klass->ythickness;
+ child->x = left_x;
/* FIXME: for now, the children overlap. Make it layout them nicely. */
- c_width = widget->allocation.width - (widget->style->klass->xthickness + left_x);
-
- c_y += child->lower_row * row_height;
- c_height = child->rows_used * row_height;
+ child->width = widget->allocation.width - (widget->style->klass->xthickness + left_x);
/* Position child */
- child_set_pos (fullday, child, left_x, c_y, c_width, c_height);
+ child_set_size (child);
}
static void
@@ -734,7 +746,7 @@ layout_children (GncalFullDay *fullday)
for (children = fullday->children; children; children = children->next)
layout_child (fullday, children->data, rows, left_x);
- layout_kill_rows (rows, rowcount);
+ layout_free_rows (rows, rowcount);
}
guint
@@ -1332,7 +1344,7 @@ draw_xor_rect (GncalFullDay *fullday)
di->child->x + i,
di->child_start_row * row_height + ythickness + i,
di->child->width - 2 * i - 1,
- di->child_rows_used * row_height - 2 * i - 2);
+ di->child_rows_used * row_height - 2 - 2 * i);
gdk_gc_set_function (widget->style->white_gc, GDK_COPY);
gdk_gc_set_subwindow (widget->style->white_gc, GDK_CLIP_BY_CHILDREN);
@@ -1381,6 +1393,7 @@ button_1 (GncalFullDay *fullday, GdkEventButton *event)
struct drag_info *di;
gint y;
int row_height;
+ int has_focus;
int old_start_row, old_rows_used;
int old_max;
int paint_start_row, paint_rows_used;
@@ -1440,20 +1453,25 @@ button_1 (GncalFullDay *fullday, GdkEventButton *event)
gtk_widget_get_pointer (widget, NULL, &y);
- if (event->x < HANDLE_SIZE)
+ has_focus = GTK_WIDGET_HAS_FOCUS (child->widget);
+
+ if (has_focus) {
+ if (event->y < HANDLE_SIZE)
+ di->drag_mode = DRAG_SIZE_TOP;
+ else if (event->y >= (child->height - HANDLE_SIZE))
+ di->drag_mode = DRAG_SIZE_BOTTOM;
+ else
+ di->drag_mode = DRAG_MOVE;
+ } else
di->drag_mode = DRAG_MOVE;
- else if (event->y < HANDLE_SIZE)
- di->drag_mode = DRAG_SIZE_TOP;
- else
- di->drag_mode = DRAG_SIZE_BOTTOM;
row_height = calc_row_height (fullday);
di->child = child;
di->child_click_y = event->y;
- di->child_start_row = get_row_from_y (fullday, child->y, FALSE);
- di->child_rows_used = child->height / row_height;
+ di->child_start_row = child->lower_row;
+ di->child_rows_used = child->rows_used;
gdk_pointer_grab (child->window, FALSE,
(GDK_BUTTON_MOTION_MASK
@@ -1535,6 +1553,7 @@ recompute_motion (GncalFullDay *fullday, int y)
struct drag_info *di;
int f_rows;
int row;
+ int has_focus;
di = fullday->drag_info;
@@ -1558,7 +1577,9 @@ recompute_motion (GncalFullDay *fullday, int y)
break;
case DRAG_MOVE:
- row = get_row_from_y (fullday, y - di->child_click_y, TRUE);
+ has_focus = GTK_WIDGET_HAS_FOCUS (di->child->widget);
+
+ row = get_row_from_y (fullday, y - di->child_click_y + (has_focus ? HANDLE_SIZE : 0), TRUE);
if (row > (f_rows - di->child_rows_used))
row = f_rows - di->child_rows_used;
@@ -1568,7 +1589,7 @@ recompute_motion (GncalFullDay *fullday, int y)
break;
case DRAG_SIZE_TOP:
- row = get_row_from_y (fullday, y, TRUE);
+ row = get_row_from_y (fullday, y + HANDLE_SIZE, TRUE);
if (row > (di->child_start_row + di->child_rows_used - 1))
row = di->child_start_row + di->child_rows_used - 1;
@@ -1579,7 +1600,7 @@ recompute_motion (GncalFullDay *fullday, int y)
break;
case DRAG_SIZE_BOTTOM:
- row = get_row_from_y (fullday, y, TRUE);
+ row = get_row_from_y (fullday, y - HANDLE_SIZE, TRUE);
if (row <= di->child_start_row)
row = di->child_start_row + 1;
@@ -1748,8 +1769,8 @@ static gint
gncal_full_day_expose (GtkWidget *widget, GdkEventExpose *event)
{
GncalFullDay *fullday;
- GList *children;
Child *child;
+ int on_text;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GNCAL_IS_FULL_DAY (widget), FALSE);
@@ -1762,15 +1783,12 @@ gncal_full_day_expose (GtkWidget *widget, GdkEventExpose *event)
if (event->window == widget->window)
paint_back (fullday, &event->area);
- else
- for (children = fullday->children; children; children = children->next) {
- child = children->data;
+ else {
+ child = find_child_by_window (fullday, event->window, &on_text);
- if (event->window == child->window) {
- child_draw (fullday, child, &event->area, FALSE);
- break;
- }
- }
+ if (child && !on_text)
+ child_draw (fullday, child, &event->area, FALSE);
+ }
return FALSE;
}