The general_owner may be null. Do the proper thing when creating the

1998-04-15  Federico Mena Quintero  <federico@nuclecu.unam.mx>

	* eventedit.c (ee_init_general_page): The general_owner may be
	null.  Do the proper thing when creating the label.
	(ee_ok): Update the gnome calendar appropriately.

	* timeutil.h:
	* gncal-year-view.h: Add some missing prototypes.

	* gncal-full-day.c (child_popup_menu): Set the sensitivity of menu
	items according to whether the ical object is being edited or not.

	* eventedit.c (event_editor_new): Set the "being edited" flag on
	the ical object (stored as the ical object's user data).
	(event_editor_destroy): Release the flag.

	* calobj.h: The iCalObject structure now has a generic user_data pointer.
	* calobj.c (ical_object_set_user_data ical_object_get_user_data):
	Functions to set this data.

svn path=/trunk/; revision=140
This commit is contained in:
Federico Mena Quintero
1998-04-15 22:51:48 +00:00
committed by Arturo Espinosa
parent f89cf24d20
commit 77d15722d2
21 changed files with 456 additions and 195 deletions

View File

@ -1,3 +1,34 @@
1998-04-15 Federico Mena Quintero <federico@nuclecu.unam.mx>
* eventedit.c (ee_init_general_page): The general_owner may be
null. Do the proper thing when creating the label.
(ee_ok): Update the gnome calendar appropriately.
* timeutil.h:
* gncal-year-view.h: Add some missing prototypes.
* gncal-full-day.c (child_popup_menu): Set the sensitivity of menu
items according to whether the ical object is being edited or not.
* eventedit.c (event_editor_new): Set the "being edited" flag on
the ical object (stored as the ical object's user data).
(event_editor_destroy): Release the flag.
* calobj.h: The iCalObject structure now has a generic user_data pointer.
* calobj.c (ical_object_set_user_data ical_object_get_user_data):
Functions to set this data.
* gncal-full-day.c (child_button_press): Do child popup menu correctly.
* main.c (about_calendar_cmd): Fixed my address and added Arturo
to the authors in the about box.
* gncal-full-day.c (find_child_by_window): Compare child's widget
windows by user_data (which will be the parent widget, that is,
the text widget). We cannot assume that child->widget->window
will be *the* window we are interested on because there may be
child widgets with multiple windows.
1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx>
* calobj.c (ical_foreach): Define iterator routine.

View File

@ -1,3 +1,9 @@
Calendar object:
- The warnings spitted when you open the event editor to edit an
existing calendar object happen because the alarm loading code is
not yet finished.
Gnome date selection widget:
- Make the displayed date be localized properly -- use strftime().
@ -8,6 +14,10 @@ Event editor dialog:
Full day view widget:
- Display vertical handle bar at the left of a child to move it.
- Display alarm/whatever flags somewhere.
- Layout the children nicely like M$ Schedule or Netscape Calendar do
(i.e. make them not overlap each other).

View File

@ -686,3 +686,15 @@ ical_foreach (GList *events, iCalObjectFn fn, void *closure)
(*fn) (ical, ical->dtstart, ical->dtend, closure);
}
}
void
ical_object_set_user_data (iCalObject *ical, void *user_data)
{
ical->user_data = user_data;
}
void *
ical_object_get_user_data (iCalObject *ical)
{
return ical->user_data;
}

View File

@ -100,7 +100,8 @@ typedef struct {
typedef enum {
CHANGE_NEW = 1 << 0, /* new object */
CHANGE_SUMMARY = 1 << 1, /* summary */
CHANGE_DATES = 1 << 2 /* dtstart / dtend */
CHANGE_DATES = 1 << 2, /* dtstart / dtend */
CHANGE_ALL = CHANGE_SUMMARY | CHANGE_DATES
} CalObjectChange;
/*
@ -151,6 +152,7 @@ typedef struct {
Recurrence *recur;
int new;
void *user_data; /* Generic data pointer */
} iCalObject;
/* The callback for the recurrence generator */
@ -162,6 +164,8 @@ void ical_object_destroy (iCalObject *ico);
iCalObject *ical_object_create_from_vobject (VObject *obj, const char *object_name);
VObject *ical_object_to_vobject (iCalObject *ical);
void ical_foreach (GList *events, iCalObjectFn fn, void *closure);
void ical_object_set_user_data (iCalObject *ical, void *user_data);
void *ical_object_get_user_data (iCalObject *ical);
END_GNOME_DECLS

