aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/gncal-day-view.c6
-rw-r--r--calendar/gui/gncal-day-view.h2
-rw-r--r--calendar/gui/gncal-full-day.c75
-rw-r--r--calendar/gui/gncal-full-day.h4
-rw-r--r--calendar/gui/gncal-week-view.c10
-rw-r--r--calendar/gui/gncal-week-view.h8
-rw-r--r--calendar/gui/gnome-cal.c16
-rw-r--r--calendar/gui/gnome-cal.h4
8 files changed, 87 insertions, 38 deletions
diff --git a/calendar/gui/gncal-day-view.c b/calendar/gui/gncal-day-view.c
index 951b0eb5ae..5337f0058b 100644
--- a/calendar/gui/gncal-day-view.c
+++ b/calendar/gui/gncal-day-view.c
@@ -114,7 +114,7 @@ gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper)
dview->upper = upper;
dview->events = 0;
- gncal_day_view_update (dview);
+ gncal_day_view_update (dview, NULL, 0);
return GTK_WIDGET (dview);
}
@@ -284,7 +284,7 @@ gncal_day_view_expose (GtkWidget *widget, GdkEventExpose *event)
}
void
-gncal_day_view_update (GncalDayView *dview)
+gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags)
{
struct tm tm;
char buf[256];
@@ -323,7 +323,7 @@ gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper)
dview->lower = lower;
dview->upper = upper;
- gncal_day_view_update (dview);
+ gncal_day_view_update (dview, NULL, 0);
}
}
diff --git a/calendar/gui/gncal-day-view.h b/calendar/gui/gncal-day-view.h
index 80e8a6299f..f2a4ae6e93 100644
--- a/calendar/gui/gncal-day-view.h
+++ b/calendar/gui/gncal-day-view.h
@@ -46,7 +46,7 @@ struct _GncalDayViewClass {
guint gncal_day_view_get_type (void);
GtkWidget *gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper);
-void gncal_day_view_update (GncalDayView *dview);
+void gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags);
void gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper);
void gncal_day_view_set_shadow (GncalDayView *dview, GtkShadowType shadow_type);
diff --git a/calendar/gui/gncal-full-day.c b/calendar/gui/gncal-full-day.c
index f32c8c482c..ce64db9173 100644
--- a/calendar/gui/gncal-full-day.c
+++ b/calendar/gui/gncal-full-day.c
@@ -14,7 +14,7 @@
#define TEXT_BORDER 2
-#define HANDLE_SIZE 3
+#define HANDLE_SIZE 8
#define MIN_WIDTH 200
#define XOR_RECT_WIDTH 2
#define UNSELECT_TIMEOUT 150 /* ms */
@@ -173,9 +173,9 @@ child_set_text_pos (Child *child)
GtkAllocation allocation;
allocation.x = 0;
- allocation.y = HANDLE_SIZE;
+ allocation.y = (GTK_WIDGET_HAS_FOCUS (child->widget) ? HANDLE_SIZE : 0);
allocation.width = child->width;
- allocation.height = child->height - 2 * HANDLE_SIZE;
+ allocation.height = child->height - (GTK_WIDGET_HAS_FOCUS (child->widget) ? (2 * HANDLE_SIZE) : 0);
gtk_widget_size_request (child->widget, &child->widget->requisition); /* FIXME: is this needed? */
gtk_widget_size_allocate (child->widget, &allocation);
@@ -297,18 +297,43 @@ child_realized_setup (GtkWidget *widget, gpointer data)
}
static gint
+child_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data)
+{
+ Child *child;
+
+ child = data;
+
+ /* Paint handles on child */
+
+ child_set_text_pos (child);
+
+ return FALSE;
+}
+
+static gint
child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data)
{
Child *child;
+ GncalFullDay *fullday;
child = data;
+ /* Update summary in calendar object */
+
if (child->ico->summary)
g_free (child->ico->summary);
child->ico->summary = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
- /* FIXME: need notify calendar of change? */
+ /* Erase handles from child */
+
+ child_set_text_pos (child);
+
+ /* Notify calendar of change */
+
+ fullday = gtk_object_get_user_data (GTK_OBJECT (widget));
+
+ gnome_calendar_object_changed (fullday->calendar, child->ico, CHANGE_SUMMARY);
return FALSE;
}
@@ -328,6 +353,8 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
child->width = 0;
child->height = 0;
+ gtk_object_set_user_data (GTK_OBJECT (child->widget), fullday);
+
child_range_changed (fullday, child);
/* We set the i-beam cursor and the initial summary text upon realization */
@@ -336,11 +363,13 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
(GtkSignalFunc) child_realized_setup,
child);
- /* Update the iCalObject summary when the text widget loses focus */
+ gtk_signal_connect_after (GTK_OBJECT (child->widget), "focus_in_event",
+ (GtkSignalFunc) child_focus_in,
+ child);
- gtk_signal_connect (GTK_OBJECT (child->widget), "focus_out_event",
- (GtkSignalFunc) child_focus_out,
- child);
+ gtk_signal_connect_after (GTK_OBJECT (child->widget), "focus_out_event",
+ (GtkSignalFunc) child_focus_out,
+ child);
/* Finish setup */
@@ -1354,7 +1383,7 @@ update_from_drag_info (GncalFullDay *fullday)
/* Notify calendar of change */
- gnome_calendar_object_changed (fullday->calendar, di->child->ico);
+ gnome_calendar_object_changed (fullday->calendar, di->child->ico, CHANGE_DATES);
}
static gint
@@ -1569,7 +1598,7 @@ gncal_full_day_foreach (GtkContainer *container, GtkCallback callback, gpointer
}
void
-gncal_full_day_update (GncalFullDay *fullday)
+gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags)
{
GList *children;
GList *l_events, *events;
@@ -1581,6 +1610,24 @@ gncal_full_day_update (GncalFullDay *fullday)
if (!fullday->calendar->cal)
return;
+ /* Try to find child that changed */
+
+ for (children = fullday->children; children; children = children->next) {
+ child = children->data;
+
+ if (child->ico == ico)
+ break;
+ }
+
+ /* If child was found and nothing but the summary changed, we can just paint the child and return */
+
+ if (children && !(flags & ~CHANGE_SUMMARY)) {
+ child_draw (fullday, child, NULL, TRUE);
+ return;
+ }
+
+ /* We have to regenerate and layout our list of children */
+
for (children = fullday->children; children; children = children->next)
child_destroy (fullday, children->data);
@@ -1633,7 +1680,7 @@ gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower, time_t upper)
di->sel_rows_used = 0; /* clear selection */
- gncal_full_day_update (fullday);
+ gncal_full_day_update (fullday, NULL, 0);
}
}
@@ -1663,19 +1710,19 @@ gncal_full_day_selection_range (GncalFullDay *fullday, time_t *lower, time_t *up
}
void
-gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object)
+gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico)
{
GList *children;
Child *child;
GdkEvent event;
g_return_if_fail (fullday != NULL);
- g_return_if_fail (object != NULL);
+ g_return_if_fail (ico != NULL);
for (children = fullday->children; children; children = children->next) {
child = children->data;
- if (child->ico == object) {
+ if (child->ico == ico) {
gtk_widget_grab_focus (child->widget);
/* We synthesize a click because GtkText will not set the cursor and
diff --git a/calendar/gui/gncal-full-day.h b/calendar/gui/gncal-full-day.h
index 289accd136..1e8e779582 100644
--- a/calendar/gui/gncal-full-day.h
+++ b/calendar/gui/gncal-full-day.h
@@ -52,7 +52,7 @@ struct _GncalFullDayClass {
guint gncal_full_day_get_type (void);
GtkWidget *gncal_full_day_new (GnomeCalendar *calendar, time_t lower, time_t upper);
-void gncal_full_day_update (GncalFullDay *fullday);
+void gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags);
void gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower, time_t upper);
/* Returns the selected range in lower and upper. If nothing is
@@ -60,7 +60,7 @@ void gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower,
*/
int gncal_full_day_selection_range (GncalFullDay *fullday, time_t *lower, time_t *upper);
-void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object);
+void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico);
END_GNOME_DECLS
diff --git a/calendar/gui/gncal-week-view.c b/calendar/gui/gncal-week-view.c
index 4adf7ba283..1cf35fac5f 100644
--- a/calendar/gui/gncal-week-view.c
+++ b/calendar/gui/gncal-week-view.c
@@ -105,24 +105,24 @@ gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week)
}
static void
-update (GncalWeekView *wview, int update_days)
+update (GncalWeekView *wview, int update_days, iCalObject *object, int flags)
{
int i;
if (update_days)
for (i = 0; i < 7; i++)
- gncal_day_view_update (wview->days[i]);
+ gncal_day_view_update (wview->days[i], object, flags);
/* FIXME: update extra widgets */
}
void
-gncal_week_view_update (GncalWeekView *wview)
+gncal_week_view_update (GncalWeekView *wview, iCalObject *ico, int flags)
{
g_return_if_fail (wview != NULL);
g_return_if_fail (GNCAL_IS_WEEK_VIEW (wview));
- update (wview, TRUE);
+ update (wview, TRUE, ico, flags);
}
void
@@ -166,5 +166,5 @@ gncal_week_view_set (GncalWeekView *wview, time_t start_of_week)
day_start = day_end;
}
- update (wview, FALSE);
+ update (wview, FALSE, NULL, 0);
}
diff --git a/calendar/gui/gncal-week-view.h b/calendar/gui/gncal-week-view.h
index 6bf29e40c4..81bc44c816 100644
--- a/calendar/gui/gncal-week-view.h
+++ b/calendar/gui/gncal-week-view.h
@@ -42,11 +42,11 @@ struct _GncalWeekViewClass {
};
-guint gncal_week_view_get_type (void);
-GtkWidget *gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week);
+guint gncal_week_view_get_type (void);
+GtkWidget *gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week);
-void gncal_week_view_update (GncalWeekView *wview);
-void gncal_week_view_set (GncalWeekView *wview, time_t start_of_week);
+void gncal_week_view_update (GncalWeekView *wview, iCalObject *ico, int flags);
+void gncal_week_view_set (GncalWeekView *wview, time_t start_of_week);
END_GNOME_DECLS
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index 6a9b7b044f..0b2da0a0e2 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -185,18 +185,18 @@ gnome_calendar_new (char *title)
return retval;
}
-void
-gnome_calendar_update_all (GnomeCalendar *cal)
+static void
+gnome_calendar_update_all (GnomeCalendar *cal, iCalObject *object, int flags)
{
- gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view));
- gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view));
+ gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view), object, flags);
+ gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view), object, flags);
}
void
gnome_calendar_load (GnomeCalendar *gcal, char *file)
{
calendar_load (gcal->cal, file);
- gnome_calendar_update_all (gcal);
+ gnome_calendar_update_all (gcal, NULL, 0);
}
void
@@ -205,11 +205,11 @@ gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj)
printf ("Adding object at: ");
print_time_t (obj->dtstart);
calendar_add_object (gcal->cal, obj);
- gnome_calendar_update_all (gcal);
+ gnome_calendar_update_all (gcal, obj, CHANGE_NEW);
}
void
-gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj)
+gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj, int flags)
{
g_return_if_fail (gcal != NULL);
g_return_if_fail (GNOME_IS_CALENDAR (gcal));
@@ -222,5 +222,5 @@ gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj)
gcal->cal->modified = TRUE;
- gnome_calendar_update_all (gcal);
+ gnome_calendar_update_all (gcal, obj, flags);
}
diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h
index 5a4d8e8d09..8e765bda15 100644
--- a/calendar/gui/gnome-cal.h
+++ b/calendar/gui/gnome-cal.h
@@ -42,7 +42,9 @@ void gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj);
void gnome_calendar_next (GnomeCalendar *gcal);
void gnome_calendar_previous (GnomeCalendar *gcal);
void gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time);
-void gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj);
+
+/* Flags is a bitmask of CalObjectChange values */
+void gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj, int flags);
END_GNOME_DECLS