View File

@ -686,3 +686,15 @@ ical_foreach (GList *events, iCalObjectFn fn, void *closure)
(*fn) (ical, ical->dtstart, ical->dtend, closure);
}
}
void
ical_object_set_user_data (iCalObject *ical, void *user_data)
{
ical->user_data = user_data;
}
void *
ical_object_get_user_data (iCalObject *ical)
{
return ical->user_data;
}

View File

@ -100,7 +100,8 @@ typedef struct {
typedef enum {
CHANGE_NEW = 1 << 0, /* new object */
CHANGE_SUMMARY = 1 << 1, /* summary */
CHANGE_DATES = 1 << 2 /* dtstart / dtend */
CHANGE_DATES = 1 << 2, /* dtstart / dtend */
CHANGE_ALL = CHANGE_SUMMARY | CHANGE_DATES
} CalObjectChange;
/*
@ -151,6 +152,7 @@ typedef struct {
Recurrence *recur;
int new;
void *user_data; /* Generic data pointer */
} iCalObject;
/* The callback for the recurrence generator */
@ -162,6 +164,8 @@ void ical_object_destroy (iCalObject *ico);
iCalObject *ical_object_create_from_vobject (VObject *obj, const char *object_name);
VObject *ical_object_to_vobject (iCalObject *ical);
void ical_foreach (GList *events, iCalObjectFn fn, void *closure);
void ical_object_set_user_data (iCalObject *ical, void *user_data);
void *ical_object_get_user_data (iCalObject *ical);
END_GNOME_DECLS

View File

@ -12,10 +12,16 @@
#include "main.h"
#include "timeutil.h"
static void event_editor_init (EventEditor *ee);
static void event_editor_class_init (EventEditorClass *class);
static void event_editor_init (EventEditor *ee);
static void event_editor_destroy (GtkObject *object);
/* Note: do not i18n these strings, they are part of the vCalendar protocol */
char *class_names [] = { "PUBLIC", "PRIVATE", "CONFIDENTIAL" };
static char *class_names [] = { "PUBLIC", "PRIVATE", "CONFIDENTIAL" };
static GtkWindowClass *parent_class;
guint
event_editor_get_type (void)
@ -27,7 +33,7 @@ event_editor_get_type (void)
"EventEditor",
sizeof(EventEditor),
sizeof(EventEditorClass),
(GtkClassInitFunc) NULL,
(GtkClassInitFunc) event_editor_class_init,
(GtkObjectInitFunc) event_editor_init,
(GtkArgSetFunc) NULL,
(GtkArgGetFunc) NULL,
@ -37,6 +43,16 @@ event_editor_get_type (void)
return event_editor_type;
}
static void
event_editor_class_init (EventEditorClass *class)
{
GtkObjectClass *object_class;
parent_class = gtk_type_class (gtk_window_get_type ());
object_class->destroy = event_editor_destroy;
}
/*
* when the start time is changed, this adjusts the end time.
*/
@ -263,7 +279,7 @@ ee_create_ae (GtkTable *table, char *str, CalendarAlarm *alarm, enum AlarmType t
break;
default:
/* Nothing */
break;
}
ee_alarm_setting (alarm, alarm->enabled);
@ -379,6 +395,11 @@ ee_store_dlg_values_to_ical (EventEditor *ee)
ical->dtstart = gnome_date_edit_get_date (GNOME_DATE_EDIT (ee->start_time));
ical->dtend = gnome_date_edit_get_date (GNOME_DATE_EDIT (ee->end_time));
if (ical->summary)
g_free (ical->summary);
ical->summary = gtk_editable_get_chars (GTK_EDITABLE (ee->general_summary), 0, -1);
ee_store_alarm (&ical->dalarm, ALARM_DISPLAY);
ee_store_alarm (&ical->aalarm, ALARM_AUDIO);
ee_store_alarm (&ical->palarm, ALARM_PROGRAM);
@ -397,9 +418,6 @@ ee_store_dlg_values_to_ical (EventEditor *ee)
if (ee->ical->new)
ical->created = now;
g_free (ical->summary);
ical->summary = gtk_editable_get_chars (GTK_EDITABLE (ee->general_summary), 0, -1);
}
static void
@ -408,7 +426,9 @@ ee_ok (GtkWidget *widget, EventEditor *ee)
ee_store_dlg_values_to_ical (ee);
if (ee->ical->new)
gnome_calendar_add_object (GNOME_CALENDAR (ee->gnome_cal), ee->ical);
gnome_calendar_add_object (ee->gnome_cal, ee->ical);
else
gnome_calendar_object_changed (ee->gnome_cal, ee->ical, CHANGE_ALL);
gtk_widget_destroy (GTK_WIDGET (ee));
}
@ -416,8 +436,11 @@ ee_ok (GtkWidget *widget, EventEditor *ee)
static void
ee_cancel (GtkWidget *widget, EventEditor *ee)
{
if (ee->ical->new)
if (ee->ical->new) {
ical_object_destroy (ee->ical);
ee->ical = NULL;
}
gtk_widget_destroy (GTK_WIDGET (ee));
}
@ -483,7 +506,7 @@ ee_init_general_page (EventEditor *ee)
l = gtk_label_new (_("Owner:"));
gtk_box_pack_start (GTK_BOX (hbox), l, FALSE, FALSE, 0);
ee->general_owner = gtk_label_new (ee->ical->organizer);
ee->general_owner = gtk_label_new (ee->ical->organizer ? ee->ical->organizer : _("?"));
gtk_misc_set_alignment (GTK_MISC (ee->general_owner), 0.0, 0.5);
gtk_box_pack_start (GTK_BOX (hbox), ee->general_owner, TRUE, TRUE, 4);
@ -874,11 +897,30 @@ event_editor_init (EventEditor *ee)
ee->ical = 0;
}
static void
event_editor_destroy (GtkObject *object)
{
EventEditor *ee;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_EVENT_EDITOR (object));
ee = EVENT_EDITOR (object);
if (ee->ical)
ical_object_set_user_data (ee->ical, NULL); /* we are no longer editing it */
}
GtkWidget *
event_editor_new (GnomeCalendar *gcal, iCalObject *ical)
{
GtkWidget *retval;
EventEditor *ee;
gdk_pointer_ungrab (GDK_CURRENT_TIME);
gdk_flush ();
printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
retval = gtk_type_new (event_editor_get_type ());
ee = EVENT_EDITOR (retval);
@ -886,7 +928,10 @@ event_editor_new (GnomeCalendar *gcal, iCalObject *ical)
if (ical == 0){
ical = ical_new ("Test Comment", user_name, "Test Summary");
ical->new = 1;
}
}
ical_object_set_user_data (ical, ee); /* so that the world can know we are editing it */
ee->ical = ical;
ee->gnome_cal = gcal;
event_editor_init_widgets (ee);

View File

@ -60,6 +60,7 @@ struct menu_item {
char *text;
GtkSignalFunc callback;
gpointer data;
int sensitive;
};
@ -287,6 +288,94 @@ child_range_changed (GncalFullDay *fullday, Child *child)
child->rows_used = rows_used;
}
static void
popup_menu (struct menu_item *items, int nitems, guint32 time)
{
GtkWidget *menu;
GtkWidget *item;
int i;
menu = gtk_menu_new (); /* FIXME: this baby is never freed */
for (i = 0; i < nitems; i++) {
if (items[i].text) {
item = gtk_menu_item_new_with_label (_(items[i].text));
gtk_signal_connect (GTK_OBJECT (item), "activate",
items[i].callback,
items[i].data);
gtk_widget_set_sensitive (item, items[i].sensitive);
} else
item = gtk_menu_item_new ();
gtk_widget_show (item);
gtk_menu_append (GTK_MENU (menu), item);
}
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, time);
}
static void
new_appointment (GtkWidget *widget, gpointer data)
{
GncalFullDay *fullday;
fullday = GNCAL_FULL_DAY (data);
/* FIXME: this should set up the start/end times in the event
* editor to whatever the selection range is. If there is no
* selection, then default to something sensible, like the row
* at which the button was clicked on when popping up the menu.
*/
event_editor_new (fullday->calendar, NULL);
}
static void
edit_appointment (GtkWidget *widget, gpointer data)
{
Child *child;
child = data;
event_editor_new (GNCAL_FULL_DAY (child->widget->parent)->calendar, child->ico);
}
static void
delete_appointment (GtkWidget *widget, gpointer data)
{
Child *child;
child = data;
/* FIXME */
printf ("Yay! delete_appointment() not yet implemented\n");
}
static void
child_popup_menu (GncalFullDay *fullday, Child *child, guint32 event_time)
{
int sensitive;
static struct menu_item child_items[] = {
{ N_("Edit this appointment..."), (GtkSignalFunc) edit_appointment, NULL, TRUE },
{ N_("Delete this appointment"), (GtkSignalFunc) delete_appointment, NULL, TRUE },
{ NULL, NULL, NULL, TRUE },
{ N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL, TRUE }
};
child_items[0].data = child;
child_items[1].data = child;
child_items[3].data = fullday;
sensitive = (ical_object_get_user_data (child->ico) == NULL);
child_items[0].sensitive = sensitive;
child_items[1].sensitive = sensitive;
popup_menu (child_items, sizeof (child_items) / sizeof (child_items[0]), event_time);
}
static void
child_realized_setup (GtkWidget *widget, gpointer data)
{
@ -359,6 +448,24 @@ child_key_press (GtkWidget *widget, GdkEventKey *event, gpointer data)
return FALSE;
}
static gint
child_button_press (GtkWidget *widget, GdkEventButton *event, gpointer data)
{
Child *child;
GncalFullDay *fullday;
if (event->button != 3)
return FALSE;
child = data;
fullday = GNCAL_FULL_DAY (widget->parent);
gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "button_press_event");
child_popup_menu (fullday, child, event->time);
return TRUE;
}
static Child *
child_new (GncalFullDay *fullday, iCalObject *ico)
{
@ -394,6 +501,10 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
(GtkSignalFunc) child_key_press,
child);
gtk_signal_connect (GTK_OBJECT (child->widget), "button_press_event",
(GtkSignalFunc) child_button_press,
child);
/* Finish setup */
gtk_text_set_editable (GTK_TEXT (child->widget), TRUE);
@ -1152,16 +1263,19 @@ find_child_by_window (GncalFullDay *fullday, GdkWindow *window, int *on_text)
{
GList *children;
Child *child;
GtkWidget *owner;
*on_text = FALSE;
gdk_window_get_user_data (window, (gpointer *) &owner);
for (children = fullday->children; children; children = children->next) {
child = children->data;
if (child->window == window)
return child;
if (child->widget->window == window) {
if (child->widget == owner) {
*on_text = TRUE;
return child;
}
@ -1331,81 +1445,11 @@ button_1 (GncalFullDay *fullday, GdkEventButton *event)
return FALSE;
}
static void
popup_menu (struct menu_item *items, int nitems, guint32 time)
{
GtkWidget *menu;
GtkWidget *item;
int i;
menu = gtk_menu_new (); /* FIXME: this baby is never freed */
for (i = 0; i < nitems; i++) {
if (items[i].text) {
item = gtk_menu_item_new_with_label (_(items[i].text));
gtk_signal_connect (GTK_OBJECT (item), "activate",
items[i].callback,
items[i].data);
} else
item = gtk_menu_item_new ();
gtk_widget_show (item);
gtk_menu_append (GTK_MENU (menu), item);
}
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, time);
}
static void
new_appointment (GtkWidget *widget, gpointer data)
{
GncalFullDay *fullday;
fullday = GNCAL_FULL_DAY (data);
/* FIXME: this should set up the start/end times in the event
* editor to whatever the selection range is. If there is no
* selection, then default to something sensible, like the row
* at which the button was clicked on when popping up the menu.
*/
event_editor_new (fullday->calendar, NULL);
}
static void
edit_appointment (GtkWidget *widget, gpointer data)
{
Child *child;
child = data;
event_editor_new (GNCAL_FULL_DAY (child->widget->parent)->calendar, child->ico);
}
static void
delete_appointment (GtkWidget *widget, gpointer data)
{
Child *child;
child = data;
/* FIXME */
printf ("Yay! delete_appointment() not yet implemented\n");
}
static int
button_3 (GncalFullDay *fullday, GdkEventButton *event)
{
static struct menu_item main_items[] = {
{ N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL }
};
static struct menu_item child_items[] = {
{ N_("Properties..."), (GtkSignalFunc) edit_appointment, NULL },
{ N_("Delete this appointment"), (GtkSignalFunc) delete_appointment, NULL },
{ NULL, NULL, NULL },
{ N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL }
{ N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL, TRUE }
};
GtkWidget *widget;
@ -1426,14 +1470,10 @@ button_3 (GncalFullDay *fullday, GdkEventButton *event)
} else {
child = find_child_by_window (fullday, event->window, &on_text);
if (!child)
if (!child || on_text)
return FALSE;
child_items[0].data = child;
child_items[1].data = child;
child_items[3].data = fullday;
popup_menu (child_items, sizeof (child_items) / sizeof (child_items[0]), event->time);
child_popup_menu (fullday, child, event->time);
return TRUE;
}

View File

@ -12,10 +12,16 @@
#include "main.h"
#include "timeutil.h"
static void event_editor_init (EventEditor *ee);
static void event_editor_class_init (EventEditorClass *class);
static void event_editor_init (EventEditor *ee);
static void event_editor_destroy (GtkObject *object);
/* Note: do not i18n these strings, they are part of the vCalendar protocol */
char *class_names [] = { "PUBLIC", "PRIVATE", "CONFIDENTIAL" };
static char *class_names [] = { "PUBLIC", "PRIVATE", "CONFIDENTIAL" };
static GtkWindowClass *parent_class;
guint
event_editor_get_type (void)
@ -27,7 +33,7 @@ event_editor_get_type (void)
"EventEditor",
sizeof(EventEditor),
sizeof(EventEditorClass),
(GtkClassInitFunc) NULL,
(GtkClassInitFunc) event_editor_class_init,
(GtkObjectInitFunc) event_editor_init,
(GtkArgSetFunc) NULL,
(GtkArgGetFunc) NULL,
@ -37,6 +43,16 @@ event_editor_get_type (void)
return event_editor_type;
}
static void
event_editor_class_init (EventEditorClass *class)
{
GtkObjectClass *object_class;
parent_class = gtk_type_class (gtk_window_get_type ());
object_class->destroy = event_editor_destroy;
}
/*
* when the start time is changed, this adjusts the end time.
*/
@ -263,7 +279,7 @@ ee_create_ae (GtkTable *table, char *str, CalendarAlarm *alarm, enum AlarmType t
break;
default:
/* Nothing */
break;
}
ee_alarm_setting (alarm, alarm->enabled);
@ -379,6 +395,11 @@ ee_store_dlg_values_to_ical (EventEditor *ee)
ical->dtstart = gnome_date_edit_get_date (GNOME_DATE_EDIT (ee->start_time));
ical->dtend = gnome_date_edit_get_date (GNOME_DATE_EDIT (ee->end_time));
if (ical->summary)
g_free (ical->summary);
ical->summary = gtk_editable_get_chars (GTK_EDITABLE (ee->general_summary), 0, -1);
ee_store_alarm (&ical->dalarm, ALARM_DISPLAY);
ee_store_alarm (&ical->aalarm, ALARM_AUDIO);
ee_store_alarm (&ical->palarm, ALARM_PROGRAM);
@ -397,9 +418,6 @@ ee_store_dlg_values_to_ical (EventEditor *ee)
if (ee->ical->new)
ical->created = now;
g_free (ical->summary);
ical->summary = gtk_editable_get_chars (GTK_EDITABLE (ee->general_summary), 0, -1);
}
static void
@ -408,7 +426,9 @@ ee_ok (GtkWidget *widget, EventEditor *ee)
ee_store_dlg_values_to_ical (ee);
if (ee->ical->new)
gnome_calendar_add_object (GNOME_CALENDAR (ee->gnome_cal), ee->ical);
gnome_calendar_add_object (ee->gnome_cal, ee->ical);
else
gnome_calendar_object_changed (ee->gnome_cal, ee->ical, CHANGE_ALL);
gtk_widget_destroy (GTK_WIDGET (ee));
}
@ -416,8 +436,11 @@ ee_ok (GtkWidget *widget, EventEditor *ee)
static void
ee_cancel (GtkWidget *widget, EventEditor *ee)
{
if (ee->ical->new)
if (ee->ical->new) {
ical_object_destroy (ee->ical);
ee->ical = NULL;
}
gtk_widget_destroy (GTK_WIDGET (ee));
}
@ -483,7 +506,7 @@ ee_init_general_page (EventEditor *ee)
l = gtk_label_new (_("Owner:"));
gtk_box_pack_start (GTK_BOX (hbox), l, FALSE, FALSE, 0);
ee->general_owner = gtk_label_new (ee->ical->organizer);
ee->general_owner = gtk_label_new (ee->ical->organizer ? ee->ical->organizer : _("?"));
gtk_misc_set_alignment (GTK_MISC (ee->general_owner), 0.0, 0.5);
gtk_box_pack_start (GTK_BOX (hbox), ee->general_owner, TRUE, TRUE, 4);
@ -874,11 +897,30 @@ event_editor_init (EventEditor *ee)
ee->ical = 0;
}
static void
event_editor_destroy (GtkObject *object)
{
EventEditor *ee;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_EVENT_EDITOR (object));
ee = EVENT_EDITOR (object);
if (ee->ical)
ical_object_set_user_data (ee->ical, NULL); /* we are no longer editing it */
}
GtkWidget *
event_editor_new (GnomeCalendar *gcal, iCalObject *ical)
{
GtkWidget *retval;
EventEditor *ee;
gdk_pointer_ungrab (GDK_CURRENT_TIME);
gdk_flush ();
printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
retval = gtk_type_new (event_editor_get_type ());
ee = EVENT_EDITOR (retval);
@ -886,7 +928,10 @@ event_editor_new (GnomeCalendar *gcal, iCalObject *ical)
if (ical == 0){
ical = ical_new ("Test Comment", user_name, "Test Summary");
ical->new = 1;
}
}
ical_object_set_user_data (ical, ee); /* so that the world can know we are editing it */
ee->ical = ical;
ee->gnome_cal = gcal;
event_editor_init_widgets (ee);

View File

@ -60,6 +60,7 @@ struct menu_item {
char *text;
GtkSignalFunc callback;
gpointer data;
int sensitive;
};
@ -287,6 +288,94 @@ child_range_changed (GncalFullDay *fullday, Child *child)
child->rows_used = rows_used;
}
static void
popup_menu (struct menu_item *items, int nitems, guint32 time)
{
GtkWidget *menu;
GtkWidget *item;
int i;
menu = gtk_menu_new (); /* FIXME: this baby is never freed */
for (i = 0; i < nitems; i++) {
if (items[i].text) {
item = gtk_menu_item_new_with_label (_(items[i].text));
gtk_signal_connect (GTK_OBJECT (item), "activate",
items[i].callback,
items[i].data);
gtk_widget_set_sensitive (item, items[i].sensitive);
} else
item = gtk_menu_item_new ();
gtk_widget_show (item);
gtk_menu_append (GTK_MENU (menu), item);
}
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, time);
}
static void
new_appointment (GtkWidget *widget, gpointer data)
{
GncalFullDay *fullday;
fullday = GNCAL_FULL_DAY (data);
/* FIXME: this should set up the start/end times in the event
* editor to whatever the selection range is. If there is no
* selection, then default to something sensible, like the row
* at which the button was clicked on when popping up the menu.
*/
event_editor_new (fullday->calendar, NULL);
}
static void
edit_appointment (GtkWidget *widget, gpointer data)
{
Child *child;
child = data;
event_editor_new (GNCAL_FULL_DAY (child->widget->parent)->calendar, child->ico);
}
static void
delete_appointment (GtkWidget *widget, gpointer data)
{
Child *child;
child = data;
/* FIXME */
printf ("Yay! delete_appointment() not yet implemented\n");
}
static void
child_popup_menu (GncalFullDay *fullday, Child *child, guint32 event_time)
{
int sensitive;
static struct menu_item child_items[] = {
{ N_("Edit this appointment..."), (GtkSignalFunc) edit_appointment, NULL, TRUE },
{ N_("Delete this appointment"), (GtkSignalFunc) delete_appointment, NULL, TRUE },
{ NULL, NULL, NULL, TRUE },
{ N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL, TRUE }
};
child_items[0].data = child;
child_items[1].data = child;
child_items[3].data = fullday;
sensitive = (ical_object_get_user_data (child->ico) == NULL);
child_items[0].sensitive = sensitive;
child_items[1].sensitive = sensitive;
popup_menu (child_items, sizeof (child_items) / sizeof (child_items[0]), event_time);
}
static void
child_realized_setup (GtkWidget *widget, gpointer data)
{
@ -359,6 +448,24 @@ child_key_press (GtkWidget *widget, GdkEventKey *event, gpointer data)
return FALSE;
}
static gint
child_button_press (GtkWidget *widget, GdkEventButton *event, gpointer data)
{
Child *child;
GncalFullDay *fullday;
if (event->button != 3)
return FALSE;
child = data;
fullday = GNCAL_FULL_DAY (widget->parent);
gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "button_press_event");
child_popup_menu (fullday, child, event->time);
return TRUE;
}
static Child *
child_new (GncalFullDay *fullday, iCalObject *ico)
{
@ -394,6 +501,10 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
(GtkSignalFunc) child_key_press,
child);
gtk_signal_connect (GTK_OBJECT (child->widget), "button_press_event",
(GtkSignalFunc) child_button_press,
child);
/* Finish setup */
gtk_text_set_editable (GTK_TEXT (child->widget), TRUE);
@ -1152,16 +1263,19 @@ find_child_by_window (GncalFullDay *fullday, GdkWindow *window, int *on_text)
{
GList *children;
Child *child;
GtkWidget *owner;
*on_text = FALSE;
gdk_window_get_user_data (window, (gpointer *) &owner);
for (children = fullday->children; children; children = children->next) {
child = children->data;
if (child->window == window)
return child;
if (child->widget->window == window) {
if (child->widget == owner) {
*on_text = TRUE;
return child;
}
@ -1331,81 +1445,11 @@ button_1 (GncalFullDay *fullday, GdkEventButton *event)
return FALSE;
}
static void
popup_menu (struct menu_item *items, int nitems, guint32 time)
{
GtkWidget *menu;
GtkWidget *item;
int i;
menu = gtk_menu_new (); /* FIXME: this baby is never freed */
for (i = 0; i < nitems; i++) {
if (items[i].text) {
item = gtk_menu_item_new_with_label (_(items[i].text));
gtk_signal_connect (GTK_OBJECT (item), "activate",
items[i].callback,
items[i].data);
} else
item = gtk_menu_item_new ();
gtk_widget_show (item);
gtk_menu_append (GTK_MENU (menu), item);
}
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, time);
}
static void
new_appointment (GtkWidget *widget, gpointer data)
{
GncalFullDay *fullday;
fullday = GNCAL_FULL_DAY (data);
/* FIXME: this should set up the start/end times in the event
* editor to whatever the selection range is. If there is no
* selection, then default to something sensible, like the row
* at which the button was clicked on when popping up the menu.
*/
event_editor_new (fullday->calendar, NULL);
}
static void
edit_appointment (GtkWidget *widget, gpointer data)
{
Child *child;
child = data;
event_editor_new (GNCAL_FULL_DAY (child->widget->parent)->calendar, child->ico);
}
static void
delete_appointment (GtkWidget *widget, gpointer data)
{
Child *child;
child = data;
/* FIXME */
printf ("Yay! delete_appointment() not yet implemented\n");
}
static int
button_3 (GncalFullDay *fullday, GdkEventButton *event)
{
static struct menu_item main_items[] = {
{ N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL }
};
static struct menu_item child_items[] = {
{ N_("Properties..."), (GtkSignalFunc) edit_appointment, NULL },
{ N_("Delete this appointment"), (GtkSignalFunc) delete_appointment, NULL },
{ NULL, NULL, NULL },
{ N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL }
{ N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL, TRUE }
};
GtkWidget *widget;
@ -1426,14 +1470,10 @@ button_3 (GncalFullDay *fullday, GdkEventButton *event)
} else {
child = find_child_by_window (fullday, event->window, &on_text);
if (!child)
if (!child || on_text)
return FALSE;
child_items[0].data = child;
child_items[1].data = child;
child_items[3].data = fullday;
popup_menu (child_items, sizeof (child_items) / sizeof (child_items[0]), event->time);
child_popup_menu (fullday, child, event->time);
return TRUE;
}

View File

@ -107,11 +107,11 @@ save_calendar_cmd (GtkWidget *widget, void *data)
void
about_calendar_cmd (GtkWidget *widget, void *data)
{
GtkWidget *about;
gchar *authors[] = {
"Miguel de Icaza (miguel@kernel.org)",
"Federico Mena (federico@gimp.org)",
"Federico Mena (quartic@gimp.org)",
"Arturo Espinosa (arturo@nuclecu.unam.mx)",
NULL
};

View File

@ -8,8 +8,8 @@ DCREATED:19980402T023552
UID:KOrganizer - 1804289383
SEQUENCE:1
LAST-MODIFIED:19980330T225948
DTSTART:19980414T003000
DTEND:19980414T010000
DTSTART:19980415T003000
DTEND:19980415T010000
SUMMARY:asdfasdfasfasdfasdf
STATUS:NEEDS ACTION
CLASS:PUBLIC
@ -25,8 +25,8 @@ DCREATED:19980402T023558
UID:KOrganizer - 846930886
SEQUENCE:1
LAST-MODIFIED:19980402T023558
DTSTART:19980414T140000
DTEND:19980414T160000
DTSTART:19980415T140000
DTEND:19980415T160000
SUMMARY:asdfasfdasfasdfasfd
STATUS:NEEDS ACTION
CLASS:PUBLIC

View File

@ -199,4 +199,3 @@ gncal_year_view_update (GncalYearView *yview, iCalObject *ico, int flags)
g_list_free (l);
}
}

View File

@ -49,6 +49,7 @@ struct _GncalYearViewClass {
guint gncal_year_view_get_type (void);
GtkWidget *gncal_year_view_new (GnomeCalendar *calendar, time_t date);
void gncal_year_view_set (GncalYearView *yview, time_t date);
void gncal_year_view_update (GncalYearView *yview, iCalObject *ico, int flags);
END_GNOME_DECLS

View File

@ -107,11 +107,11 @@ save_calendar_cmd (GtkWidget *widget, void *data)
void
about_calendar_cmd (GtkWidget *widget, void *data)
{
GtkWidget *about;
gchar *authors[] = {
"Miguel de Icaza (miguel@kernel.org)",
"Federico Mena (federico@gimp.org)",
"Federico Mena (quartic@gimp.org)",
"Arturo Espinosa (arturo@nuclecu.unam.mx)",
NULL
};

View File

@ -686,3 +686,15 @@ ical_foreach (GList *events, iCalObjectFn fn, void *closure)
(*fn) (ical, ical->dtstart, ical->dtend, closure);
}
}
void
ical_object_set_user_data (iCalObject *ical, void *user_data)
{
ical->user_data = user_data;
}
void *
ical_object_get_user_data (iCalObject *ical)
{
return ical->user_data;
}

View File

@ -100,7 +100,8 @@ typedef struct {
typedef enum {
CHANGE_NEW = 1 << 0, /* new object */
CHANGE_SUMMARY = 1 << 1, /* summary */
CHANGE_DATES = 1 << 2 /* dtstart / dtend */
CHANGE_DATES = 1 << 2, /* dtstart / dtend */
CHANGE_ALL = CHANGE_SUMMARY | CHANGE_DATES
} CalObjectChange;
/*
@ -151,6 +152,7 @@ typedef struct {
Recurrence *recur;
int new;
void *user_data; /* Generic data pointer */
} iCalObject;
/* The callback for the recurrence generator */
@ -162,6 +164,8 @@ void ical_object_destroy (iCalObject *ico);
iCalObject *ical_object_create_from_vobject (VObject *obj, const char *object_name);
VObject *ical_object_to_vobject (iCalObject *ical);
void ical_foreach (GList *events, iCalObjectFn fn, void *closure);
void ical_object_set_user_data (iCalObject *ical, void *user_data);
void *ical_object_get_user_data (iCalObject *ical);
END_GNOME_DECLS

View File

@ -8,8 +8,8 @@ DCREATED:19980402T023552
UID:KOrganizer - 1804289383
SEQUENCE:1
LAST-MODIFIED:19980330T225948
DTSTART:19980414T003000
DTEND:19980414T010000
DTSTART:19980415T003000
DTEND:19980415T010000
SUMMARY:asdfasdfasfasdfasdf
STATUS:NEEDS ACTION
CLASS:PUBLIC
@ -25,8 +25,8 @@ DCREATED:19980402T023558
UID:KOrganizer - 846930886
SEQUENCE:1
LAST-MODIFIED:19980402T023558
DTSTART:19980414T140000
DTEND:19980414T160000
DTSTART:19980415T140000
DTEND:19980415T160000
SUMMARY:asdfasfdasfasdfasfd
STATUS:NEEDS ACTION
CLASS:PUBLIC

View File

@ -31,6 +31,8 @@ char *format_simple_hour (int hour, int use_am_pm);
time_t time_start_of_day (time_t t);
time_t time_end_of_day (time_t t);
time_t time_day_hour (time_t t, int hour);
time_t time_year_begin (int year);
time_t time_year_end (int year);
#endif

View File

@ -199,4 +199,3 @@ gncal_year_view_update (GncalYearView *yview, iCalObject *ico, int flags)
g_list_free (l);
}
}

View File

@ -49,6 +49,7 @@ struct _GncalYearViewClass {
guint gncal_year_view_get_type (void);
GtkWidget *gncal_year_view_new (GnomeCalendar *calendar, time_t date);
void gncal_year_view_set (GncalYearView *yview, time_t date);
void gncal_year_view_update (GncalYearView *yview, iCalObject *ico, int flags);
END_GNOME_DECLS