renamed from editor-page for consistency, more complete implementation

2001-06-01  JP Rosevear  <jpr@ximian.com>

	* gui/dialogs/comp-editor-page.[hc]: renamed from editor-page for
	consistency, more complete implementation

	* gui/dialogs/comp-editor.[hc]: More complete implementation

	* gui/dialogs/*-page.*: The various pages needed to construct the
	event and task dialogs

	* gui/dialogs/comp-editor-util.[hc]: useful utility functions for the
	component editor pages to use

	* gui/dialogs/Makefile.am: Build and install new files

	* gui/event-editor*: Remove, obsoleted by the new comp-editor
	stuff

	* gui/dialogs/task-editor-dialog.glade: ditto

	* gui/e-calendar-table.c (open_task): update to use comp editor
	stuff

	* gui/e-tasks.c (e_tasks_new_task): ditto

	* gui/gnome-cal.c (gnome_calendar_edit_object): ditto

	* gui/Makefile.am: don't build non-existent files nor try to
	install them

svn path=/trunk/; revision=10088
This commit is contained in:
JP Rosevear
2001-06-01 23:54:43 +00:00
committed by JP Rosevear
parent 58d8f86e64
commit f4e8698fdd
36 changed files with 3566 additions and 7757 deletions

View File

@ -1,3 +1,33 @@
2001-06-01 JP Rosevear <jpr@ximian.com>
* gui/dialogs/comp-editor-page.[hc]: renamed from editor-page for
consistency, more complete implementation
* gui/dialogs/comp-editor.[hc]: More complete implementation
* gui/dialogs/*-page.*: The various pages needed to construct the
event and task dialogs
* gui/dialogs/comp-editor-util.[hc]: useful utility functions for the
component editor pages to use
* gui/dialogs/Makefile.am: Build and install new files
* gui/event-editor*: Remove, obsoleted by the new comp-editor
stuff
* gui/dialogs/task-editor-dialog.glade: ditto
* gui/e-calendar-table.c (open_task): update to use comp editor
stuff
* gui/e-tasks.c (e_tasks_new_task): ditto
* gui/gnome-cal.c (gnome_calendar_edit_object): ditto
* gui/Makefile.am: don't build non-existent files nor try to
install them
2001-06-01 JP Rosevear <jpr@ximian.com>
* gui/e-itip-control.c (e_itip_control_factory_init): ditto

View File

@ -42,7 +42,6 @@ INCLUDES = \
gladedir = $(datadir)/evolution/glade
glade_DATA = \
event-editor-dialog.glade \
e-meeting-dialog.glade \
e-itip-control.glade \
goto-dialog.glade
@ -91,8 +90,6 @@ evolution_calendar_SOURCES = \
e-week-view.h \
e-tasks.c \
e-tasks.h \
event-editor.c \
event-editor.h \
gnome-cal.c \
gnome-cal.h \
goto.c \
@ -131,8 +128,7 @@ evolution_calendar_LDADD = \
$(BONOBO_HTML_GNOME_LIBS) \
$(GNOME_VFS_LIBS) \
$(GAL_LIBS) \
$(INTLLIBS) \
$(DB3_LDADD)
$(INTLLIBS)
#evolution_calendar_LDFLAGS = `gnome-config --libs gdk_pixbuf`

View File

@ -24,10 +24,16 @@ libcal_dialogs_a_SOURCES = \
alarm-page.h \
cal-prefs-dialog.c \
cal-prefs-dialog.h \
comp-editor.c \
comp-editor.h \
comp-editor-page.c \
comp-editor-page.h \
comp-editor-util.c \
comp-editor-util.h \
delete-comp.c \
delete-comp.h \
editor-page.c \
editor-page.h \
event-editor.c \
event-editor.h \
event-page.c \
event-page.h \
recurrence-page.c \
@ -35,7 +41,11 @@ libcal_dialogs_a_SOURCES = \
save-comp.c \
save-comp.h \
task-editor.c \
task-editor.h
task-editor.h \
task-details-page.c \
task-details-page.h \
task-page.c \
task-page.h
glade_DATA = \
alarm-notify.glade \
@ -44,7 +54,6 @@ glade_DATA = \
event-page.glade \
recurrence-page.glade \
task-details-page.glade \
task-editor-dialog.glade \
task-page.glade
EXTRA_DIST = \

View File

@ -26,13 +26,15 @@
#include <config.h>
#endif
#include <string.h>
#include <gtk/gtksignal.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-i18n.h>
#include <glade/glade.h>
#include <gal/widgets/e-unicode.h>
#include "cal-util/cal-util.h"
#include "e-util/e-dialog-widgets.h"
#include "cal-util/cal-util.h"
#include "comp-editor-util.h"
#include "alarm-page.h"
@ -47,7 +49,7 @@ struct _AlarmPagePrivate {
GtkWidget *main;
GtkWidget *summary;
GtkWidget *starting_date;
GtkWidget *date_time;
GtkWidget *list;
GtkWidget *add;
@ -58,6 +60,8 @@ struct _AlarmPagePrivate {
GtkWidget *value_units;
GtkWidget *relative;
GtkWidget *time;
gboolean updating;
};
@ -66,14 +70,13 @@ static void alarm_page_class_init (AlarmPageClass *class);
static void alarm_page_init (AlarmPage *apage);
static void alarm_page_destroy (GtkObject *object);
static GtkWidget *alarm_page_get_widget (EditorPage *page);
static void alarm_page_fill_widgets (EditorPage *page, CalComponent *comp);
static void alarm_page_fill_component (EditorPage *page, CalComponent *comp);
static void alarm_page_set_summary (EditorPage *page, const char *summary);
static char *alarm_page_get_summary (EditorPage *page);
static void alarm_page_set_dates (EditorPage *page, time_t start, time_t end);
static GtkWidget *alarm_page_get_widget (CompEditorPage *page);
static void alarm_page_fill_widgets (CompEditorPage *page, CalComponent *comp);
static void alarm_page_fill_component (CompEditorPage *page, CalComponent *comp);
static void alarm_page_set_summary (CompEditorPage *page, const char *summary);
static void alarm_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
static EditorPageClass *parent_class = NULL;
static CompEditorPageClass *parent_class = NULL;
@ -102,7 +105,8 @@ alarm_page_get_type (void)
(GtkClassInitFunc) NULL
};
alarm_page_type = gtk_type_unique (TYPE_EDITOR_PAGE, &alarm_page_info);
alarm_page_type = gtk_type_unique (TYPE_COMP_EDITOR_PAGE,
&alarm_page_info);
}
return alarm_page_type;
@ -112,19 +116,18 @@ alarm_page_get_type (void)
static void
alarm_page_class_init (AlarmPageClass *class)
{
EditorPageClass *editor_page_class;
CompEditorPageClass *editor_page_class;
GtkObjectClass *object_class;
editor_page_class = (EditorPageClass *) class;
editor_page_class = (CompEditorPageClass *) class;
object_class = (GtkObjectClass *) class;
parent_class = gtk_type_class (TYPE_EDITOR_PAGE);
parent_class = gtk_type_class (TYPE_COMP_EDITOR_PAGE);
editor_page_class->get_widget = alarm_page_get_widget;
editor_page_class->fill_widgets = alarm_page_fill_widgets;
editor_page_class->fill_component = alarm_page_fill_component;
editor_page_class->set_summary = alarm_page_set_summary;
editor_page_class->get_summary = alarm_page_get_summary;
editor_page_class->set_dates = alarm_page_set_dates;
object_class->destroy = alarm_page_destroy;
@ -143,7 +146,7 @@ alarm_page_init (AlarmPage *apage)
priv->main = NULL;
priv->summary = NULL;
priv->starting_date = NULL;
priv->date_time = NULL;
priv->list = NULL;
priv->add = NULL;
priv->delete = NULL;
@ -152,6 +155,8 @@ alarm_page_init (AlarmPage *apage)
priv->value_units = NULL;
priv->relative = NULL;
priv->time = NULL;
priv->updating = FALSE;
}
/* Frees all the alarm data and empties the list */
@ -159,24 +164,25 @@ static void
free_alarms (AlarmPage *apage)
{
AlarmPagePrivate *priv;
GtkCList *clist;
int i;
priv = apage->priv;
clist = GTK_CLIST (priv->list);
if (priv->list != NULL) {
GtkCList *clist = GTK_CLIST (priv->list);
for (i = 0; i < clist->rows; i++) {
CalComponentAlarm *alarm;
alarm = gtk_clist_get_row_data (clist, i);
g_assert (alarm != NULL);
cal_component_alarm_free (alarm);
gtk_clist_set_row_data (clist, i, NULL);
for (i = 0; i < clist->rows; i++) {
CalComponentAlarm *alarm;
alarm = gtk_clist_get_row_data (clist, i);
g_assert (alarm != NULL);
cal_component_alarm_free (alarm);
gtk_clist_set_row_data (clist, i, NULL);
}
gtk_clist_clear (clist);
}
gtk_clist_clear (clist);
}
/* Destroy handler for the alarm page */
@ -210,7 +216,7 @@ alarm_page_destroy (GtkObject *object)
/* get_widget handler for the alarm page */
static GtkWidget *
alarm_page_get_widget (EditorPage *page)
alarm_page_get_widget (CompEditorPage *page)
{
AlarmPage *apage;
AlarmPagePrivate *priv;
@ -230,10 +236,10 @@ clear_widgets (AlarmPage *apage)
priv = apage->priv;
/* Summary */
e_dialog_editable_set (priv->summary, NULL);
gtk_label_set_text (GTK_LABEL (priv->summary), "");
/* Start date */
gtk_label_set_text (GTK_LABEL (priv->starting_date), "");
gtk_label_set_text (GTK_LABEL (priv->date_time), "");
/* List data */
free_alarms (apage);
@ -310,6 +316,7 @@ get_alarm_string (CalComponentAlarm *alarm)
case CAL_ALARM_NONE:
case CAL_ALARM_UNKNOWN:
default:
base = _("Unknown");
break;
}
@ -344,6 +351,7 @@ get_alarm_string (CalComponentAlarm *alarm)
break;
case CAL_ALARM_TRIGGER_NONE:
case CAL_ALARM_TRIGGER_ABSOLUTE:
default:
str = g_strdup_printf ("%s %s", base,
_("Unknown"));
break;
@ -377,22 +385,31 @@ append_reminder (AlarmPage *apage, CalComponentAlarm *alarm)
/* fill_widgets handler for the alarm page */
static void
alarm_page_fill_widgets (EditorPage *page, CalComponent *comp)
alarm_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
{
AlarmPage *apage;
AlarmPagePrivate *priv;
CalComponentText text;
GList *alarms, *l;
GtkCList *clist;
CompEditorPageDates dates;
apage = ALARM_PAGE (page);
priv = apage->priv;
/* Don't send off changes during this time */
priv->updating = TRUE;
/* Clean the page */
clear_widgets (apage);
/* Summary */
cal_component_get_summary (comp, &text);
e_dialog_editable_set (priv->summary, text.value);
alarm_page_set_summary (page, text.value);
/* Dates */
comp_editor_dates (&dates, comp);
alarm_page_set_dates (page, &dates);
/* List */
if (!cal_component_has_alarms (comp))
@ -415,11 +432,13 @@ alarm_page_fill_widgets (EditorPage *page, CalComponent *comp)
append_reminder (apage, ca_copy);
}
cal_obj_uid_list_free (alarms);
priv->updating = FALSE;
}
/* fill_component handler for the alarm page */
static void
alarm_page_fill_component (EditorPage *page, CalComponent *comp)
alarm_page_fill_component (CompEditorPage *page, CalComponent *comp)
{
AlarmPage *apage;
AlarmPagePrivate *priv;
@ -462,48 +481,31 @@ alarm_page_fill_component (EditorPage *page, CalComponent *comp)
/* set_summary handler for the alarm page */
static void
alarm_page_set_summary (EditorPage *page, const char *summary)
alarm_page_set_summary (CompEditorPage *page, const char *summary)
{
AlarmPage *apage;
AlarmPagePrivate *priv;
gchar *s;
apage = ALARM_PAGE (page);
priv = apage->priv;
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->summary), apage);
e_utf8_gtk_entry_set_text (GTK_ENTRY (priv->summary), summary);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->summary), apage);
}
/* get_summary handler for the alarm page */
static char *
alarm_page_get_summary (EditorPage *page)
{
AlarmPage *apage;
AlarmPagePrivate *priv;
apage = ALARM_PAGE (page);
priv = apage->priv;
return e_utf8_gtk_entry_get_text (GTK_ENTRY (priv->summary));
s = e_utf8_to_gtk_string (priv->summary, summary);
gtk_label_set_text (GTK_LABEL (priv->summary), s);
g_free (s);
}
/* set_dates handler for the alarm page */
static void
alarm_page_set_dates (EditorPage *page, time_t start, time_t end)
alarm_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
{
AlarmPage *apage;
AlarmPagePrivate *priv;
char str[128];
struct tm tm;
apage = ALARM_PAGE (page);
priv = apage->priv;
tm = *localtime (&start);
strftime (str, sizeof (str), _("%A %b %d %Y %H:%M:%S"), &tm);
gtk_label_set_text (GTK_LABEL (priv->starting_date), str);
comp_editor_date_label (dates, priv->date_time);
}
@ -554,23 +556,18 @@ static gboolean
get_widgets (AlarmPage *apage)
{
AlarmPagePrivate *priv;
GtkWidget *toplevel;
priv = apage->priv;
#define GW(name) glade_xml_get_widget (priv->xml, name)
toplevel = GW ("alarm-toplevel");
priv->main = GW ("alarm-page");
if (!(toplevel && priv->main))
return FALSE;
g_assert (priv->main);
gtk_widget_ref (priv->main);
gtk_widget_unparent (priv->main);
gtk_widget_destroy (toplevel);
priv->summary = GW ("summary");
priv->starting_date = GW ("starting-date");
priv->date_time = GW ("date-time");
priv->list = GW ("list");
priv->add = GW ("add");
@ -585,7 +582,7 @@ get_widgets (AlarmPage *apage)
#undef GW
return (priv->summary
&& priv->starting_date
&& priv->date_time
&& priv->list
&& priv->add
&& priv->delete
@ -596,24 +593,18 @@ get_widgets (AlarmPage *apage)
&& priv->time);
}
/* Callback used when the summary changes; we emit the notification signal. */
static void
summary_changed_cb (GtkEditable *editable, gpointer data)
{
AlarmPage *apage;
apage = ALARM_PAGE (data);
editor_page_notify_summary_changed (EDITOR_PAGE (apage));
}
/* This is called when any field is changed; it notifies upstream. */
static void
field_changed_cb (GtkWidget *widget, gpointer data)
{
AlarmPage *apage;
AlarmPagePrivate *priv;
apage = ALARM_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (apage));
priv = apage->priv;
if (!priv->updating)
comp_editor_page_notify_changed (COMP_EDITOR_PAGE (apage));
}
/* Callback used for the "add reminder" button */
@ -639,15 +630,18 @@ add_clicked_cb (GtkButton *button, gpointer data)
switch (e_dialog_option_menu_get (priv->value_units, value_map)) {
case MINUTES:
trigger.u.rel_duration.minutes = e_dialog_spin_get_int (priv->interval_value);
trigger.u.rel_duration.minutes =
e_dialog_spin_get_int (priv->interval_value);
break;
case HOURS:
trigger.u.rel_duration.hours = e_dialog_spin_get_int (priv->interval_value);
trigger.u.rel_duration.hours =
e_dialog_spin_get_int (priv->interval_value);
break;
case DAYS:
trigger.u.rel_duration.days = e_dialog_spin_get_int (priv->interval_value);
trigger.u.rel_duration.days =
e_dialog_spin_get_int (priv->interval_value);
break;
default:
@ -702,10 +696,6 @@ init_widgets (AlarmPage *apage)
priv = apage->priv;
/* Summary */
gtk_signal_connect (GTK_OBJECT (priv->summary), "changed",
GTK_SIGNAL_FUNC (summary_changed_cb), apage);
/* Reminder buttons */
gtk_signal_connect (GTK_OBJECT (priv->add), "clicked",
GTK_SIGNAL_FUNC (add_clicked_cb), apage);
@ -739,14 +729,17 @@ alarm_page_construct (AlarmPage *apage)
priv = apage->priv;
priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/alarm-page.glade", NULL);
priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/alarm-page.glade",
NULL);
if (!priv->xml) {
g_message ("alarm_page_construct(): Could not load the Glade XML file!");
g_message ("alarm_page_construct(): "
"Could not load the Glade XML file!");
return NULL;
}
if (!get_widgets (apage)) {
g_message ("alarm_page_construct(): Could not find all widgets in the XML file!");
g_message ("alarm_page_construct(): "
"Could not find all widgets in the XML file!");
return NULL;
}

View File

@ -18,6 +18,7 @@
<widget>
<class>GtkWindow</class>
<name>alarm-toplevel</name>
<visible>False</visible>
<title>window1</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_NONE</position>
@ -36,7 +37,7 @@
<widget>
<class>GtkFrame</class>
<name>frame33</name>
<label>Appointment Basics</label>
<label>Basics</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
@ -58,14 +59,13 @@
<widget>
<class>GtkLabel</class>
<name>label62</name>
<label>Su_mmary:</label>
<label>Summary:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>reminder-summary</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
@ -82,34 +82,10 @@
</child>
</widget>
<widget>
<class>GtkEntry</class>
<name>reminder-summary</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>True</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label63</name>
<label>_Starting date:</label>
<label>Date/Time:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
@ -134,13 +110,13 @@
<widget>
<class>GtkLabel</class>
<name>starting date</name>
<label>assbarn it</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<name>date-time</name>
<label></label>
<justify>GTK_JUSTIFY_LEFT</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0</yalign>
<xpad>0</xpad>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>4</xpad>
<ypad>0</ypad>
<child>
<left_attach>1</left_attach>
@ -157,6 +133,32 @@
<yfill>True</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>summary</name>
<label></label>
<justify>GTK_JUSTIFY_LEFT</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>4</xpad>
<ypad>0</ypad>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
</widget>
@ -192,7 +194,7 @@
<widget>
<class>GtkOptionMenu</class>
<name>reminder-action</name>
<name>action</name>
<can_focus>True</can_focus>
<items>Show a dialog
Play a sound
@ -209,7 +211,7 @@ Run a program
<widget>
<class>GtkSpinButton</class>
<name>reminder-interval-value</name>
<name>interval-value</name>
<can_focus>True</can_focus>
<climb_rate>1</climb_rate>
<digits>0</digits>
@ -232,7 +234,7 @@ Run a program
<widget>
<class>GtkOptionMenu</class>
<name>reminder-value-units</name>
<name>value-units</name>
<can_focus>True</can_focus>
<items>minute(s)
hour(s)
@ -248,7 +250,7 @@ day(s)
<widget>
<class>GtkOptionMenu</class>
<name>reminder-relative</name>
<name>relative</name>
<can_focus>True</can_focus>
<items>before
after
@ -263,7 +265,7 @@ after
<widget>
<class>GtkOptionMenu</class>
<name>reminder-time</name>
<name>time</name>
<can_focus>True</can_focus>
<items>start of appointment
end of appointment
@ -281,7 +283,6 @@ end of appointment
<name>button9</name>
<can_focus>True</can_focus>
<label>Settings...</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
@ -316,7 +317,7 @@ end of appointment
<widget>
<class>GtkCList</class>
<name>reminder-list</name>
<name>list</name>
<can_focus>True</can_focus>
<columns>1</columns>
<column_widths>80</column_widths>
@ -356,20 +357,18 @@ end of appointment
<widget>
<class>GtkButton</class>
<name>reminder-add</name>
<name>add</name>
<can_default>True</can_default>
<can_focus>True</can_focus>
<label>Add</label>
<relief>GTK_RELIEF_NORMAL</relief>
</widget>
<widget>
<class>GtkButton</class>
<name>reminder-delete</name>
<name>delete</name>
<can_default>True</can_default>
<can_focus>True</can_focus>
<label>Delete</label>
<relief>GTK_RELIEF_NORMAL</relief>
</widget>
</widget>
</widget>

View File

@ -25,7 +25,7 @@
#ifndef ALARM_PAGE_H
#define ALARM_PAGE_H
#include "editor-page.h"
#include "comp-editor-page.h"
BEGIN_GNOME_DECLS
@ -33,29 +33,27 @@ BEGIN_GNOME_DECLS
#define TYPE_ALARM_PAGE (alarm_page_get_type ())
#define ALARM_PAGE(obj) (GTK_CHECK_CAST ((obj), TYPE_ALARM_PAGE, AlarmPage))
#define ALARM_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_ALARM_PAGE, \
AlarmPageClass))
#define ALARM_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_ALARM_PAGE, AlarmPageClass))
#define IS_ALARM_PAGE(obj) (GTK_CHECK_TYPE ((obj), TYPE_ALARM_PAGE))
#define IS_ALARM_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), TYPE_ALARM_PAGE))
typedef struct _AlarmPagePrivate AlarmPagePrivate;
typedef struct {
EditorPage page;
CompEditorPage page;
/* Private data */
AlarmPagePrivate *priv;
} AlarmPage;
typedef struct {
EditorPageClass parent_class;
CompEditorPageClass parent_class;
} AlarmPageClass;
GtkType alarm_page_get_type (void);
GtkType alarm_page_get_type (void);
AlarmPage *alarm_page_construct (AlarmPage *apage);
AlarmPage *alarm_page_new (void);
AlarmPage *alarm_page_new (void);

View File

@ -0,0 +1,277 @@
/* Evolution calendar - Base class for calendar component editor pages
*
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Federico Mena-Quintero <federico@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <gtk/gtksignal.h>
#include "comp-editor-page.h"
static void comp_editor_page_class_init (CompEditorPageClass *class);
/* Signal IDs */
enum {
CHANGED,
SUMMARY_CHANGED,
DATES_CHANGED,
LAST_SIGNAL
};
static guint comp_editor_page_signals[LAST_SIGNAL];
#define CLASS(page) (COMP_EDITOR_PAGE_CLASS (GTK_OBJECT (page)->klass))
/**
* comp_editor_page_get_type:
*
* Registers the #CompEditorPage class if necessary, and returns the type ID
* associated to it.
*
* Return value: The type ID of the #CompEditorPage class.
**/
GtkType
comp_editor_page_get_type (void)
{
static GtkType comp_editor_page_type = 0;
if (!comp_editor_page_type) {
static const GtkTypeInfo comp_editor_page_info = {
"CompEditorPage",
sizeof (CompEditorPage),
sizeof (CompEditorPageClass),
(GtkClassInitFunc) comp_editor_page_class_init,
(GtkObjectInitFunc) NULL,
NULL, /* reserved_1 */
NULL, /* reserved_2 */
(GtkClassInitFunc) NULL
};
comp_editor_page_type =
gtk_type_unique (GTK_TYPE_OBJECT,
&comp_editor_page_info);
}
return comp_editor_page_type;
}
/* Class initialization function for the abstract editor page */
static void
comp_editor_page_class_init (CompEditorPageClass *class)
{
GtkObjectClass *object_class;
object_class = (GtkObjectClass *) class;
comp_editor_page_signals[CHANGED] =
gtk_signal_new ("changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (CompEditorPageClass,
changed),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
comp_editor_page_signals[SUMMARY_CHANGED] =
gtk_signal_new ("summary_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (CompEditorPageClass,
summary_changed),
gtk_marshal_NONE__POINTER,
GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
comp_editor_page_signals[DATES_CHANGED] =
gtk_signal_new ("dates_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (CompEditorPageClass,
dates_changed),
gtk_marshal_NONE__POINTER,
GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
gtk_object_class_add_signals (object_class,
comp_editor_page_signals,
LAST_SIGNAL);
class->changed = NULL;
class->summary_changed = NULL;
class->dates_changed = NULL;
class->get_widget = NULL;
class->fill_widgets = NULL;
class->fill_component = NULL;
class->set_summary = NULL;
class->set_dates = NULL;
}
/**
* comp_editor_page_get_widget:
* @page: An editor page.
*
* Queries the main widget of an editor page.
*
* Return value: The widget that is the page's upper container. It should
* normally be inserted in a notebook widget.
**/
GtkWidget *
comp_editor_page_get_widget (CompEditorPage *page)
{
g_return_val_if_fail (page != NULL, NULL);
g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), NULL);
g_assert (CLASS (page)->get_widget != NULL);
return (* CLASS (page)->get_widget) (page);
}
/**
* comp_editor_page_fill_widgets:
* @page: An editor page.
* @comp: A calendar component.
*
* Fills the widgets of an editor page with the data from a calendar component.
**/
void
comp_editor_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
g_return_if_fail (comp != NULL);
g_assert (CLASS (page)->fill_widgets != NULL);
(* CLASS (page)->fill_widgets) (page, comp);
}
/**
* comp_editor_page_fill_component:
* @page: An editor page.
* @comp: A calendar component.
*
* Takes the data from the widgets of an editor page and sets it on a calendar
* component, replacing the contents of the properties that the editor page
* knows how to manipulate.
**/
void
comp_editor_page_fill_component (CompEditorPage *page, CalComponent *comp)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
g_return_if_fail (comp != NULL);
if (CLASS (page)->fill_component != NULL)
(* CLASS (page)->fill_component) (page, comp);
}
/**
* comp_editor_page_set_summary:
* @page: An editor page
* @summary: The text of the new summary value
*
* Sets the summary value for this group of widgets
**/
void
comp_editor_page_set_summary (CompEditorPage *page, const char *summary)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
if (CLASS (page)->set_summary != NULL)
(* CLASS (page)->set_summary) (page, summary);
}
/**
* comp_editor_page_set_dates:
* @page: An editor page
* @dates: A collection of various dates in time_t format
*
* Sets the date values for this group of widgets
**/
void
comp_editor_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
if (CLASS (page)->set_dates != NULL)
(* CLASS (page)->set_dates) (page, dates);
}
/**
* comp_editor_page_notify_changed:
* @page: An editor page.
*
* Makes an editor page emit the "changed" signal. This is meant to be
* used only by page implementations.
**/
void
comp_editor_page_notify_changed (CompEditorPage *page)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
gtk_signal_emit (GTK_OBJECT (page), comp_editor_page_signals[CHANGED]);
}
/**
* comp_editor_page_notify_summary_changed:
* @page: An editor page.
*
* Makes an editor page emit the "summary_changed" signal. This is meant to be
* used only by page implementations.
**/
void
comp_editor_page_notify_summary_changed (CompEditorPage *page,
const char *summary)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
gtk_signal_emit (GTK_OBJECT (page),
comp_editor_page_signals[SUMMARY_CHANGED],
summary);
}
/**
* comp_editor_page_notify_dates_changed:
* @page: An editor page.
*
* Makes an editor page emit the "dates_changed" signal. This is meant to be
* used only by page implementations.
**/
void
comp_editor_page_notify_dates_changed (CompEditorPage *page,
CompEditorPageDates *dates)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
gtk_signal_emit (GTK_OBJECT (page),
comp_editor_page_signals[DATES_CHANGED],
dates);
}

View File

@ -0,0 +1,93 @@
/* Evolution calendar - Base class for calendar component editor pages
*
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Federico Mena-Quintero <federico@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef COMP_EDITOR_PAGE_H
#define COMP_EDITOR_PAGE_H
#include <time.h>
#include <libgnome/gnome-defs.h>
#include <gtk/gtkwidget.h>
#include <cal-util/cal-component.h>
BEGIN_GNOME_DECLS
#define TYPE_COMP_EDITOR_PAGE (comp_editor_page_get_type ())
#define COMP_EDITOR_PAGE(obj) (GTK_CHECK_CAST ((obj), TYPE_COMP_EDITOR_PAGE, CompEditorPage))
#define COMP_EDITOR_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_COMP_EDITOR_PAGE, CompEditorPageClass))
#define IS_COMP_EDITOR_PAGE(obj) (GTK_CHECK_TYPE ((obj), TYPE_COMP_EDITOR_PAGE))
#define IS_COMP_EDITOR_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), TYPE_COMP_EDITOR_PAGE))
typedef struct {
time_t start;
time_t end;
time_t due;
time_t complete;
} CompEditorPageDates;
typedef struct {
GtkObject object;
} CompEditorPage;
typedef struct {
GtkObjectClass parent_class;
/* Notification signals */
void (* changed) (CompEditorPage *page);
void (* summary_changed) (CompEditorPage *page, const char *summary);
void (* dates_changed) (CompEditorPage *page, const char *dates);
/* Virtual methods */
GtkWidget *(* get_widget) (CompEditorPage *page);
void (* fill_widgets) (CompEditorPage *page, CalComponent *comp);
void (* fill_component) (CompEditorPage *page, CalComponent *comp);
void (* set_summary) (CompEditorPage *page, const char *summary);
void (* set_dates) (CompEditorPage *page, CompEditorPageDates *dates);
} CompEditorPageClass;
GtkType comp_editor_page_get_type (void);
GtkWidget *comp_editor_page_get_widget (CompEditorPage *page);
void comp_editor_page_fill_widgets (CompEditorPage *page,
CalComponent *comp);
void comp_editor_page_fill_component (CompEditorPage *page,
CalComponent *comp);
void comp_editor_page_set_summary (CompEditorPage *page,
const char *summary);
void comp_editor_page_set_dates (CompEditorPage *page,
CompEditorPageDates *dates);
void comp_editor_page_notify_changed (CompEditorPage *page);
void comp_editor_page_notify_summary_changed (CompEditorPage *page,
const char *summary);
void comp_editor_page_notify_dates_changed (CompEditorPage *page,
CompEditorPageDates *dates);
END_GNOME_DECLS
#endif

View File

@ -0,0 +1,129 @@
/* Evolution calendar - Widget utilities
*
* Copyright (C) 2000 Helix Code, Inc.
*
* Author: Federico Mena-Quintero <federico@helixcode.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string.h>
#include <glib.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-i18n.h>
#include <e-util/e-time-utils.h>
#include "../calendar-config.h"
#include "comp-editor-util.h"
/**
* comp_editor_dates:
* @dates: A structure to be filled out with dates of a component
* @comp: The component to extract the dates from
*
* Extracts the dates from the calendar component into the
* CompEditorPageDates structure
**/
void
comp_editor_dates (CompEditorPageDates *dates, CalComponent *comp)
{
CalComponentDateTime dt;
struct icaltimetype *completed;
dates->start = 0;
dates->end = 0;
dates->due = 0;
dates->complete = 0;
cal_component_get_dtstart (comp, &dt);
if (dt.value)
dates->start = icaltime_as_timet (*dt.value);
cal_component_get_dtend (comp, &dt);
if (dt.value)
dates->end = icaltime_as_timet (*dt.value);
cal_component_get_due (comp, &dt);
if (dt.value)
dates->due = icaltime_as_timet (*dt.value);
cal_component_get_completed (comp, &completed);
if (completed) {
dates->complete = icaltime_as_timet (*completed);
cal_component_free_icaltimetype (completed);
}
}
static void
write_label_piece (time_t t, char *buffer, int size, char *stext, char *etext)
{
struct tm *tmp_tm;
int len;
tmp_tm = localtime (&t);
if (stext != NULL)
strcat (buffer, stext);
len = strlen (buffer);
e_time_format_date_and_time (tmp_tm,
calendar_config_get_24_hour_format (),
FALSE, FALSE,
&buffer[len], size - len);
if (etext != NULL)
strcat (buffer, etext);
}
/**
* comp_editor_date_label:
* @dates: The dates to use in constructing a label
* @label: The label whose text is to be set
*
* Set the text of a label based on the dates available and the user's
* formatting preferences
**/
void
comp_editor_date_label (CompEditorPageDates *dates, GtkWidget *label)
{
static char buffer[1024];
buffer[0] = '\0';
if (dates->start > 0)
write_label_piece (dates->start, buffer, 1024, NULL, NULL);
if (dates->end > 0 && dates->start > 0)
write_label_piece (dates->end, buffer, 1024, _(" to "), NULL);
if (dates->complete > 0) {
if (dates->start > 0)
write_label_piece (dates->complete, buffer, 1024, _(" (Completed "), ")");
else
write_label_piece (dates->complete, buffer, 1024, _(" Completed "), NULL);
}
if (dates->due > 0 && dates->complete == 0) {
if (dates->start > 0)
write_label_piece (dates->due, buffer, 1024, _(" (Due "), ")");
else
write_label_piece (dates->due, buffer, 1024, _("Due "), NULL);
}
gtk_label_set_text (GTK_LABEL (label), buffer);
}

View File

@ -0,0 +1,31 @@
/* Evolution calendar - Widget utilities
*
* Copyright (C) 2000 Helix Code, Inc.
*
* Author: JP Rosevear <jpr@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _COMP_EDITOR_UTIL_H_
#define _COMP_EDITOR_UTIL_H_
#include <gtk/gtkwidget.h>
#include "comp-editor-page.h"
void comp_editor_dates (CompEditorPageDates *date, CalComponent *comp);
void comp_editor_date_label (CompEditorPageDates *dates, GtkWidget *label);
#endif

View File

@ -23,12 +23,21 @@
#include <config.h>
#endif
#include <gnome.h>
#include <gal/widgets/e-unicode.h>
#include "save-comp.h"
#include "comp-editor.h"
/* Private part of the CompEditor structure */
struct _CompEditorPrivate {
/* Client to use */
CalClient *client;
/* Calendar object/uid we are editing; this is an internal copy */
CalComponent *comp;
/* The pages we have */
GList *pages;
@ -37,6 +46,8 @@ struct _CompEditorPrivate {
/* Notebook to hold the pages */
GtkNotebook *notebook;
gboolean changed;
};
@ -45,6 +56,15 @@ static void comp_editor_class_init (CompEditorClass *class);
static void comp_editor_init (CompEditor *editor);
static void comp_editor_destroy (GtkObject *object);
static void page_summary_changed_cb (GtkWidget *widget, const char *summary, gpointer data);
static void page_dates_changed_cb (GtkWidget *widget, CompEditorPageDates *dates, gpointer data);
static void page_changed_cb (GtkWidget *widget, gpointer data);
static void save_clicked_cb (GtkWidget *widget, gpointer data);
static void close_clicked_cb (GtkWidget *widget, gpointer data);
static void help_clicked_cb (GtkWidget *widget, gpointer data);
static gint delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data);
static GtkObjectClass *parent_class;
@ -52,21 +72,22 @@ static GtkObjectClass *parent_class;
GtkType
comp_editor_get_type (void)
{
static GtkType comp_editor_type;
static GtkType comp_editor_type = 0;
if (!comp_editor_type) {
static const GtkTypeInfo comp_editor_info = {
GtkTypeInfo comp_editor_info = {
"CompEditor",
sizeof (CompEditor),
sizeof (CompEditorClass),
(GtkClassInitFunc) comp_editor_class_init,
(GtkObjectInitfunc) comp_editor_init,
(GtkObjectInitFunc) comp_editor_init,
NULL, /* reserved_1 */
NULL, /* reserved_2 */
(GtkClassInitFunc) NULL
}
};
comp_editor_type = gtk_type_unique (GTK_TYPE_OBJECT, &comp_editor_info);
comp_editor_type = gtk_type_unique (GTK_TYPE_OBJECT,
&comp_editor_info);
}
return comp_editor_type;
@ -110,23 +131,30 @@ setup_widgets (CompEditor *editor)
/* Notebook */
priv->notebook = GTK_NOTEBOOK (gtk_notebook_new ());
gtk_box_pack_start (GTK_BOX (vbox), priv->notebook, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->notebook),
TRUE, TRUE, 0);
/* Buttons */
bbox = gtk_hbutton_box_new ();
gtk_hbutton_box_set_layout_default (GTK_HBUTTON_BOX (bbox), GTK_BUTTONBOX_END);
gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0);
pixmap = gnome_stock_pixmap_widget (NULL, GNOME_STOCK_PIXMAP_SAVE);
button = gnome_pixmap_button (pixmap, _("Save"));
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (save_clicked_cb), editor);
button = gnome_stock_button (GNOME_STOCK_BUTTON_CLOSE);
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (close_clicked_cb), editor);
button = gnome_stock_button (GNOME_STOCK_BUTTON_HELP);
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (help_clicked_cb), editor);
}
/* Object initialization function for the calendar component editor */
@ -141,6 +169,7 @@ comp_editor_init (CompEditor *editor)
setup_widgets (editor);
priv->pages = NULL;
priv->changed = FALSE;
}
/* Destroy handler for the calendar component editor */
@ -167,8 +196,18 @@ comp_editor_destroy (GtkObject *object)
/**
* comp_editor_append_page:
* @editor: A component editor
* @page: Top level widget of the page
* @label: Label of the page
*
* Appends a page to the editor notebook with the given label
**/
void
comp_editor_append_page (CompEditor *editor, EditorPage *page, const char *label)
comp_editor_append_page (CompEditor *editor,
CompEditorPage *page,
const char *label)
{
CompEditorPrivate *priv;
GtkWidget *page_widget;
@ -177,7 +216,7 @@ comp_editor_append_page (CompEditor *editor, EditorPage *page, const char *label
g_return_if_fail (editor != NULL);
g_return_if_fail (IS_COMP_EDITOR (editor));
g_return_if_fail (page != NULL);
g_return_if_fail (IS_EDITOR_PAGE (page));
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
g_return_if_fail (label != NULL);
priv = editor->priv;
@ -185,11 +224,333 @@ comp_editor_append_page (CompEditor *editor, EditorPage *page, const char *label
/* Only allow adding the pages while a component has not been set */
g_return_if_fail (priv->comp == NULL);
page_widget = editor_page_get_widget (page);
page_widget = comp_editor_page_get_widget (page);
g_assert (page_widget != NULL);
label_widget = gtk_label_new (label);
priv->pages = g_list_append (priv->pages, page);
gtk_notebook_append_page (priv->notebook, page_widget, label_widget);
/* Listen for things happening on the page */
gtk_signal_connect (GTK_OBJECT (page), "summary_changed",
GTK_SIGNAL_FUNC (page_summary_changed_cb), editor);
gtk_signal_connect (GTK_OBJECT (page), "dates_changed",
GTK_SIGNAL_FUNC (page_dates_changed_cb), editor);
gtk_signal_connect (GTK_OBJECT (page), "changed",
GTK_SIGNAL_FUNC (page_changed_cb), editor);
}
/**
* comp_editor_set_cal_client:
* @editor: A component editor
* @client: The calendar client to use
*
* Sets the calendar client used by the editor to update components
**/
void
comp_editor_set_cal_client (CompEditor *editor, CalClient *client)
{
CompEditorPrivate *priv;
g_return_if_fail (editor != NULL);
g_return_if_fail (IS_COMP_EDITOR (editor));
priv = editor->priv;
if (client == priv->client)
return;
if (client) {
g_return_if_fail (IS_CAL_CLIENT (client));
g_return_if_fail (cal_client_get_load_state (client) ==
CAL_CLIENT_LOAD_LOADED);
gtk_object_ref (GTK_OBJECT (client));
}
if (priv->client) {
gtk_signal_disconnect_by_data (GTK_OBJECT (priv->client),
editor);
gtk_object_unref (GTK_OBJECT (priv->client));
}
priv->client = client;
}
/**
* comp_editor_get_cal_client:
* @editor: A component editor
*
* Returns the calendar client of the editor
*
* Return value: The calendar client of the editor
**/
CalClient *
comp_editor_get_cal_client (CompEditor *editor)
{
CompEditorPrivate *priv;
g_return_val_if_fail (editor != NULL, NULL);
g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
priv = editor->priv;
return priv->client;
}
/* Creates an appropriate title for the event editor dialog */
static char *
make_title_from_comp (CalComponent *comp)
{
char *title;
const char *type_string;
CalComponentVType type;
CalComponentText text;
if (!comp)
return g_strdup (_("Edit Appointment"));
type = cal_component_get_vtype (comp);
switch (type) {
case CAL_COMPONENT_EVENT:
type_string = _("Appointment - %s");
break;
case CAL_COMPONENT_TODO:
type_string = _("Task - %s");
break;
case CAL_COMPONENT_JOURNAL:
type_string = _("Journal entry - %s");
break;
default:
g_message ("make_title_from_comp(): Cannot handle object of type %d", type);
return NULL;
}
cal_component_get_summary (comp, &text);
if (text.value) {
char *summary;
summary = e_utf8_to_locale_string (text.value);
title = g_strdup_printf (type_string, summary);
g_free (summary);
} else
title = g_strdup_printf (type_string, _("No summary"));
return title;
}
/* Sets the event editor's window title from a calendar component */
static void
set_title_from_comp (CompEditor *editor)
{
CompEditorPrivate *priv;
char *title;
priv = editor->priv;
title = make_title_from_comp (priv->comp);
gtk_window_set_title (GTK_WINDOW (priv->window), title);
g_free (title);
}
static void
fill_widgets (CompEditor *editor)
{
CompEditorPrivate *priv;
GList *l;
priv = editor->priv;
for (l = priv->pages; l != NULL; l = l->next)
comp_editor_page_fill_widgets (l->data, priv->comp);
}
/**
* comp_editor_edit_comp:
* @editor: A component editor
* @comp: A calendar component
*
* Starts the editor editing the given component
**/
void
comp_editor_edit_comp (CompEditor *editor, CalComponent *comp)
{
CompEditorPrivate *priv;
g_return_if_fail (editor != NULL);
g_return_if_fail (IS_COMP_EDITOR (editor));
priv = editor->priv;
if (priv->comp) {
gtk_object_unref (GTK_OBJECT (priv->comp));
priv->comp = NULL;
}
if (comp)
priv->comp = cal_component_clone (comp);
set_title_from_comp (editor);
fill_widgets (editor);
}
/* Brings attention to a window by raising it and giving it focus */
static void
raise_and_focus (GtkWidget *widget)
{
g_assert (GTK_WIDGET_REALIZED (widget));
gdk_window_show (widget->window);
gtk_widget_grab_focus (widget);
}
/**
* comp_editor_focus:
* @editor: A component editor
*
* Brings the editor window to the front and gives it focus
**/
void
comp_editor_focus (CompEditor *editor)
{
CompEditorPrivate *priv;
g_return_if_fail (editor != NULL);
g_return_if_fail (IS_COMP_EDITOR (editor));
priv = editor->priv;
gtk_widget_show_all (priv->window);
raise_and_focus (priv->window);
}
static void
save_comp (CompEditor *editor)
{
CompEditorPrivate *priv;
GList *l;
priv = editor->priv;
for (l = priv->pages; l != NULL; l = l->next)
comp_editor_page_fill_component (l->data, priv->comp);
if (!cal_client_update_object (priv->client, priv->comp))
g_message ("save_comp (): Could not update the object!");
else
priv->changed = FALSE;
}
static gboolean
prompt_to_save_changes (CompEditor *editor)
{
CompEditorPrivate *priv;
priv = editor->priv;
if (!priv->changed)
return TRUE;
switch (save_component_dialog (GTK_WINDOW (priv->window))) {
case 0: /* Save */
/* FIXME: If an error occurs here, we should popup a dialog
and then return FALSE. */
save_comp (editor);
return TRUE;
case 1: /* Discard */
return TRUE;
case 2: /* Cancel */
default:
return FALSE;
break;
}
}
/* Closes the dialog box and emits the appropriate signals */
static void
close_dialog (CompEditor *editor)
{
CompEditorPrivate *priv;
priv = editor->priv;
g_assert (priv->window != NULL);
gtk_object_destroy (GTK_OBJECT (editor));
}
static void
save_clicked_cb (GtkWidget *widget, gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
save_comp (editor);
close_dialog (editor);
}
static void
close_clicked_cb (GtkWidget *widget, gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
if (prompt_to_save_changes (editor))
close_dialog (editor);
}
static void
help_clicked_cb (GtkWidget *widget, gpointer data)
{
}
static void
page_summary_changed_cb (GtkWidget *widget, const char *summary, gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
CompEditorPrivate *priv;
GList *l;
priv = editor->priv;
for (l = priv->pages; l != NULL; l = l->next)
comp_editor_page_set_summary (l->data, summary);
priv->changed = TRUE;
}
static void
page_dates_changed_cb (GtkWidget *widget,
CompEditorPageDates *dates,
gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
CompEditorPrivate *priv;
GList *l;
priv = editor->priv;
for (l = priv->pages; l != NULL; l = l->next)
comp_editor_page_set_dates (l->data, dates);
priv->changed = TRUE;
}
static void
page_changed_cb (GtkWidget *widget, gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
CompEditorPrivate *priv;
priv = editor->priv;
priv->changed = TRUE;
}
static gint
delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
if (prompt_to_save_changes (editor))
close_dialog (editor);
return TRUE;
}

View File

@ -22,7 +22,9 @@
#ifndef COMP_EDITOR_H
#define COMP_EDITOR_H
#include "editor-page.h"
#include <gtk/gtk.h>
#include "cal-client.h"
#include "comp-editor-page.h"
BEGIN_GNOME_DECLS
@ -30,8 +32,7 @@ BEGIN_GNOME_DECLS
#define TYPE_COMP_EDITOR (comp_editor_get_type ())
#define COMP_EDITOR(obj) (GTK_CHECK_CAST ((obj), TYPE_COMP_EDITOR, CompEditor))
#define COMP_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_COMP_EDITOR, \
CompEditorClass))
#define COMP_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_COMP_EDITOR, CompEditorClass))
#define IS_COMP_EDITOR(obj) (GTK_CHECK_TYPE ((obj), TYPE_COMP_EDITOR))
#define IS_COMP_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_COMP_EDITOR))
@ -48,11 +49,17 @@ typedef struct {
GtkObjectClass parent_class;
} CompEditorClass;
GtkType comp_editor_get_type (void);
CompEditor *comp_editor_new (void);
void comp_editor_add_page (CompEditor *editor, EditorPage *page);
GtkType comp_editor_get_type (void);
CompEditor *comp_editor_new (void);
void comp_editor_append_page (CompEditor *editor,
CompEditorPage *page,
const char *label);
void comp_editor_set_cal_client (CompEditor *editor,
CalClient *client);
CalClient * comp_editor_get_cal_client (CompEditor *editor);
void comp_editor_edit_comp (CompEditor *ee,
CalComponent *comp);
void comp_editor_focus (CompEditor *editor);

View File

@ -1,260 +0,0 @@
/* Evolution calendar - Base class for calendar component editor pages
*
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Federico Mena-Quintero <federico@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <gtk/gtksignal.h>
#include "editor-page.h"
static void editor_page_class_init (EditorPageClass *class);
/* Signal IDs */
enum {
CHANGED,
SUMMARY_CHANGED,
LAST_SIGNAL
};
static guint editor_page_signals[LAST_SIGNAL];
#define CLASS(page) (EDITOR_PAGE_CLASS (GTK_OBJECT (page)->klass))
/**
* editor_page_get_type:
*
* Registers the #EditorPage class if necessary, and returns the type ID
* associated to it.
*
* Return value: The type ID of the #EditorPage class.
**/
GtkType
editor_page_get_type (void)
{
static GtkType editor_page_type = 0;
if (!editor_page_type) {
static const GtkTypeInfo editor_page_info = {
"EditorPage",
sizeof (EditorPage),
sizeof (EditorPageClass),
(GtkClassInitFunc) editor_page_class_init,
(GtkObjectInitFunc) NULL,
NULL, /* reserved_1 */
NULL, /* reserved_2 */
(GtkClassInitFunc) NULL
};
editor_page_type = gtk_type_unique (GTK_TYPE_OBJECT, &editor_page_info);
}
return editor_page_type;
}
/* Class initialization function for the abstract editor page */
static void
editor_page_class_init (EditorPageClass *class)
{
GtkObjectClass *object_class;
object_class = (GtkObjectClass *) class;
editor_page_signals[CHANGED] =
gtk_signal_new ("changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (EditorPageClass, changed),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
editor_page_signals[SUMMARY_CHANGED] =
gtk_signal_new ("summary_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (EditorPageClass, summary_changed),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
gtk_object_class_add_signals (object_class, editor_page_signals, LAST_SIGNAL);
class->changed = NULL;
class->summary_changed = NULL;
class->get_widget = NULL;
class->fill_widgets = NULL;
class->fill_component = NULL;
class->set_summary = NULL;
class->get_summary = NULL;
class->set_dates = NULL;
}
/**
* editor_page_get_widget:
* @page: An editor page.
*
* Queries the main widget of an editor page.
*
* Return value: The widget that is the page's upper container. It should
* normally be inserted in a notebook widget.
**/
GtkWidget *
editor_page_get_widget (EditorPage *page)
{
g_return_val_if_fail (page != NULL, NULL);
g_return_val_if_fail (IS_EDITOR_PAGE (page), NULL);
g_assert (CLASS (page)->get_widget != NULL);
return (* CLASS (page)->get_widget) (page);
}
/**
* editor_page_fill_widgets:
* @page: An editor page.
* @comp: A calendar component.
*
* Fills the widgets of an editor page with the data from a calendar component.
**/
void
editor_page_fill_widgets (EditorPage *page, CalComponent *comp)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_EDITOR_PAGE (page));
g_return_if_fail (comp != NULL);
g_assert (CLASS (page)->fill_widgets != NULL);
(* CLASS (page)->fill_widgets) (page, comp);
}
/**
* editor_page_fill_component:
* @page: An editor page.
* @comp: A calendar component.
*
* Takes the data from the widgets of an editor page and sets it on a calendar
* component, replacing the contents of the properties that the editor page
* knows how to manipulate.
**/
void
editor_page_fill_component (EditorPage *page, CalComponent *comp)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_EDITOR_PAGE (page));
g_return_if_fail (comp != NULL);
g_assert (CLASS (page)->fill_component != NULL);
(* CLASS (page)->fill_component) (page, comp);
}
/**
* editor_page_set_summary:
* @page: An editor page.
* @summary: Summary string to set in the page's widgets, which must be encoded
* in UTF8.
*
* Sets the calendar component summary string in an editor page.
**/
void
editor_page_set_summary (EditorPage *page, const char *summary)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_EDITOR_PAGE (page));
g_return_if_fail (summary != NULL);
g_assert (CLASS (page)->set_summary != NULL);
(* CLASS (page)->set_summary) (page, summary);
}
/**
* editor_page_get_summary:
* @page: An editor page.
*
* Queries the current summary string in an editor page.
*
* Return value: Summary string in UTF8; must be freed by the caller.
**/
char *
editor_page_get_summary (EditorPage *page)
{
g_return_val_if_fail (page != NULL, NULL);
g_return_val_if_fail (IS_EDITOR_PAGE (page), NULL);
g_assert (CLASS (page)->get_summary != NULL);
return (* CLASS (page)->get_summary) (page);
}
/**
* editor_page_set_dates:
* @page: An editor page.
* @start: Start date for calendar component.
* @end: End date for calendar component.
*
* Sets the calendar component DTSTART and DTEND in an editor page.
**/
void
editor_page_set_dates (EditorPage *page, time_t start, time_t end)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_EDITOR_PAGE (page));
g_return_if_fail (start != -1);
g_assert (CLASS (page)->set_dates != NULL);
(* CLASS (page)->set_dates) (page, start, end);
}
/**
* editor_page_notify_changed:
* @page: An editor page.
*
* Makes an editor page emit the "changed" signal. This is meant to be
* used only by page implementations.
**/
void
editor_page_notify_changed (EditorPage *page)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_EDITOR_PAGE (page));
gtk_signal_emit (GTK_OBJECT (page), editor_page_signals[CHANGED]);
}
/**
* editor_page_notify_summary_changed:
* @page: An editor page.
*
* Makes an editor page emit the "summary_changed" signal. This is meant to be
* used only by page implementations.
**/
void
editor_page_notify_summary_changed (EditorPage *page)
{
g_return_if_fail (page != NULL);
g_return_if_fail (IS_EDITOR_PAGE (page));
gtk_signal_emit (GTK_OBJECT (page), editor_page_signals[SUMMARY_CHANGED]);
}

View File

@ -1,86 +0,0 @@
/* Evolution calendar - Base class for calendar component editor pages
*
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Federico Mena-Quintero <federico@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef EDITOR_PAGE_H
#define EDITOR_PAGE_H
#include <time.h>
#include <libgnome/gnome-defs.h>
#include <gtk/gtkwidget.h>
#include <cal-util/cal-component.h>
BEGIN_GNOME_DECLS
#define TYPE_EDITOR_PAGE (editor_page_get_type ())
#define EDITOR_PAGE(obj) (GTK_CHECK_CAST ((obj), TYPE_EDITOR_PAGE, EditorPage))
#define EDITOR_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_EDITOR_PAGE, \
EditorPageClass))
#define IS_EDITOR_PAGE(obj) (GTK_CHECK_TYPE ((obj), TYPE_EDITOR_PAGE))
#define IS_EDITOR_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), TYPE_EDITOR_PAGE))
typedef struct {
GtkObject object;
} EditorPage;
typedef struct {
GtkObjectClass parent_class;
/* Notification signals */
void (* changed) (EditorPage *page);
void (* summary_changed) (EditorPage *page);
void (* dtstart_changed) (EditorPage *page);
/* Virtual methods */
GtkWidget *(* get_widget) (EditorPage *page);
void (* fill_widgets) (EditorPage *page, CalComponent *comp);
void (* fill_component) (EditorPage *page, CalComponent *comp);
void (* set_summary) (EditorPage *page, const char *summary);
char *(* get_summary) (EditorPage *page);
void (* set_dates) (EditorPage *page, time_t start, time_t end);
} EditorPageClass;
GtkType editor_page_get_type (void);
GtkWidget *editor_page_get_widget (EditorPage *page);
void editor_page_fill_widgets (EditorPage *page, CalComponent *comp);
void editor_page_fill_component (EditorPage *page, CalComponent *comp);
void editor_page_set_summary (EditorPage *page, const char *summary);
char *editor_page_get_summary (EditorPage *page);
void editor_page_set_dates (EditorPage *page, time_t start, time_t end);
void editor_page_notify_changed (EditorPage *page);
void editor_page_notify_summary_changed (EditorPage *page);
END_GNOME_DECLS
#endif

View File

@ -0,0 +1,155 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/* Evolution calendar - Event editor dialog
*
* Copyright (C) 2000 Helix Code, Inc.
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Miguel de Icaza <miguel@ximian.com>
* Federico Mena-Quintero <federico@ximian.com>
* Seth Alves <alves@hungry.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#include <config.h>
#include <string.h>
#include <glade/glade.h>
#include <gal/widgets/e-unicode.h>
#include <libgnome/gnome-i18n.h>
#include <widgets/misc/e-dateedit.h>
#include "event-page.h"
#include "alarm-page.h"
#include "recurrence-page.h"
#include "event-editor.h"
struct _EventEditorPrivate {
EventPage *event_page;
AlarmPage *alarm_page;
RecurrencePage *recur_page;
};
static void event_editor_class_init (EventEditorClass *class);
static void event_editor_init (EventEditor *ee);
static void event_editor_destroy (GtkObject *object);
static CompEditor *parent_class;
/**
* event_editor_get_type:
*
* Registers the #EventEditor class if necessary, and returns the type ID
* associated to it.
*
* Return value: The type ID of the #EventEditor class.
**/
GtkType
event_editor_get_type (void)
{
static GtkType event_editor_type = 0;
if (!event_editor_type) {
static const GtkTypeInfo event_editor_info = {
"EventEditor",
sizeof (EventEditor),
sizeof (EventEditorClass),
(GtkClassInitFunc) event_editor_class_init,
(GtkObjectInitFunc) event_editor_init,
NULL, /* reserved_1 */
NULL, /* reserved_2 */
(GtkClassInitFunc) NULL
};
event_editor_type = gtk_type_unique (TYPE_COMP_EDITOR,
&event_editor_info);
}
return event_editor_type;
}
/* Class initialization function for the event editor */
static void
event_editor_class_init (EventEditorClass *class)
{
GtkObjectClass *object_class;
object_class = (GtkObjectClass *) class;
parent_class = gtk_type_class (TYPE_COMP_EDITOR);
object_class->destroy = event_editor_destroy;
}
/* Object initialization function for the event editor */
static void
event_editor_init (EventEditor *ee)
{
EventEditorPrivate *priv;
priv = g_new0 (EventEditorPrivate, 1);
ee->priv = priv;
priv->event_page = event_page_new ();
comp_editor_append_page (COMP_EDITOR (ee),
COMP_EDITOR_PAGE (priv->event_page),
_("Appointment"));
priv->alarm_page = alarm_page_new ();
comp_editor_append_page (COMP_EDITOR (ee),
COMP_EDITOR_PAGE (priv->alarm_page),
_("Reminder"));
priv->recur_page = recurrence_page_new ();
comp_editor_append_page (COMP_EDITOR (ee),
COMP_EDITOR_PAGE (priv->recur_page),
_("Recurrence"));
}
/* Destroy handler for the event editor */
static void
event_editor_destroy (GtkObject *object)
{
EventEditor *ee;
EventEditorPrivate *priv;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_EVENT_EDITOR (object));
ee = EVENT_EDITOR (object);
priv = ee->priv;
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
/**
* event_editor_new:
*
* Creates a new event editor dialog.
*
* Return value: A newly-created event editor dialog, or NULL if the event
* editor could not be created.
**/
EventEditor *
event_editor_new (void)
{
return EVENT_EDITOR (gtk_type_new (TYPE_EVENT_EDITOR));
}

View File

@ -22,19 +22,18 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __EVENT_EDITOR_DIALOG_H__
#define __EVENT_EDITOR_DIALOG_H__
#ifndef __EVENT_EDITOR_H__
#define __EVENT_EDITOR_H__
#include <libgnome/gnome-defs.h>
#include <gtk/gtkobject.h>
#include "gnome-cal.h"
#include "comp-editor.h"
#define TYPE_EVENT_EDITOR (event_editor_get_type ())
#define EVENT_EDITOR(obj) (GTK_CHECK_CAST ((obj), TYPE_EVENT_EDITOR, EventEditor))
#define EVENT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_EVENT_EDITOR, \
EventEditorClass))
#define EVENT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_EVENT_EDITOR, EventEditorClass))
#define IS_EVENT_EDITOR(obj) (GTK_CHECK_TYPE ((obj), TYPE_EVENT_EDITOR))
#define IS_EVENT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_EVENT_EDITOR))
@ -43,35 +42,21 @@ typedef struct _EventEditorClass EventEditorClass;
typedef struct _EventEditorPrivate EventEditorPrivate;
struct _EventEditor {
GtkObject object;
CompEditor parent;
/* Private data */
EventEditorPrivate *priv;
};
struct _EventEditorClass {
GtkObjectClass parent_class;
CompEditorClass parent_class;
};
GtkType event_editor_get_type (void);
EventEditor *event_editor_construct (EventEditor *ee);
EventEditor *event_editor_new (void);
void event_editor_set_cal_client (EventEditor *ee, CalClient *client);
CalClient *event_editor_get_cal_client (EventEditor *ee);
void event_editor_set_event_object (EventEditor *ee, CalComponent *comp);
void event_editor_focus (EventEditor *ee);
void event_editor_update_widgets (EventEditor *ee);
GtkWidget *make_date_edit (void);
GtkWidget *make_spin_button (int val, int low, int high);
GtkType event_editor_get_type (void);
EventEditor *event_editor_construct (EventEditor *ee);
EventEditor *event_editor_new (void);
void event_editor_update_widgets (EventEditor *ee);
#endif /* __EVENT_EDITOR_DIALOG_H__ */
#endif /* __EVENT_EDITOR_H__ */

View File

@ -31,9 +31,10 @@
#include <glade/glade.h>
#include <gal/widgets/e-unicode.h>
#include <gal/widgets/e-categories.h>
#include "cal-util/timeutil.h"
#include "e-util/e-dialog-widgets.h"
#include "widgets/misc/e-dateedit.h"
#include "cal-util/timeutil.h"
#include "../widget-util.h"
#include "../calendar-config.h"
#include "event-page.h"
@ -65,6 +66,8 @@ struct _EventPagePrivate {
GtkWidget *categories_btn;
GtkWidget *categories;
gboolean updating;
};
@ -73,22 +76,15 @@ static void event_page_class_init (EventPageClass *class);
static void event_page_init (EventPage *epage);
static void event_page_destroy (GtkObject *object);
static GtkWidget *event_page_get_widget (EditorPage *page);
static void event_page_fill_widgets (EditorPage *page, CalComponent *comp);
static void event_page_fill_component (EditorPage *page, CalComponent *comp);
static void event_page_set_summary (EditorPage *page, const char *summary);
static char *event_page_get_summary (EditorPage *page);
static void event_page_set_dates (EditorPage *page, time_t start, time_t end);
static GtkWidget *event_page_get_widget (CompEditorPage *page);
static void event_page_fill_widgets (CompEditorPage *page, CalComponent *comp);
static void event_page_fill_component (CompEditorPage *page, CalComponent *comp);
static void event_page_set_summary (CompEditorPage *page, const char *summary);
static void event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
/* Signal IDs */
enum {
DATES_CHANGED,
LAST_SIGNAL
};
GtkWidget *make_date_edit (void);
static guint event_page_signals[LAST_SIGNAL] = { 0 };
static EditorPageClass *parent_class = NULL;
static CompEditorPageClass *parent_class = NULL;
@ -117,7 +113,8 @@ event_page_get_type (void)
(GtkClassInitFunc) NULL
};
event_page_type = gtk_type_unique (TYPE_EDITOR_PAGE, &event_page_info);
event_page_type = gtk_type_unique (TYPE_COMP_EDITOR_PAGE,
&event_page_info);
}
return event_page_type;
@ -127,31 +124,18 @@ event_page_get_type (void)
static void
event_page_class_init (EventPageClass *class)
{
EditorPageClass *editor_page_class;
CompEditorPageClass *editor_page_class;
GtkObjectClass *object_class;
editor_page_class = (EditorPageClass *) class;
editor_page_class = (CompEditorPageClass *) class;
object_class = (GtkObjectClass *) class;
parent_class = gtk_type_class (TYPE_EDITOR_PAGE);
event_page_signals[DATES_CHANGED] =
gtk_signal_new ("dates_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (EventPageClass, dates_changed),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
gtk_object_class_add_signals (object_class, event_page_signals, LAST_SIGNAL);
class->dates_changed = NULL;
parent_class = gtk_type_class (TYPE_COMP_EDITOR_PAGE);
editor_page_class->get_widget = event_page_get_widget;
editor_page_class->fill_widgets = event_page_fill_widgets;
editor_page_class->fill_component = event_page_fill_component;
editor_page_class->set_summary = event_page_set_summary;
editor_page_class->get_summary = event_page_get_summary;
editor_page_class->set_dates = event_page_set_dates;
object_class->destroy = event_page_destroy;
@ -181,6 +165,8 @@ event_page_init (EventPage *epage)
priv->contacts = NULL;
priv->categories_btn = NULL;
priv->categories = NULL;
priv->updating = FALSE;
}
/* Destroy handler for the event page */
@ -219,7 +205,7 @@ static const int classification_map[] = {
/* get_widget handler for the event page */
static GtkWidget *
event_page_get_widget (EditorPage *page)
event_page_get_widget (CompEditorPage *page)
{
EventPage *epage;
EventPagePrivate *priv;
@ -230,8 +216,8 @@ event_page_get_widget (EditorPage *page)
return priv->main;
}
/* Checks if the event's time starts and ends at midnight, and sets the "all day
* event" box accordingly.
/* Checks if the event's time starts and ends at midnight, and sets the
*"all day event" box accordingly.
*/
static void
check_all_day (EventPage *epage)
@ -251,12 +237,15 @@ check_all_day (EventPage *epage)
g_assert (ev_end != -1);
/* all day event checkbox */
if (time_day_begin (ev_start) == ev_start && time_day_begin (ev_end) == ev_end)
if (time_day_begin (ev_start) == ev_start
&& time_day_begin (ev_end) == ev_end)
all_day = TRUE;
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->all_day_event), epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->all_day_event),
epage);
e_dialog_toggle_set (priv->all_day_event, all_day);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->all_day_event), epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->all_day_event),
epage);
e_date_edit_set_show_time (E_DATE_EDIT (priv->start_time), !all_day);
e_date_edit_set_show_time (E_DATE_EDIT (priv->end_time), !all_day);
@ -278,14 +267,17 @@ clear_widgets (EventPage *epage)
e_dialog_editable_set (priv->description, NULL);
/* Start and end times */
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), epage);
e_date_edit_set_time (E_DATE_EDIT (priv->start_time), now);
e_date_edit_set_time (E_DATE_EDIT (priv->end_time), now);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time),
epage);
check_all_day (epage);
@ -299,7 +291,7 @@ clear_widgets (EventPage *epage)
/* fill_widgets handler for the event page */
static void
event_page_fill_widgets (EditorPage *page, CalComponent *comp)
event_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
{
EventPage *epage;
EventPagePrivate *priv;
@ -313,6 +305,10 @@ event_page_fill_widgets (EditorPage *page, CalComponent *comp)
epage = EVENT_PAGE (page);
priv = epage->priv;
/* Don't send off changes during this time */
priv->updating = TRUE;
/* Clean the page */
clear_widgets (epage);
/* Summary, description(s) */
@ -341,17 +337,21 @@ event_page_fill_widgets (EditorPage *page, CalComponent *comp)
dtend = icaltime_as_timet (*d.value);
cal_component_free_datetime (&d);
if (time_day_begin (dtstart) == dtstart && time_day_begin (dtend) == dtend)
if (time_day_begin (dtstart) == dtstart
&& time_day_begin (dtend) == dtend)
dtend = time_add_day (dtend, -1);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), epage);
e_date_edit_set_time (E_DATE_EDIT (priv->start_time), dtstart);
e_date_edit_set_time (E_DATE_EDIT (priv->end_time), dtend);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time),
epage);
check_all_day (epage);
@ -361,17 +361,20 @@ event_page_fill_widgets (EditorPage *page, CalComponent *comp)
switch (cl) {
case CAL_COMPONENT_CLASS_PUBLIC:
e_dialog_radio_set (priv->classification_public, CAL_COMPONENT_CLASS_PUBLIC,
e_dialog_radio_set (priv->classification_public,
CAL_COMPONENT_CLASS_PUBLIC,
classification_map);
break;
case CAL_COMPONENT_CLASS_PRIVATE:
e_dialog_radio_set (priv->classification_public, CAL_COMPONENT_CLASS_PRIVATE,
e_dialog_radio_set (priv->classification_public,
CAL_COMPONENT_CLASS_PRIVATE,
classification_map);
break;
case CAL_COMPONENT_CLASS_CONFIDENTIAL:
e_dialog_radio_set (priv->classification_public, CAL_COMPONENT_CLASS_CONFIDENTIAL,
e_dialog_radio_set (priv->classification_public,
CAL_COMPONENT_CLASS_CONFIDENTIAL,
classification_map);
break;
@ -382,14 +385,15 @@ event_page_fill_widgets (EditorPage *page, CalComponent *comp)
}
/* Categories */
cal_component_get_categories (comp, &categories);
e_dialog_editable_set (priv->categories, categories);
priv->updating = FALSE;
}
/* fill_component handler for the event page */
static void
event_page_fill_component (EditorPage *page, CalComponent *comp)
event_page_fill_component (CompEditorPage *page, CalComponent *comp)
{
EventPage *epage;
EventPagePrivate *priv;
@ -477,13 +481,14 @@ event_page_fill_component (EditorPage *page, CalComponent *comp)
/* Classification */
classif = e_dialog_radio_get (priv->classification_public, classification_map);
classif = e_dialog_radio_get (priv->classification_public,
classification_map);
cal_component_set_classification (comp, classif);
}
/* set_summary handler for the event page */
static void
event_page_set_summary (EditorPage *page, const char *summary)
event_page_set_summary (CompEditorPage *page, const char *summary)
{
EventPage *epage;
EventPagePrivate *priv;
@ -496,24 +501,8 @@ event_page_set_summary (EditorPage *page, const char *summary)
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->summary), epage);
}
/* get_summary handler for the event page */
static char *
event_page_get_summary (EditorPage *page)
{
EventPage *epage;
EventPagePrivate *priv;
epage = EVENT_PAGE (page);
priv = epage->priv;
return e_utf8_gtk_entry_get_text (GTK_ENTRY (priv->summary));
}
/* set_dates handler for the event page. We do nothing since we are *the*
* only provider of the date values.
*/
static void
event_page_set_dates (EditorPage *page, time_t start, time_t end)
event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
{
/* nothing */
}
@ -525,22 +514,17 @@ static gboolean
get_widgets (EventPage *epage)
{
EventPagePrivate *priv;
GtkWidget *toplevel;
priv = epage->priv;
#define GW(name) glade_xml_get_widget (priv->xml, name)
toplevel = GW ("event-toplevel");
priv->main = GW ("event-page");
if (!(toplevel && priv->main))
return FALSE;
g_assert (priv->main);
gtk_widget_ref (priv->main);
gtk_widget_unparent (priv->main);
gtk_widget_destroy (toplevel);
priv->summary = GW ("summary");
priv->summary = GW ("general-summary");
priv->start_time = GW ("start-time");
priv->end_time = GW ("end-time");
@ -579,9 +563,19 @@ static void
summary_changed_cb (GtkEditable *editable, gpointer data)
{
EventPage *epage;
EventPagePrivate *priv;
gchar *summary;
epage = EVENT_PAGE (data);
editor_page_notify_summary_changed (EDITOR_PAGE (epage));
priv = epage->priv;
if (priv->updating)
return;
summary = gtk_editable_get_chars (editable, 0, -1);
comp_editor_page_notify_summary_changed (COMP_EDITOR_PAGE (epage),
summary);
g_free (summary);
}
/* Callback used when the start or end date widgets change. We check that the
@ -594,12 +588,15 @@ date_changed_cb (EDateEdit *dedit, gpointer data)
EventPagePrivate *priv;
time_t start, end;
struct tm tm_start, tm_end;
CompEditorPageDates dates;
epage = EVENT_PAGE (data);
priv = epage->priv;
/* Ensure that start < end */
if (priv->updating)
return;
/* Ensure that start < end */
start = e_date_edit_get_time (E_DATE_EDIT (priv->start_time));
g_assert (start != -1);
end = e_date_edit_get_time (E_DATE_EDIT (priv->end_time));
@ -611,10 +608,10 @@ date_changed_cb (EDateEdit *dedit, gpointer data)
if (start == end && tm_start.tm_hour == 0
&& tm_start.tm_min == 0 && tm_start.tm_sec == 0) {
/* If the start and end times are the same, but both are
* on day boundaries, then that is OK since it means we
* have an all-day event lasting 1 day. So we do
* nothing here.
/* If the start and end times are the same, but both
* are on day boundaries, then that is OK since it
* means we have an all-day event lasting 1 day. So
* we do nothing here.
*/
} else if (GTK_WIDGET (dedit) == priv->start_time) {
/* Modify the end time */
@ -627,7 +624,8 @@ date_changed_cb (EDateEdit *dedit, gpointer data)
tm_end.tm_sec = tm_start.tm_sec;
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), epage);
e_date_edit_set_time (E_DATE_EDIT (priv->end_time), mktime (&tm_end));
end = mktime (&tm_end);
e_date_edit_set_time (E_DATE_EDIT (priv->end_time), end);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), epage);
} else if (GTK_WIDGET (dedit) == priv->end_time) {
/* Modify the start time */
@ -640,7 +638,8 @@ date_changed_cb (EDateEdit *dedit, gpointer data)
tm_start.tm_sec = tm_end.tm_sec;
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), epage);
e_date_edit_set_time (E_DATE_EDIT (priv->start_time), mktime (&tm_start));
start = mktime (&tm_start);
e_date_edit_set_time (E_DATE_EDIT (priv->start_time), start);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), epage);
} else
g_assert_not_reached ();
@ -650,7 +649,12 @@ date_changed_cb (EDateEdit *dedit, gpointer data)
check_all_day (epage);
/* Notify upstream */
gtk_signal_emit (GTK_OBJECT (epage), event_page_signals[DATES_CHANGED]);
dates.start = start;
dates.end = end;
dates.due = 0;
dates.complete = 0;
comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (epage),
&dates);
}
/* Callback: all day event button toggled.
@ -666,19 +670,21 @@ all_day_event_toggled_cb (GtkWidget *toggle, gpointer data)
struct tm start_tm, end_tm;
time_t start_t, end_t;
gboolean all_day;
CompEditorPageDates dates;
epage = EVENT_PAGE (data);
priv = epage->priv;
/* When the all_day toggle is turned on, the start date is rounded down
* to the start of the day, and end date is rounded down to the start of
* the day on which the event ends. The event is then taken to be
* inclusive of the days between the start and end days. Note that if
* the event end is at midnight, we do not round it down to the previous
* day, since if we do that and the user repeatedly turns the all_day
* toggle on and off, the event keeps shrinking. (We'd also need to
* make sure we didn't adjust the time when the radio button is
* initially set.)
/* When the all_day toggle is turned on, the start date is
* rounded down to the start of the day, and end date is
* rounded down to the start of the day on which the event
* ends. The event is then taken to be inclusive of the days
* between the start and end days. Note that if the event end
* is at midnight, we do not round it down to the previous
* day, since if we do that and the user repeatedly turns the
* all_day toggle on and off, the event keeps shrinking.
* (We'd also need to make sure we didn't adjust the time when
* the radio button is initially set.)
*
* When the all_day_toggle is turned off, we set the event start to the
* start of the working day, and if the event end is on or before the
@ -737,20 +743,30 @@ all_day_event_toggled_cb (GtkWidget *toggle, gpointer data)
}
}
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time),
epage);
e_date_edit_set_time (E_DATE_EDIT (priv->start_time), mktime (&start_tm));
e_date_edit_set_time (E_DATE_EDIT (priv->end_time), mktime (&end_tm));
start_t = mktime (&start_tm);
end_t = mktime (&end_tm);
e_date_edit_set_time (E_DATE_EDIT (priv->start_time), start_t);
e_date_edit_set_time (E_DATE_EDIT (priv->end_time), end_t);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time),
epage);
e_date_edit_set_show_time (E_DATE_EDIT (priv->start_time), !all_day);
e_date_edit_set_show_time (E_DATE_EDIT (priv->end_time), !all_day);
/* Notify upstream */
gtk_signal_emit (GTK_OBJECT (epage), event_page_signals[DATES_CHANGED]);
dates.start = start_t;
dates.end = end_t;
dates.due = 0;
comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (epage),
&dates);
}
/* Callback used when the categories button is clicked; we must bring up the
@ -792,9 +808,13 @@ static void
field_changed_cb (GtkWidget *widget, gpointer data)
{
EventPage *epage;
EventPagePrivate *priv;
epage = EVENT_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (epage));
priv = epage->priv;
if (!priv->updating)
comp_editor_page_notify_changed (COMP_EDITOR_PAGE (epage));
}
/* Hooks the widget signals */
@ -836,12 +856,15 @@ init_widgets (EventPage *epage)
GTK_SIGNAL_FUNC (field_changed_cb), epage);
gtk_signal_connect (GTK_OBJECT (priv->description), "changed",
GTK_SIGNAL_FUNC (field_changed_cb), epage);
gtk_signal_connect (GTK_OBJECT (priv->classification_public), "toggled",
GTK_SIGNAL_FUNC (field_changed_cb), epage);
gtk_signal_connect (GTK_OBJECT (priv->classification_private), "toggled",
GTK_SIGNAL_FUNC (field_changed_cb), epage);
gtk_signal_connect (GTK_OBJECT (priv->classification_confidential), "toggled",
GTK_SIGNAL_FUNC (field_changed_cb), epage);
gtk_signal_connect (GTK_OBJECT (priv->classification_public),
"toggled", GTK_SIGNAL_FUNC (field_changed_cb),
epage);
gtk_signal_connect (GTK_OBJECT (priv->classification_private),
"toggled", GTK_SIGNAL_FUNC (field_changed_cb),
epage);
gtk_signal_connect (GTK_OBJECT (priv->classification_confidential),
"toggled", GTK_SIGNAL_FUNC (field_changed_cb),
epage);
gtk_signal_connect (GTK_OBJECT (priv->categories), "changed",
GTK_SIGNAL_FUNC (field_changed_cb), epage);
@ -869,14 +892,17 @@ event_page_construct (EventPage *epage)
priv = epage->priv;
priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/event-page.glade", NULL);
priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/event-page.glade",
NULL);
if (!priv->xml) {
g_message ("event_page_construct(): Could not load the Glade XML file!");
g_message ("event_page_construct(): "
"Could not load the Glade XML file!");
return NULL;
}
if (!get_widgets (epage)) {
g_message ("event_page_construct(): Could not find all widgets in the XML file!");
g_message ("event_page_construct(): "
"Could not find all widgets in the XML file!");
return NULL;
}
@ -907,27 +933,8 @@ event_page_new (void)
return epage;
}
/**
* event_page_get_dates:
* @page: An event page.
* @start: Return value for the start date, can be NULL.
* @end: Return value for the end date, can be NULL.
*
* Queries the start and end dates for the calendar component in an event page.
**/
void
event_page_get_dates (EventPage *page, time_t *start, time_t *end)
GtkWidget *
make_date_edit (void)
{
EventPagePrivate *priv;
g_return_if_fail (page != NULL);
g_return_if_fail (IS_EVENT_PAGE (page));
priv = page->priv;
if (start)
*start = e_date_edit_get_time (E_DATE_EDIT (priv->start_time));
if (end)
*end = e_date_edit_get_time (E_DATE_EDIT (priv->end_time));
return date_edit_new (TRUE, TRUE);
}

View File

@ -18,6 +18,7 @@
<widget>
<class>GtkWindow</class>
<name>event-toplevel</name>
<visible>False</visible>
<title>window1</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_NONE</position>
@ -349,7 +350,6 @@
<class>GtkButton</class>
<name>contacts-button</name>
<can_focus>True</can_focus>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
@ -388,7 +388,6 @@
<class>GtkButton</class>
<name>categories-button</name>
<can_focus>True</can_focus>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>

View File

@ -25,7 +25,7 @@
#ifndef EVENT_PAGE_H
#define EVENT_PAGE_H
#include "editor-page.h"
#include "comp-editor-page.h"
BEGIN_GNOME_DECLS
@ -33,35 +33,27 @@ BEGIN_GNOME_DECLS
#define TYPE_EVENT_PAGE (event_page_get_type ())
#define EVENT_PAGE(obj) (GTK_CHECK_CAST ((obj), TYPE_EVENT_PAGE, EventPage))
#define EVENT_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_EVENT_PAGE, \
EventPageClass))
#define EVENT_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_EVENT_PAGE, EventPageClass))
#define IS_EVENT_PAGE(obj) (GTK_CHECK_TYPE ((obj), TYPE_EVENT_PAGE))
#define IS_EVENT_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), TYPE_EVENT_PAGE))
typedef struct _EventPagePrivate EventPagePrivate;
typedef struct {
EditorPage page;
CompEditorPage page;
/* Private data */
EventPagePrivate *priv;
} EventPage;
typedef struct {
EditorPageClass parent_class;
/* Notification signals */
void (* dates_changed) (EventPage *epage);
CompEditorPageClass parent_class;
} EventPageClass;
GtkType event_page_get_type (void);
GtkType event_page_get_type (void);
EventPage *event_page_construct (EventPage *epage);
EventPage *event_page_new (void);
void event_page_get_dates (EventPage *epage, time_t *start, time_t *end);
EventPage *event_page_new (void);

View File

@ -39,6 +39,7 @@
#include "../tag-calendar.h"
#include "../weekday-picker.h"
#include "../widget-util.h"
#include "comp-editor-util.h"
#include "recurrence-page.h"
@ -102,6 +103,9 @@ static const int ending_types_map[] = {
/* Private part of the RecurrencePage structure */
struct _RecurrencePagePrivate {
/* Component we use to expand the recurrence rules for the preview */
CalComponent *comp;
/* Glade XML data */
GladeXML *xml;
@ -110,7 +114,7 @@ struct _RecurrencePagePrivate {
GtkWidget *main;
GtkWidget *summary;
GtkWidget *starting_date;
GtkWidget *date_time;
GtkWidget *none;
GtkWidget *simple;
@ -157,8 +161,7 @@ struct _RecurrencePagePrivate {
/* For the recurrence preview, the actual widget */
GtkWidget *preview_calendar;
/* Component we use to expand the recurrence rules for the preview calendar */
CalComponent *comp;
gboolean updating;
};
@ -167,14 +170,15 @@ static void recurrence_page_class_init (RecurrencePageClass *class);
static void recurrence_page_init (RecurrencePage *rpage);
static void recurrence_page_destroy (GtkObject *object);
static GtkWidget *recurrence_page_get_widget (EditorPage *page);
static void recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp);
static void recurrence_page_fill_component (EditorPage *page, CalComponent *comp);
static void recurrence_page_set_summary (EditorPage *page, const char *summary);
static char *recurrence_page_get_summary (EditorPage *page);
static void recurrence_page_set_dates (EditorPage *page, time_t start, time_t end);
static GtkWidget *recurrence_page_get_widget (CompEditorPage *page);
static void recurrence_page_fill_widgets (CompEditorPage *page, CalComponent *comp);
static void recurrence_page_fill_component (CompEditorPage *page, CalComponent *comp);
static void recurrence_page_set_summary (CompEditorPage *page, const char *summary);
static void recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
static EditorPageClass *parent_class = NULL;
static void field_changed (RecurrencePage *apage);
static CompEditorPageClass *parent_class = NULL;
@ -203,7 +207,8 @@ recurrence_page_get_type (void)
(GtkClassInitFunc) NULL
};
recurrence_page_type = gtk_type_unique (TYPE_EDITOR_PAGE, &recurrence_page_info);
recurrence_page_type = gtk_type_unique (TYPE_COMP_EDITOR_PAGE,
&recurrence_page_info);
}
return recurrence_page_type;
@ -213,19 +218,18 @@ recurrence_page_get_type (void)
static void
recurrence_page_class_init (RecurrencePageClass *class)
{
EditorPageClass *editor_page_class;
CompEditorPageClass *editor_page_class;
GtkObjectClass *object_class;
editor_page_class = (EditorPageClass *) class;
editor_page_class = (CompEditorPageClass *) class;
object_class = (GtkObjectClass *) class;
parent_class = gtk_type_class (TYPE_EDITOR_PAGE);
parent_class = gtk_type_class (TYPE_COMP_EDITOR_PAGE);
editor_page_class->get_widget = recurrence_page_get_widget;
editor_page_class->fill_widgets = recurrence_page_fill_widgets;
editor_page_class->fill_component = recurrence_page_fill_component;
editor_page_class->set_summary = recurrence_page_set_summary;
editor_page_class->get_summary = recurrence_page_get_summary;
editor_page_class->set_dates = recurrence_page_set_dates;
object_class->destroy = recurrence_page_destroy;
@ -244,7 +248,7 @@ recurrence_page_init (RecurrencePage *rpage)
priv->main = NULL;
priv->summary = NULL;
priv->starting_date = NULL;
priv->date_time = NULL;
priv->none = NULL;
priv->simple = NULL;
priv->custom = NULL;
@ -276,22 +280,23 @@ static void
free_exception_clist_data (RecurrencePage *rpage)
{
RecurrencePagePrivate *priv;
GtkCList *clist;
int i;
priv = rpage->priv;
clist = GTK_CLIST (priv->exception_list);
if (priv->exception_list) {
GtkCList *clist = GTK_CLIST (priv->exception_list);
for (i = 0; i < clist->rows; i++) {
gpointer data;
data = gtk_clist_get_row_data (clist, i);
g_free (data);
gtk_clist_set_row_data (clist, i, NULL);
for (i = 0; i < clist->rows; i++) {
gpointer data;
data = gtk_clist_get_row_data (clist, i);
g_free (data);
gtk_clist_set_row_data (clist, i, NULL);
}
gtk_clist_clear (clist);
}
gtk_clist_clear (clist);
}
/* Destroy handler for the recurrence page */
@ -325,7 +330,7 @@ recurrence_page_destroy (GtkObject *object)
/* get_widget handler for the recurrence page */
static GtkWidget *
recurrence_page_get_widget (EditorPage *page)
recurrence_page_get_widget (CompEditorPage *page)
{
RecurrencePage *rpage;
RecurrencePagePrivate *priv;
@ -366,7 +371,9 @@ clear_widgets (RecurrencePage *rpage)
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
gtk_signal_handler_block_by_data (GTK_OBJECT (menu), rpage);
e_dialog_option_menu_set (priv->interval_unit, ICAL_DAILY_RECURRENCE, freq_map);
e_dialog_option_menu_set (priv->interval_unit,
ICAL_DAILY_RECURRENCE,
freq_map);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (menu), rpage);
priv->ending_date = time (NULL);
@ -374,7 +381,9 @@ clear_widgets (RecurrencePage *rpage)
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->ending_menu));
gtk_signal_handler_block_by_data (GTK_OBJECT (menu), rpage);
e_dialog_option_menu_set (priv->ending_menu, ENDING_FOREVER, ending_types_map);
e_dialog_option_menu_set (priv->ending_menu,
ENDING_FOREVER,
ending_types_map);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (menu), rpage);
/* Exceptions list */
@ -455,8 +464,8 @@ fill_exception_widgets (RecurrencePage *rpage, CalComponent *comp)
gtk_clist_select_row (GTK_CLIST (priv->exception_list), 0, 0);
}
/* Computes a weekday mask for the start day of a calendar component, for use in
* a WeekdayPicker widget.
/* Computes a weekday mask for the start day of a calendar component,
* for use in a WeekdayPicker widget.
*/
static guint8
get_start_weekday_mask (CalComponent *comp)
@ -533,9 +542,11 @@ sensitize_recur_widgets (RecurrencePage *rpage)
gtk_widget_set_sensitive (priv->params, FALSE);
gtk_widget_hide (priv->params);
label = gtk_label_new (_("This appointment contains recurrences that Evolution "
label = gtk_label_new (_("This appointment contains "
"recurrences that Evolution "
"cannot edit."));
gtk_container_add (GTK_CONTAINER (priv->custom_warning_bin), label);
gtk_container_add (GTK_CONTAINER (priv->custom_warning_bin),
label);
gtk_widget_show_all (priv->custom_warning_bin);
break;
@ -574,7 +585,8 @@ simple_recur_to_comp (RecurrencePage *rpage, CalComponent *comp)
r.freq = e_dialog_option_menu_get (priv->interval_unit, freq_map);
r.interval = e_dialog_spin_get_int (priv->interval_value);
r.week_start = ICAL_SUNDAY_WEEKDAY + calendar_config_get_week_start_day ();
r.week_start = ICAL_SUNDAY_WEEKDAY
+ calendar_config_get_week_start_day ();
/* Frequency-specific data */
@ -639,31 +651,38 @@ simple_recur_to_comp (RecurrencePage *rpage, CalComponent *comp)
break;
case MONTH_DAY_MON:
r.by_day[0] = nth_weekday (day_index, ICAL_MONDAY_WEEKDAY);
r.by_day[0] = nth_weekday (day_index,
ICAL_MONDAY_WEEKDAY);
break;
case MONTH_DAY_TUE:
r.by_day[0] = nth_weekday (day_index, ICAL_TUESDAY_WEEKDAY);
r.by_day[0] = nth_weekday (day_index,
ICAL_TUESDAY_WEEKDAY);
break;
case MONTH_DAY_WED:
r.by_day[0] = nth_weekday (day_index, ICAL_WEDNESDAY_WEEKDAY);
r.by_day[0] = nth_weekday (day_index,
ICAL_WEDNESDAY_WEEKDAY);
break;
case MONTH_DAY_THU:
r.by_day[0] = nth_weekday (day_index, ICAL_THURSDAY_WEEKDAY);
r.by_day[0] = nth_weekday (day_index,
ICAL_THURSDAY_WEEKDAY);
break;
case MONTH_DAY_FRI:
r.by_day[0] = nth_weekday (day_index, ICAL_FRIDAY_WEEKDAY);
r.by_day[0] = nth_weekday (day_index,
ICAL_FRIDAY_WEEKDAY);
break;
case MONTH_DAY_SAT:
r.by_day[0] = nth_weekday (day_index, ICAL_SATURDAY_WEEKDAY);
r.by_day[0] = nth_weekday (day_index,
ICAL_SATURDAY_WEEKDAY);
break;
case MONTH_DAY_SUN:
r.by_day[0] = nth_weekday (day_index, ICAL_SUNDAY_WEEKDAY);
r.by_day[0] = nth_weekday (day_index,
ICAL_SUNDAY_WEEKDAY);
break;
default:
@ -683,7 +702,8 @@ simple_recur_to_comp (RecurrencePage *rpage, CalComponent *comp)
/* Ending date */
ending_type = e_dialog_option_menu_get (priv->ending_menu, ending_types_map);
ending_type = e_dialog_option_menu_get (priv->ending_menu,
ending_types_map);
switch (ending_type) {
case ENDING_FOR:
@ -842,7 +862,7 @@ weekday_picker_changed_cb (WeekdayPicker *wp, gpointer data)
rpage = RECURRENCE_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
preview_recur (rpage);
}
@ -882,7 +902,8 @@ make_weekly_special (RecurrencePage *rpage)
weekday_picker_set_blocked_days (wp, priv->weekday_blocked_day_mask);
gtk_signal_connect (GTK_OBJECT (wp), "changed",
GTK_SIGNAL_FUNC (weekday_picker_changed_cb), rpage);
GTK_SIGNAL_FUNC (weekday_picker_changed_cb),
rpage);
}
/* Creates the option menu for the monthly recurrence days */
@ -938,7 +959,8 @@ adjust_day_index_spin (RecurrencePage *rpage)
g_assert (priv->month_index_spin != NULL);
g_assert (GTK_IS_SPIN_BUTTON (priv->month_index_spin));
month_day = e_dialog_option_menu_get (priv->month_day_menu, month_day_options_map);
month_day = e_dialog_option_menu_get (priv->month_day_menu,
month_day_options_map);
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (priv->month_index_spin));
@ -970,9 +992,9 @@ adjust_day_index_spin (RecurrencePage *rpage)
}
}
/* Callback used when the monthly day selection menu changes. We need to change
* the valid range of the day index spin button; e.g. days are 1-31 while a
* Sunday is the 1st through 5th.
/* Callback used when the monthly day selection menu changes. We need
* to change the valid range of the day index spin button; e.g. days
* are 1-31 while a Sunday is the 1st through 5th.
*/
static void
month_day_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
@ -982,7 +1004,7 @@ month_day_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
rpage = RECURRENCE_PAGE (data);
adjust_day_index_spin (rpage);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
preview_recur (rpage);
}
@ -994,7 +1016,7 @@ month_index_value_changed_cb (GtkAdjustment *adj, gpointer data)
rpage = RECURRENCE_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
preview_recur (rpage);
}
@ -1024,13 +1046,15 @@ make_monthly_special (RecurrencePage *rpage)
adj = GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 31, 1, 10, 10));
priv->month_index_spin = gtk_spin_button_new (adj, 1, 0);
gtk_box_pack_start (GTK_BOX (hbox), priv->month_index_spin, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), priv->month_index_spin,
FALSE, FALSE, 0);
label = gtk_label_new (_("th"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
priv->month_day_menu = make_recur_month_menu ();
gtk_box_pack_start (GTK_BOX (hbox), priv->month_day_menu, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), priv->month_day_menu,
FALSE, FALSE, 0);
gtk_widget_show_all (hbox);
@ -1043,11 +1067,13 @@ make_monthly_special (RecurrencePage *rpage)
adjust_day_index_spin (rpage);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (month_index_value_changed_cb), rpage);
GTK_SIGNAL_FUNC (month_index_value_changed_cb),
rpage);
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->month_day_menu));
gtk_signal_connect (GTK_OBJECT (menu), "selection_done",
GTK_SIGNAL_FUNC (month_day_menu_selection_done_cb), rpage);
GTK_SIGNAL_FUNC (month_day_menu_selection_done_cb),
rpage);
}
/* Changes the recurrence-special widget to match the interval units.
@ -1099,7 +1125,7 @@ make_recurrence_special (RecurrencePage *rpage)
}
}
/* Counts the number of elements in the by_xxx fields of an icalrecurrencetype */
/* Counts the elements in the by_xxx fields of an icalrecurrencetype */
static int
count_by_xxx (short *field, int max_elements)
{
@ -1119,7 +1145,7 @@ ending_until_changed_cb (EDateEdit *de, gpointer data)
RecurrencePage *rpage;
rpage = RECURRENCE_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
preview_recur (rpage);
}
@ -1140,7 +1166,8 @@ make_ending_until_special (RecurrencePage *rpage)
priv->ending_date_edit = date_edit_new (TRUE, FALSE);
de = E_DATE_EDIT (priv->ending_date_edit);
gtk_container_add (GTK_CONTAINER (priv->ending_special), GTK_WIDGET (de));
gtk_container_add (GTK_CONTAINER (priv->ending_special),
GTK_WIDGET (de));
gtk_widget_show_all (GTK_WIDGET (de));
/* Set the value */
@ -1158,7 +1185,7 @@ ending_count_value_changed_cb (GtkAdjustment *adj, gpointer data)
RecurrencePage *rpage;
rpage = RECURRENCE_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
preview_recur (rpage);
}
@ -1183,7 +1210,8 @@ make_ending_count_special (RecurrencePage *rpage)
adj = GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 10000, 1, 10, 10));
priv->ending_count_spin = gtk_spin_button_new (adj, 1, 0);
gtk_box_pack_start (GTK_BOX (hbox), priv->ending_count_spin, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), priv->ending_count_spin,
FALSE, FALSE, 0);
label = gtk_label_new (_("occurrences"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
@ -1195,10 +1223,11 @@ make_ending_count_special (RecurrencePage *rpage)
e_dialog_spin_set (priv->ending_count_spin, priv->ending_count);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (ending_count_value_changed_cb), rpage);
GTK_SIGNAL_FUNC (ending_count_value_changed_cb),
rpage);
}
/* Changes the recurrence-ending-special widget to match the ending date option.
/* Changes the recurrence-ending-special widget to match the ending date option
*
* For: <n> [days, weeks, months, years, occurrences]
* Until: <date selector>
@ -1219,7 +1248,8 @@ make_ending_special (RecurrencePage *rpage)
priv->ending_count_spin = NULL;
}
ending_type = e_dialog_option_menu_get (priv->ending_menu, ending_types_map);
ending_type = e_dialog_option_menu_get (priv->ending_menu,
ending_types_map);
switch (ending_type) {
case ENDING_FOR:
@ -1290,10 +1320,12 @@ fill_ending_date (RecurrencePage *rpage, struct icalrecurrencetype *r)
* no rdates or exrules (exdates are handled just fine elsewhere).
*/
static void
recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
recurrence_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
{
RecurrencePage *rpage;
RecurrencePagePrivate *priv;
CalComponentText text;
CompEditorPageDates dates;
GSList *rrule_list;
int len;
struct icalrecurrencetype *r;
@ -1306,8 +1338,8 @@ recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
rpage = RECURRENCE_PAGE (page);
priv = rpage->priv;
/* Keep a copy of the component so that we can expand the recurrence set
* for the preview.
/* Keep a copy of the component so that we can expand the recurrence
* set for the preview.
*/
if (priv->comp)
@ -1315,10 +1347,21 @@ recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
priv->comp = cal_component_clone (comp);
/* Clean the page */
/* Don't send off changes during this time */
priv->updating = TRUE;
/* Clean the page */
clear_widgets (rpage);
/* Summary */
cal_component_get_summary (comp, &text);
recurrence_page_set_summary (page, text.value);
/* Dates */
comp_editor_dates (&dates, comp);
recurrence_page_set_dates (page, &dates);
/* Exceptions */
fill_exception_widgets (rpage, comp);
/* Set up defaults for the special widgets */
@ -1329,13 +1372,19 @@ recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
if (!cal_component_has_rdates (comp)
&& !cal_component_has_rrules (comp)
&& !cal_component_has_exrules (comp)) {
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->none), rpage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->simple), rpage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->custom), rpage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->none),
rpage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->simple),
rpage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->custom),
rpage);
e_dialog_radio_set (priv->none, RECUR_NONE, type_map);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->none), rpage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->simple), rpage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->custom), rpage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->none),
rpage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->simple),
rpage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->custom),
rpage);
gtk_widget_set_sensitive (priv->custom, FALSE);
@ -1400,7 +1449,9 @@ recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
gtk_signal_handler_block_by_data (GTK_OBJECT (menu), rpage);
e_dialog_option_menu_set (priv->interval_unit, ICAL_DAILY_RECURRENCE, freq_map);
e_dialog_option_menu_set (priv->interval_unit,
ICAL_DAILY_RECURRENCE,
freq_map);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (menu), rpage);
break;
@ -1465,7 +1516,9 @@ recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
gtk_signal_handler_block_by_data (GTK_OBJECT (menu), rpage);
e_dialog_option_menu_set (priv->interval_unit, ICAL_WEEKLY_RECURRENCE, freq_map);
e_dialog_option_menu_set (priv->interval_unit,
ICAL_WEEKLY_RECURRENCE,
freq_map);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (menu), rpage);
break;
}
@ -1537,7 +1590,9 @@ recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
gtk_signal_handler_block_by_data (GTK_OBJECT (menu), rpage);
e_dialog_option_menu_set (priv->interval_unit, ICAL_MONTHLY_RECURRENCE, freq_map);
e_dialog_option_menu_set (priv->interval_unit,
ICAL_MONTHLY_RECURRENCE,
freq_map);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (menu), rpage);
break;
@ -1552,7 +1607,9 @@ recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
gtk_signal_handler_block_by_data (GTK_OBJECT (menu), rpage);
e_dialog_option_menu_set (priv->interval_unit, ICAL_YEARLY_RECURRENCE, freq_map);
e_dialog_option_menu_set (priv->interval_unit,
ICAL_YEARLY_RECURRENCE,
freq_map);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (menu), rpage);
break;
@ -1601,11 +1658,13 @@ recurrence_page_fill_widgets (EditorPage *page, CalComponent *comp)
cal_component_free_recur_list (rrule_list);
preview_recur (rpage);
priv->updating = FALSE;
}
/* fill_component handler for the recurrence page */
static void
recurrence_page_fill_component (EditorPage *page, CalComponent *comp)
recurrence_page_fill_component (CompEditorPage *page, CalComponent *comp)
{
RecurrencePage *rpage;
@ -1615,52 +1674,33 @@ recurrence_page_fill_component (EditorPage *page, CalComponent *comp)
/* set_summary handler for the recurrence page */
static void
recurrence_page_set_summary (EditorPage *page, const char *summary)
recurrence_page_set_summary (CompEditorPage *page, const char *summary)
{
RecurrencePage *rpage;
RecurrencePagePrivate *priv;
gchar *s;
rpage = RECURRENCE_PAGE (page);
priv = rpage->priv;
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->summary), rpage);
e_utf8_gtk_entry_set_text (GTK_ENTRY (priv->summary), summary);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->summary), rpage);
}
/* get_summary handler for the recurrence page */
static char *
recurrence_page_get_summary (EditorPage *page)
{
RecurrencePage *rpage;
RecurrencePagePrivate *priv;
rpage = RECURRENCE_PAGE (page);
priv = rpage->priv;
return e_utf8_gtk_entry_get_text (GTK_ENTRY (priv->summary));
s = e_utf8_to_gtk_string (priv->summary, summary);
gtk_label_set_text (GTK_LABEL (priv->summary), s);
g_free (s);
}
/* set_dates handler for the recurrence page */
static void
recurrence_page_set_dates (EditorPage *page, time_t start, time_t end)
recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
{
RecurrencePage *rpage;
RecurrencePagePrivate *priv;
char str[128];
struct tm tm;
CalComponentDateTime dt;
struct icaltimetype icaltime;
rpage = RECURRENCE_PAGE (page);
priv = rpage->priv;
/* Set the starting date label */
tm = *localtime (&start);
strftime (str, sizeof (str), _("%A %b %d %Y %H:%M:%S"), &tm);
gtk_label_set_text (GTK_LABEL (priv->starting_date), str);
comp_editor_date_label (dates, priv->date_time);
/* Copy the dates to our component */
@ -1670,11 +1710,13 @@ recurrence_page_set_dates (EditorPage *page, time_t start, time_t end)
dt.value = &icaltime;
dt.tzid = NULL;
*dt.value = icaltime_from_timet (start, FALSE);
*dt.value = icaltime_from_timet (dates->start, FALSE);
cal_component_set_dtstart (priv->comp, &dt);
*dt.value = icaltime_from_timet (end, FALSE);
cal_component_set_dtend (priv->comp, &dt);
if (dates->end != 0) {
*dt.value = icaltime_from_timet (dates->end, FALSE);
cal_component_set_dtend (priv->comp, &dt);
}
}
@ -1684,23 +1726,18 @@ static gboolean
get_widgets (RecurrencePage *rpage)
{
RecurrencePagePrivate *priv;
GtkWidget *toplevel;
priv = rpage->priv;
#define GW(name) glade_xml_get_widget (priv->xml, name)
toplevel = GW ("recurrence-toplevel");
priv->main = GW ("recurrence-page");
if (!(toplevel && priv->main))
return FALSE;
g_assert (priv->main);
gtk_widget_ref (priv->main);
gtk_widget_unparent (priv->main);
gtk_widget_destroy (toplevel);
priv->summary = GW ("summary");
priv->starting_date = GW ("starting-date");
priv->date_time = GW ("date-time");
priv->none = GW ("none");
priv->simple = GW ("simple");
@ -1723,9 +1760,9 @@ get_widgets (RecurrencePage *rpage)
priv->preview_bin = GW ("preview-bin");
#undef GW
return (priv->summary
&& priv->starting_date
&& priv->date_time
&& priv->none
&& priv->simple
&& priv->custom
@ -1744,16 +1781,6 @@ get_widgets (RecurrencePage *rpage)
&& priv->preview_bin);
}
/* Callback used when the summary changes; we emit the notification signal. */
static void
summary_changed_cb (GtkEditable *editable, gpointer data)
{
RecurrencePage *rpage;
rpage = RECURRENCE_PAGE (data);
editor_page_notify_summary_changed (EDITOR_PAGE (rpage));
}
/* Callback used when the displayed date range in the recurrence preview
* calendar changes.
*/
@ -1776,7 +1803,7 @@ type_toggled_cb (GtkToggleButton *toggle, gpointer data)
rpage = RECURRENCE_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
if (toggle->active) {
sensitize_recur_widgets (rpage);
@ -1792,7 +1819,7 @@ interval_value_changed_cb (GtkAdjustment *adj, gpointer data)
rpage = RECURRENCE_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
preview_recur (rpage);
}
@ -1806,7 +1833,7 @@ interval_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
rpage = RECURRENCE_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
make_recurrence_special (rpage);
preview_recur (rpage);
}
@ -1821,7 +1848,7 @@ ending_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
rpage = RECURRENCE_PAGE (data);
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
make_ending_special (rpage);
preview_recur (rpage);
}
@ -1837,7 +1864,7 @@ exception_add_cb (GtkWidget *widget, gpointer data)
rpage = RECURRENCE_PAGE (data);
priv = rpage->priv;
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
t = e_date_edit_get_time (E_DATE_EDIT (priv->exception_date));
append_exception (rpage, t);
@ -1861,7 +1888,7 @@ exception_modify_cb (GtkWidget *widget, gpointer data)
if (!clist->selection)
return;
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
sel = GPOINTER_TO_INT (clist->selection->data);
@ -1890,7 +1917,7 @@ exception_delete_cb (GtkWidget *widget, gpointer data)
if (!clist->selection)
return;
editor_page_notify_changed (EDITOR_PAGE (rpage));
field_changed (rpage);
sel = GPOINTER_TO_INT (clist->selection->data);
@ -1912,11 +1939,13 @@ exception_delete_cb (GtkWidget *widget, gpointer data)
preview_recur (rpage);
}
/* Callback used when a row is selected in the list of exception dates. We must
* update the date/time widgets to reflect the exception's value.
/* Callback used when a row is selected in the list of exception
* dates. We must update the date/time widgets to reflect the
* exception's value.
*/
static void
exception_select_row_cb (GtkCList *clist, gint row, gint col, GdkEvent *event, gpointer data)
exception_select_row_cb (GtkCList *clist, gint row, gint col,
GdkEvent *event, gpointer data)
{
RecurrencePage *rpage;
RecurrencePagePrivate *priv;
@ -1931,6 +1960,18 @@ exception_select_row_cb (GtkCList *clist, gint row, gint col, GdkEvent *event, g
e_date_edit_set_time (E_DATE_EDIT (priv->exception_date), *t);
}
/* This is called when any field is changed; it notifies upstream. */
static void
field_changed (RecurrencePage *rpage)
{
RecurrencePagePrivate *priv;
priv = rpage->priv;
if (!priv->updating)
comp_editor_page_notify_changed (COMP_EDITOR_PAGE (rpage));
}
/* Hooks the widget signals */
static void
init_widgets (RecurrencePage *rpage)
@ -1942,19 +1983,17 @@ init_widgets (RecurrencePage *rpage)
priv = rpage->priv;
/* Summary */
gtk_signal_connect (GTK_OBJECT (priv->summary), "changed",
GTK_SIGNAL_FUNC (summary_changed_cb), rpage);
/* Recurrence preview */
priv->preview_calendar = e_calendar_new ();
ecal = E_CALENDAR (priv->preview_calendar);
gtk_signal_connect (GTK_OBJECT (ecal->calitem), "date_range_changed",
GTK_SIGNAL_FUNC (preview_date_range_changed_cb), rpage);
GTK_SIGNAL_FUNC (preview_date_range_changed_cb),
rpage);
calendar_config_configure_e_calendar (ecal);
e_calendar_item_set_max_days_sel (ecal->calitem, 0);
gtk_container_add (GTK_CONTAINER (priv->preview_bin), priv->preview_calendar);
gtk_container_add (GTK_CONTAINER (priv->preview_bin),
priv->preview_calendar);
gtk_widget_show (priv->preview_calendar);
/* Recurrence types */
@ -1970,13 +2009,15 @@ init_widgets (RecurrencePage *rpage)
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (priv->interval_value));
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (interval_value_changed_cb), rpage);
GTK_SIGNAL_FUNC (interval_value_changed_cb),
rpage);
/* Recurrence units */
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
gtk_signal_connect (GTK_OBJECT (menu), "selection_done",
GTK_SIGNAL_FUNC (interval_selection_done_cb), rpage);
GTK_SIGNAL_FUNC (interval_selection_done_cb),
rpage);
/* Recurrence ending */
@ -2017,14 +2058,17 @@ recurrence_page_construct (RecurrencePage *rpage)
priv = rpage->priv;
priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/recurrence-page.glade", NULL);
priv->xml = glade_xml_new (EVOLUTION_GLADEDIR
"/recurrence-page.glade", NULL);
if (!priv->xml) {
g_message ("recurrence_page_construct(): Could not load the Glade XML file!");
g_message ("recurrence_page_construct(): "
"Could not load the Glade XML file!");
return NULL;
}
if (!get_widgets (rpage)) {
g_message ("recurrence_page_construct(): Could not find all widgets in the XML file!");
g_message ("recurrence_page_construct(): "
"Could not find all widgets in the XML file!");
return NULL;
}

View File

@ -18,6 +18,7 @@
<widget>
<class>GtkWindow</class>
<name>recurrence-toplevel</name>
<visible>False</visible>
<title>window1</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_NONE</position>
@ -36,7 +37,7 @@
<widget>
<class>GtkFrame</class>
<name>frame35</name>
<label>Appointment Basics</label>
<label>Basics</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
@ -58,14 +59,13 @@
<widget>
<class>GtkLabel</class>
<name>label66</name>
<label>Su_mmary:</label>
<label>Summary:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>recurrence-summary</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
@ -85,7 +85,7 @@
<widget>
<class>GtkLabel</class>
<name>label67</name>
<label>_Starting date:</label>
<label>Date/Time:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
@ -109,13 +109,15 @@
</widget>
<widget>
<class>GtkEntry</class>
<name>recurrence-summary</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<class>GtkLabel</class>
<name>summary</name>
<label></label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>4</xpad>
<ypad>0</ypad>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
@ -123,9 +125,9 @@
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>True</xshrink>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
@ -133,12 +135,15 @@
</widget>
<widget>
<class>GtkAlignment</class>
<name>alignment40</name>
<class>GtkLabel</class>
<name>date-time</name>
<label></label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xscale>0</xscale>
<yscale>0</yscale>
<xpad>4</xpad>
<ypad>0</ypad>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
@ -151,17 +156,8 @@
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
<yfill>False</yfill>
</child>
<widget>
<class>Custom</class>
<name>recurrence-starting-date</name>
<creation_function>make_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
<last_modification_time>Fri, 22 Sep 2000 20:51:38 GMT</last_modification_time>
</widget>
</widget>
</widget>
</widget>
@ -209,7 +205,7 @@
<widget>
<class>GtkRadioButton</class>
<name>recurrence-none</name>
<name>none</name>
<can_focus>True</can_focus>
<label>No recurrence</label>
<active>False</active>
@ -224,7 +220,7 @@
<widget>
<class>GtkRadioButton</class>
<name>recurrence-simple</name>
<name>simple</name>
<can_focus>True</can_focus>
<label>Simple recurrence</label>
<active>False</active>
@ -239,7 +235,7 @@
<widget>
<class>GtkRadioButton</class>
<name>recurrence-custom</name>
<name>custom</name>
<can_focus>True</can_focus>
<label>Custom recurrence</label>
<active>False</active>
@ -266,7 +262,7 @@
<widget>
<class>GtkHBox</class>
<name>recurrence-params</name>
<name>params</name>
<homogeneous>False</homogeneous>
<spacing>2</spacing>
<child>
@ -294,7 +290,7 @@
<widget>
<class>GtkSpinButton</class>
<name>recurrence-interval-value</name>
<name>interval-value</name>
<can_focus>True</can_focus>
<climb_rate>1</climb_rate>
<digits>0</digits>
@ -317,7 +313,7 @@
<widget>
<class>GtkOptionMenu</class>
<name>recurrence-interval-unit</name>
<name>interval-unit</name>
<can_focus>True</can_focus>
<items>day(s)
week(s)
@ -334,7 +330,7 @@ year(s)
<widget>
<class>GtkAlignment</class>
<name>recurrence-special</name>
<name>special</name>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xscale>0</xscale>
@ -352,7 +348,7 @@ year(s)
<widget>
<class>GtkOptionMenu</class>
<name>recurrence-ending-menu</name>
<name>ending-menu</name>
<can_focus>True</can_focus>
<items>for
until
@ -368,7 +364,7 @@ forever
<widget>
<class>GtkAlignment</class>
<name>recurrence-ending-special</name>
<name>ending-special</name>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xscale>0</xscale>
@ -387,7 +383,7 @@ forever
<widget>
<class>GtkAlignment</class>
<name>recurrence-custom-warning-bin</name>
<name>custom-warning-bin</name>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xscale>1</xscale>
@ -449,10 +445,9 @@ forever
<widget>
<class>GtkButton</class>
<name>recurrence-exception-add</name>
<name>exception-add</name>
<can_focus>True</can_focus>
<label>Add</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
@ -462,10 +457,9 @@ forever
<widget>
<class>GtkButton</class>
<name>recurrence-exception-modify</name>
<name>exception-modify</name>
<can_focus>True</can_focus>
<label>Modify</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
@ -475,10 +469,9 @@ forever
<widget>
<class>GtkButton</class>
<name>recurrence-exception-delete</name>
<name>exception-delete</name>
<can_focus>True</can_focus>
<label>Delete</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
@ -500,7 +493,7 @@ forever
<widget>
<class>Custom</class>
<name>recurrence-exception-date</name>
<name>exception-date</name>
<creation_function>make_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
@ -527,7 +520,7 @@ forever
<widget>
<class>GtkCList</class>
<name>recurrence-exception-list</name>
<name>exception-list</name>
<can_focus>True</can_focus>
<columns>1</columns>
<column_widths>80</column_widths>
@ -583,7 +576,7 @@ forever
<widget>
<class>GtkAlignment</class>
<name>recurrence-preview-bin</name>
<name>preview-bin</name>
<xalign>0</xalign>
<yalign>0</yalign>
<xscale>1</xscale>

View File

@ -25,7 +25,7 @@
#ifndef RECURRENCE_PAGE_H
#define RECURRENCE_PAGE_H
#include "editor-page.h"
#include "comp-editor-page.h"
BEGIN_GNOME_DECLS
@ -33,29 +33,27 @@ BEGIN_GNOME_DECLS
#define TYPE_RECURRENCE_PAGE (recurrence_page_get_type ())
#define RECURRENCE_PAGE(obj) (GTK_CHECK_CAST ((obj), TYPE_RECURRENCE_PAGE, RecurrencePage))
#define RECURRENCE_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_RECURRENCE_PAGE, \
RecurrencePageClass))
#define RECURRENCE_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_RECURRENCE_PAGE, RecurrencePageClass))
#define IS_RECURRENCE_PAGE(obj) (GTK_CHECK_TYPE ((obj), TYPE_RECURRENCE_PAGE))
#define IS_RECURRENCE_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), TYPE_RECURRENCE_PAGE))
typedef struct _RecurrencePagePrivate RecurrencePagePrivate;
typedef struct {
EditorPage page;
CompEditorPage page;
/* Private data */
RecurrencePagePrivate *priv;
} RecurrencePage;
typedef struct {
EditorPageClass parent_class;
CompEditorPageClass parent_class;
} RecurrencePageClass;
GtkType recurrence_page_get_type (void);
GtkType recurrence_page_get_type (void);
RecurrencePage *recurrence_page_construct (RecurrencePage *rpage);
RecurrencePage *recurrence_page_new (void);
RecurrencePage *recurrence_page_new (void);

View File

@ -0,0 +1,461 @@
/* Evolution calendar - Main page of the task editor dialog
*
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Federico Mena-Quintero <federico@ximian.com>
* Miguel de Icaza <miguel@ximian.com>
* Seth Alves <alves@hungry.com>
* JP Rosevear <jpr@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <gtk/gtksignal.h>
#include <gtk/gtktogglebutton.h>
#include <glade/glade.h>
#include <gal/widgets/e-unicode.h>
#include <widgets/misc/e-dateedit.h>
#include "e-util/e-dialog-widgets.h"
#include "../widget-util.h"
#include "comp-editor-util.h"
#include "task-details-page.h"
/* Private part of the TaskDetailsPage structure */
struct _TaskDetailsPagePrivate {
/* Glade XML data */
GladeXML *xml;
/* Widgets from the Glade file */
GtkWidget *main;
GtkWidget *summary;
GtkWidget *date_time;
GtkWidget *completed_date;
GtkWidget *url;
gboolean updating;
};
static void task_details_page_class_init (TaskDetailsPageClass *class);
static void task_details_page_init (TaskDetailsPage *tdpage);
static void task_details_page_destroy (GtkObject *object);
static GtkWidget *task_details_page_get_widget (CompEditorPage *page);
static void task_details_page_fill_widgets (CompEditorPage *page, CalComponent *comp);
static void task_details_page_fill_component (CompEditorPage *page, CalComponent *comp);
static void task_details_page_set_summary (CompEditorPage *page, const char *summary);
static void task_details_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
static CompEditorPageClass *parent_class = NULL;
/**
* task_details_page_get_type:
*
* Registers the #TaskDetailsPage class if necessary, and returns the type ID
* associated to it.
*
* Return value: The type ID of the #TaskDetailsPage class.
**/
GtkType
task_details_page_get_type (void)
{
static GtkType task_details_page_type;
if (!task_details_page_type) {
static const GtkTypeInfo task_details_page_info = {
"TaskDetailsPage",
sizeof (TaskDetailsPage),
sizeof (TaskDetailsPageClass),
(GtkClassInitFunc) task_details_page_class_init,
(GtkObjectInitFunc) task_details_page_init,
NULL, /* reserved_1 */
NULL, /* reserved_2 */
(GtkClassInitFunc) NULL
};
task_details_page_type =
gtk_type_unique (TYPE_COMP_EDITOR_PAGE,
&task_details_page_info);
}
return task_details_page_type;
}
/* Class initialization function for the task page */
static void
task_details_page_class_init (TaskDetailsPageClass *class)
{
CompEditorPageClass *editor_page_class;
GtkObjectClass *object_class;
editor_page_class = (CompEditorPageClass *) class;
object_class = (GtkObjectClass *) class;
parent_class = gtk_type_class (TYPE_COMP_EDITOR_PAGE);
editor_page_class->get_widget = task_details_page_get_widget;
editor_page_class->fill_widgets = task_details_page_fill_widgets;
editor_page_class->fill_component = task_details_page_fill_component;
editor_page_class->set_summary = task_details_page_set_summary;
editor_page_class->set_dates = task_details_page_set_dates;
object_class->destroy = task_details_page_destroy;
}
/* Object initialization function for the task page */
static void
task_details_page_init (TaskDetailsPage *tdpage)
{
TaskDetailsPagePrivate *priv;
priv = g_new0 (TaskDetailsPagePrivate, 1);
tdpage->priv = priv;
priv->xml = NULL;
priv->main = NULL;
priv->summary = NULL;
priv->date_time = NULL;
priv->completed_date = NULL;
priv->url = NULL;
priv->updating = FALSE;
}
/* Destroy handler for the task page */
static void
task_details_page_destroy (GtkObject *object)
{
TaskDetailsPage *tdpage;
TaskDetailsPagePrivate *priv;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_TASK_DETAILS_PAGE (object));
tdpage = TASK_DETAILS_PAGE (object);
priv = tdpage->priv;
if (priv->xml) {
gtk_object_unref (GTK_OBJECT (priv->xml));
priv->xml = NULL;
}
g_free (priv);
tdpage->priv = NULL;
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
/* get_widget handler for the task page */
static GtkWidget *
task_details_page_get_widget (CompEditorPage *page)
{
TaskDetailsPage *tdpage;
TaskDetailsPagePrivate *priv;
tdpage = TASK_DETAILS_PAGE (page);
priv = tdpage->priv;
return priv->main;
}
/* Fills the widgets with default values */
static void
clear_widgets (TaskDetailsPage *tdpage)
{
TaskDetailsPagePrivate *priv;
priv = tdpage->priv;
/* Summary */
gtk_label_set_text (GTK_LABEL (priv->summary), "");
/* Start date */
gtk_label_set_text (GTK_LABEL (priv->date_time), "");
/* Date completed */
e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), -1);
/* URL */
e_dialog_editable_set (priv->url, NULL);
}
/* fill_widgets handler for the task page */
static void
task_details_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
{
TaskDetailsPage *tdpage;
TaskDetailsPagePrivate *priv;
CalComponentText text;
const char *url;
CompEditorPageDates dates;
tdpage = TASK_DETAILS_PAGE (page);
priv = tdpage->priv;
priv->updating = TRUE;
/* Clean the screen */
clear_widgets (tdpage);
/* Summary */
cal_component_get_summary (comp, &text);
task_details_page_set_summary (page, text.value);
/* Dates */
comp_editor_dates (&dates, comp);
task_details_page_set_dates (page, &dates);
/* URL */
cal_component_get_url (comp, &url);
e_dialog_editable_set (priv->url, url);
priv->updating = FALSE;
}
/* fill_component handler for the task page */
static void
task_details_page_fill_component (CompEditorPage *page, CalComponent *comp)
{
TaskDetailsPage *tdpage;
TaskDetailsPagePrivate *priv;
CalComponentDateTime date;
time_t t;
char *url;
tdpage = TASK_DETAILS_PAGE (page);
priv = tdpage->priv;
/* Completed Date. */
date.value = g_new (struct icaltimetype, 1);
date.tzid = NULL;
t = e_date_edit_get_time (E_DATE_EDIT (priv->completed_date));
if (t != -1) {
*date.value = icaltime_from_timet (t, FALSE);
cal_component_set_completed (comp, date.value);
} else {
cal_component_set_completed (comp, NULL);
}
g_free (date.value);
/* URL. */
url = e_dialog_editable_get (priv->url);
cal_component_set_url (comp, url);
if (url)
g_free (url);
}
/* set_summary handler for the task page */
static void
task_details_page_set_summary (CompEditorPage *page, const char *summary)
{
TaskDetailsPage *tdpage;
TaskDetailsPagePrivate *priv;
gchar *s;
tdpage = TASK_DETAILS_PAGE (page);
priv = tdpage->priv;
s = e_utf8_to_gtk_string (priv->summary, summary);
gtk_label_set_text (GTK_LABEL (priv->summary), s);
g_free (s);
}
static void
task_details_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
{
TaskDetailsPage *tdpage;
TaskDetailsPagePrivate *priv;
tdpage = TASK_DETAILS_PAGE (page);
priv = tdpage->priv;
comp_editor_date_label (dates, priv->date_time);
}
/* Gets the widgets from the XML file and returns if they are all available. */
static gboolean
get_widgets (TaskDetailsPage *tdpage)
{
TaskDetailsPagePrivate *priv;
priv = tdpage->priv;
#define GW(name) glade_xml_get_widget (priv->xml, name)
priv->main = GW ("task-details-page");
g_assert (priv->main);
gtk_widget_ref (priv->main);
gtk_widget_unparent (priv->main);
priv->summary = GW ("summary");
priv->date_time = GW ("date-time");
priv->completed_date = GW ("completed-date");
priv->url = GW ("url");
#undef GW
return (priv->summary
&& priv->date_time
&& priv->completed_date
&& priv->url);
}
/* Callback used when the start or end date widgets change. We check that the
* start date < end date and we set the "all day task" button as appropriate.
*/
static void
date_changed_cb (EDateEdit *dedit, gpointer data)
{
TaskDetailsPage *tdpage;
TaskDetailsPagePrivate *priv;
CompEditorPageDates dates;
tdpage = TASK_DETAILS_PAGE (data);
priv = tdpage->priv;
if (priv->updating)
return;
dates.start = 0;
dates.end = 0;
dates.due = 0;
dates.complete = e_date_edit_get_time (E_DATE_EDIT (priv->completed_date));
/* Notify upstream */
comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tdpage), &dates);
}
/* This is called when any field is changed; it notifies upstream. */
static void
field_changed_cb (GtkWidget *widget, gpointer data)
{
TaskDetailsPage *tdpage;
TaskDetailsPagePrivate *priv;
tdpage = TASK_DETAILS_PAGE (data);
priv = tdpage->priv;
if (!priv->updating)
comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage));
}
/* Hooks the widget signals */
static void
init_widgets (TaskDetailsPage *tdpage)
{
TaskDetailsPagePrivate *priv;
priv = tdpage->priv;
/* Completed Date */
gtk_signal_connect (GTK_OBJECT (priv->completed_date), "changed",
GTK_SIGNAL_FUNC (date_changed_cb), tdpage);
/* URL */
gtk_signal_connect (GTK_OBJECT (priv->url), "changed",
GTK_SIGNAL_FUNC (field_changed_cb), tdpage);
}
/**
* task_details_page_construct:
* @tdpage: An task details page.
*
* Constructs an task page by loading its Glade data.
*
* Return value: The same object as @tdpage, or NULL if the widgets could not
* be created.
**/
TaskDetailsPage *
task_details_page_construct (TaskDetailsPage *tdpage)
{
TaskDetailsPagePrivate *priv;
priv = tdpage->priv;
priv->xml = glade_xml_new (EVOLUTION_GLADEDIR
"/task-details-page.glade", NULL);
if (!priv->xml) {
g_message ("task_details_page_construct(): "
"Could not load the Glade XML file!");
return NULL;
}
if (!get_widgets (tdpage)) {
g_message ("task_details_page_construct(): "
"Could not find all widgets in the XML file!");
return NULL;
}
init_widgets (tdpage);
return tdpage;
}
/**
* task_details_page_new:
*
* Creates a new task details page.
*
* Return value: A newly-created task details page, or NULL if the page could
* not be created.
**/
TaskDetailsPage *
task_details_page_new (void)
{
TaskDetailsPage *tdpage;
tdpage = gtk_type_new (TYPE_TASK_DETAILS_PAGE);
if (!task_details_page_construct (tdpage)) {
gtk_object_unref (GTK_OBJECT (tdpage));
return NULL;
}
return tdpage;
}
GtkWidget *task_details_page_create_date_edit (void);
GtkWidget *
task_details_page_create_date_edit (void)
{
GtkWidget *dedit;
dedit = date_edit_new (TRUE, TRUE);
e_date_edit_set_allow_no_date_set (E_DATE_EDIT (dedit), TRUE);
return dedit;
}

View File

@ -15,6 +15,7 @@
<widget>
<class>GtkWindow</class>
<name>task-details-toplevel</name>
<visible>False</visible>
<title>window1</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_NONE</position>
@ -24,112 +25,253 @@
<auto_shrink>False</auto_shrink>
<widget>
<class>GtkTable</class>
<class>GtkVBox</class>
<name>task-details-page</name>
<border_width>4</border_width>
<rows>2</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>2</row_spacing>
<column_spacing>4</column_spacing>
<spacing>4</spacing>
<widget>
<class>GtkLabel</class>
<name>label12</name>
<label>Date Completed:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<class>GtkFrame</class>
<name>frame1</name>
<label>Basics</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
<widget>
<class>GtkTable</class>
<name>table1</name>
<border_width>4</border_width>
<rows>2</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>2</row_spacing>
<column_spacing>2</column_spacing>
<widget>
<class>GtkLabel</class>
<name>label15</name>
<label>Summary:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>False</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label16</name>
<label>Date/Time:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>False</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>date-time</name>
<label></label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>4</xpad>
<ypad>0</ypad>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>summary</name>
<label></label>
<justify>GTK_JUSTIFY_LEFT</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>4</xpad>
<ypad>0</ypad>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<name>label14</name>
<label>URL:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<class>GtkTable</class>
<name>table1</name>
<border_width>4</border_width>
<rows>2</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>2</row_spacing>
<column_spacing>4</column_spacing>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
</widget>
<widget>
<class>GtkEntry</class>
<name>url</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<widget>
<class>GtkLabel</class>
<name>label12</name>
<label>Date Completed:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>Custom</class>
<name>completed-date</name>
<creation_function>task_editor_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
<last_modification_time>Sun, 10 Sep 2000 17:34:07 GMT</last_modification_time>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<widget>
<class>GtkLabel</class>
<name>label14</name>
<label>URL:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkEntry</class>
<name>url</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>Custom</class>
<name>completed-date</name>
<creation_function>task_details_page_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
<last_modification_time>Fri, 01 Jun 2001 18:58:51 GMT</last_modification_time>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
</widget>
</widget>

View File

@ -0,0 +1,62 @@
/* Evolution calendar - Main page of the task editor dialog
*
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Federico Mena-Quintero <federico@ximian.com>
* Miguel de Icaza <miguel@ximian.com>
* Seth Alves <alves@hungry.com>
* JP Rosevear <jpr@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef TASK_DETAILS_PAGE_H
#define TASK_DETAILS_PAGE_H
#include "comp-editor-page.h"
BEGIN_GNOME_DECLS
#define TYPE_TASK_DETAILS_PAGE (task_details_page_get_type ())
#define TASK_DETAILS_PAGE(obj) (GTK_CHECK_CAST ((obj), TYPE_TASK_DETAILS_PAGE, TaskDetailsPage))
#define TASK_DETAILS_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_TASK_DETAILS_PAGE, TaskDetailsPageClass))
#define IS_TASK_DETAILS_PAGE(obj) (GTK_CHECK_TYPE ((obj), TYPE_TASK_DETAILS_PAGE))
#define IS_TASK_DETAILS_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), TYPE_TASK_DETAILS_PAGE))
typedef struct _TaskDetailsPagePrivate TaskDetailsPagePrivate;
typedef struct {
CompEditorPage page;
/* Private data */
TaskDetailsPagePrivate *priv;
} TaskDetailsPage;
typedef struct {
CompEditorPageClass parent_class;
} TaskDetailsPageClass;
GtkType task_details_page_get_type (void);
TaskDetailsPage *task_details_page_construct (TaskDetailsPage *epage);
TaskDetailsPage *task_details_page_new (void);
END_GNOME_DECLS
#endif

View File

@ -1,695 +0,0 @@
<?xml version="1.0"?>
<GTK-Interface>
<project>
<name>task-editor-dialog</name>
<program_name>task-editor-dialog</program_name>
<directory></directory>
<source_directory>src</source_directory>
<pixmaps_directory>pixmaps</pixmaps_directory>
<language>C</language>
<gnome_support>True</gnome_support>
<gettext_support>True</gettext_support>
</project>
<widget>
<class>GnomePropertyBox</class>
<name>task-editor-dialog</name>
<visible>False</visible>
<position>GTK_WIN_POS_NONE</position>
<modal>False</modal>
<allow_shrink>False</allow_shrink>
<allow_grow>False</allow_grow>
<auto_shrink>False</auto_shrink>
<widget>
<class>GtkNotebook</class>
<child_name>GnomeDock:contents</child_name>
<name>notebook1</name>
<border_width>2</border_width>
<can_focus>True</can_focus>
<show_tabs>True</show_tabs>
<show_border>True</show_border>
<tab_pos>GTK_POS_TOP</tab_pos>
<scrollable>False</scrollable>
<tab_hborder>2</tab_hborder>
<tab_vborder>2</tab_vborder>
<popup_enable>False</popup_enable>
<widget>
<class>GtkVBox</class>
<name>vbox1</name>
<border_width>4</border_width>
<homogeneous>False</homogeneous>
<spacing>4</spacing>
<widget>
<class>GtkTable</class>
<name>table3</name>
<rows>1</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>4</row_spacing>
<column_spacing>4</column_spacing>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label3</name>
<label>Su_mmary:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>summary</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>False</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkEntry</class>
<name>summary</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
<widget>
<class>GtkFrame</class>
<name>frame2</name>
<label>Date &amp; Time</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHBox</class>
<name>hbox4</name>
<border_width>4</border_width>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<widget>
<class>GtkTable</class>
<name>table1</name>
<rows>2</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>2</row_spacing>
<column_spacing>4</column_spacing>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label6</name>
<label>Sta_rt Date:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label5</name>
<label>_Due Date:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>Custom</class>
<name>due-date</name>
<creation_function>task_editor_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
<last_modification_time>Sun, 10 Sep 2000 17:32:18 GMT</last_modification_time>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>Custom</class>
<name>start-date</name>
<creation_function>task_editor_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
<last_modification_time>Sun, 10 Sep 2000 17:33:31 GMT</last_modification_time>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
</widget>
</widget>
<widget>
<class>GtkScrolledWindow</class>
<name>scrolledwindow1</name>
<hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkText</class>
<name>description</name>
<height>80</height>
<can_focus>True</can_focus>
<editable>True</editable>
<text></text>
</widget>
</widget>
<widget>
<class>GtkFrame</class>
<name>frame23</name>
<label>Progress</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHBox</class>
<name>hbox3</name>
<border_width>4</border_width>
<homogeneous>False</homogeneous>
<spacing>4</spacing>
<widget>
<class>GtkLabel</class>
<name>label7</name>
<label>_Status:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>status</default_focus_target>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkOptionMenu</class>
<name>status</name>
<can_focus>True</can_focus>
<items>Not Started
In Progress
Completed
Cancelled
</items>
<initial_choice>0</initial_choice>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label8</name>
<label>_Priority:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>priority</default_focus_target>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkOptionMenu</class>
<name>priority</name>
<can_focus>True</can_focus>
<items>High
Normal
Low
Undefined
</items>
<initial_choice>0</initial_choice>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label9</name>
<label>% Comp_lete:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>percent-complete</default_focus_target>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkSpinButton</class>
<name>percent-complete</name>
<width>60</width>
<can_focus>True</can_focus>
<climb_rate>1</climb_rate>
<digits>0</digits>
<numeric>False</numeric>
<update_policy>GTK_UPDATE_ALWAYS</update_policy>
<snap>False</snap>
<wrap>False</wrap>
<value>0</value>
<lower>0</lower>
<upper>100</upper>
<step>10</step>
<page>10</page>
<page_size>10</page_size>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
</widget>
</widget>
<widget>
<class>GtkFrame</class>
<name>frame24</name>
<label>Classification</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHBox</class>
<name>hbox6</name>
<border_width>2</border_width>
<homogeneous>False</homogeneous>
<spacing>4</spacing>
<widget>
<class>GtkRadioButton</class>
<name>classification-public</name>
<can_focus>True</can_focus>
<label>Pu_blic</label>
<active>True</active>
<draw_indicator>True</draw_indicator>
<group>classification_radio_group</group>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkRadioButton</class>
<name>classification-private</name>
<can_focus>True</can_focus>
<label>Pri_vate</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
<group>classification_radio_group</group>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkRadioButton</class>
<name>classification-confidential</name>
<can_focus>True</can_focus>
<label>_Confidential</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
<group>classification_radio_group</group>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
</widget>
</widget>
<widget>
<class>GtkHBox</class>
<name>hbox2</name>
<homogeneous>False</homogeneous>
<spacing>2</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkButton</class>
<name>contacts-button</name>
<can_focus>True</can_focus>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label16</name>
<label>_Contacts...</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>4</xpad>
<ypad>0</ypad>
</widget>
</widget>
<widget>
<class>GtkEntry</class>
<name>contacts</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
</widget>
<widget>
<class>GtkButton</class>
<name>categories-button</name>
<can_focus>True</can_focus>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label17</name>
<label>Ca_tegories...</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>4</xpad>
<ypad>0</ypad>
</widget>
</widget>
<widget>
<class>GtkEntry</class>
<name>categories</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
</widget>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<child_name>Notebook:tab</child_name>
<name>label1</name>
<label>Task</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
</widget>
<widget>
<class>GtkTable</class>
<name>table4</name>
<border_width>4</border_width>
<rows>2</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>2</row_spacing>
<column_spacing>4</column_spacing>
<widget>
<class>GtkLabel</class>
<name>label12</name>
<label>Date Completed:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label14</name>
<label>URL:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkEntry</class>
<name>url</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>Custom</class>
<name>completed-date</name>
<creation_function>task_editor_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
<last_modification_time>Sun, 10 Sep 2000 17:34:07 GMT</last_modification_time>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<child_name>Notebook:tab</child_name>
<name>label2</name>
<label>Details</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
</widget>
</widget>
</widget>
</GTK-Interface>

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,16 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Author :
* Damon Chaplin <damon@ximian.com>
/* Evolution calendar - Task editor dialog
*
* Copyright 2000, Helix Code, Inc.
* Copyright 2000, Ximian, Inc.
* Copyright (C) 2000 Helix Code, Inc.
* Copyright (C) 2001 Ximian, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
* Authors: Miguel de Icaza <miguel@ximian.com>
* Federico Mena-Quintero <federico@ximian.com>
* Seth Alves <alves@hungry.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -19,52 +19,45 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _TASK_EDITOR_H_
#define _TASK_EDITOR_H_
#include <gtk/gtkobject.h>
#ifndef __TASK_EDITOR_H__
#define __TASK_EDITOR_H__
#include <libgnome/gnome-defs.h>
#include <bonobo.h>
#include <cal-client/cal-client.h>
#include <gtk/gtkobject.h>
#include "comp-editor.h"
BEGIN_GNOME_DECLS
#define TYPE_TASK_EDITOR (task_editor_get_type ())
#define TASK_EDITOR(obj) (GTK_CHECK_CAST ((obj), TYPE_TASK_EDITOR, TaskEditor))
#define TASK_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_TASK_EDITOR, \
TaskEditorClass))
#define IS_TASK_EDITOR(obj) (GTK_CHECK_TYPE ((obj), TYPE_TASK_EDITOR))
#define IS_TASK_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_TASK_EDITOR))
#define TASK_EDITOR(obj) GTK_CHECK_CAST (obj, task_editor_get_type (), TaskEditor)
#define TASK_EDITOR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, task_editor_get_type (), TaskEditorClass)
#define IS_TASK_EDITOR(obj) GTK_CHECK_TYPE (obj, task_editor_get_type ())
typedef struct _TaskEditor TaskEditor;
typedef struct _TaskEditorClass TaskEditorClass;
typedef struct _TaskEditorPrivate TaskEditorPrivate;
typedef struct _TaskEditor TaskEditor;
typedef struct _TaskEditorClass TaskEditorClass;
struct _TaskEditor
{
GtkObject object;
struct _TaskEditor {
CompEditor parent;
/* Private data */
gpointer priv;
TaskEditorPrivate *priv;
};
struct _TaskEditorClass
{
GtkObjectClass parent_class;
struct _TaskEditorClass {
CompEditorClass parent_class;
};
GtkType task_editor_get_type (void);
TaskEditor* task_editor_construct (TaskEditor *tedit);
TaskEditor* task_editor_new (void);
void task_editor_set_cal_client (TaskEditor *tedit,
CalClient *client);
void task_editor_set_todo_object (TaskEditor *tedit,
CalComponent *comp);
void task_editor_focus (TaskEditor *tedit);
GtkType task_editor_get_type (void);
TaskEditor *task_editor_construct (TaskEditor *ee);
TaskEditor *task_editor_new (void);
void task_editor_update_widgets (TaskEditor *ee);
END_GNOME_DECLS
#endif /* _TASK_EDITOR_H_ */
#endif /* __TASK_EDITOR_H__ */

View File

@ -0,0 +1,966 @@
/* Evolution calendar - Main page of the task editor dialog
*
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Federico Mena-Quintero <federico@ximian.com>
* Miguel de Icaza <miguel@ximian.com>
* Seth Alves <alves@hungry.com>
* JP Rosevear <jpr@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string.h>
#include <gtk/gtksignal.h>
#include <gtk/gtktogglebutton.h>
#include <gtk/gtkspinbutton.h>
#include <gtk/gtkoptionmenu.h>
#include <glade/glade.h>
#include <gal/widgets/e-unicode.h>
#include <gal/widgets/e-categories.h>
#include <widgets/misc/e-dateedit.h>
#include "e-util/e-dialog-widgets.h"
#include "../widget-util.h"
#include "task-page.h"
/* Private part of the TaskPage structure */
struct _TaskPagePrivate {
/* Glade XML data */
GladeXML *xml;
/* Widgets from the Glade file */
GtkWidget *main;
GtkWidget *summary;
GtkWidget *due_date;
GtkWidget *start_date;
GtkWidget *percent_complete;
GtkWidget *status;
GtkWidget *priority;
GtkWidget *description;
GtkWidget *classification_public;
GtkWidget *classification_private;
GtkWidget *classification_confidential;
GtkWidget *contacts_btn;
GtkWidget *contacts;
GtkWidget *categories_btn;
GtkWidget *categories;
gboolean updating;
};
/* Note that these two arrays must match. */
static const int status_map[] = {
ICAL_STATUS_NEEDSACTION,
ICAL_STATUS_INPROCESS,
ICAL_STATUS_COMPLETED,
ICAL_STATUS_CANCELLED,
-1
};
typedef enum {
PRIORITY_HIGH,
PRIORITY_NORMAL,
PRIORITY_LOW,
PRIORITY_UNDEFINED,
} TaskEditorPriority;
static const int priority_map[] = {
PRIORITY_HIGH,
PRIORITY_NORMAL,
PRIORITY_LOW,
PRIORITY_UNDEFINED,
-1
};
static const int classification_map[] = {
CAL_COMPONENT_CLASS_PUBLIC,
CAL_COMPONENT_CLASS_PRIVATE,
CAL_COMPONENT_CLASS_CONFIDENTIAL,
-1
};
static void task_page_class_init (TaskPageClass *class);
static void task_page_init (TaskPage *tpage);
static void task_page_destroy (GtkObject *object);
static GtkWidget *task_page_get_widget (CompEditorPage *page);
static void task_page_fill_widgets (CompEditorPage *page, CalComponent *comp);
static void task_page_fill_component (CompEditorPage *page, CalComponent *comp);
static void task_page_set_summary (CompEditorPage *page, const char *summary);
static void task_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
static CompEditorPageClass *parent_class = NULL;
/**
* task_page_get_type:
*
* Registers the #TaskPage class if necessary, and returns the type ID
* associated to it.
*
* Return value: The type ID of the #TaskPage class.
**/
GtkType
task_page_get_type (void)
{
static GtkType task_page_type;
if (!task_page_type) {
static const GtkTypeInfo task_page_info = {
"TaskPage",
sizeof (TaskPage),
sizeof (TaskPageClass),
(GtkClassInitFunc) task_page_class_init,
(GtkObjectInitFunc) task_page_init,
NULL, /* reserved_1 */
NULL, /* reserved_2 */
(GtkClassInitFunc) NULL
};
task_page_type = gtk_type_unique (TYPE_COMP_EDITOR_PAGE,
&task_page_info);
}
return task_page_type;
}
/* Class initialization function for the task page */
static void
task_page_class_init (TaskPageClass *class)
{
CompEditorPageClass *editor_page_class;
GtkObjectClass *object_class;
editor_page_class = (CompEditorPageClass *) class;
object_class = (GtkObjectClass *) class;
parent_class = gtk_type_class (TYPE_COMP_EDITOR_PAGE);
editor_page_class->get_widget = task_page_get_widget;
editor_page_class->fill_widgets = task_page_fill_widgets;
editor_page_class->fill_component = task_page_fill_component;
editor_page_class->set_summary = task_page_set_summary;
editor_page_class->set_dates = task_page_set_dates;
object_class->destroy = task_page_destroy;
}
/* Object initialization function for the task page */
static void
task_page_init (TaskPage *tpage)
{
TaskPagePrivate *priv;
priv = g_new0 (TaskPagePrivate, 1);
tpage->priv = priv;
priv->xml = NULL;
priv->main = NULL;
priv->summary = NULL;
priv->due_date = NULL;
priv->start_date = NULL;
priv->percent_complete = NULL;
priv->status = NULL;
priv->description = NULL;
priv->classification_public = NULL;
priv->classification_private = NULL;
priv->classification_confidential = NULL;
priv->contacts_btn = NULL;
priv->contacts = NULL;
priv->categories_btn = NULL;
priv->categories = NULL;
priv->updating = FALSE;
}
/* Destroy handler for the task page */
static void
task_page_destroy (GtkObject *object)
{
TaskPage *tpage;
TaskPagePrivate *priv;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_TASK_PAGE (object));
tpage = TASK_PAGE (object);
priv = tpage->priv;
if (priv->xml) {
gtk_object_unref (GTK_OBJECT (priv->xml));
priv->xml = NULL;
}
g_free (priv);
tpage->priv = NULL;
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
/* get_widget handler for the task page */
static GtkWidget *
task_page_get_widget (CompEditorPage *page)
{
TaskPage *tpage;
TaskPagePrivate *priv;
tpage = TASK_PAGE (page);
priv = tpage->priv;
return priv->main;
}
/* Fills the widgets with default values */
static void
clear_widgets (TaskPage *tpage)
{
TaskPagePrivate *priv;
time_t now;
priv = tpage->priv;
now = time (NULL);
/* Summary, description */
e_dialog_editable_set (priv->summary, NULL);
e_dialog_editable_set (priv->description, NULL);
/* Start, due times */
e_date_edit_set_time (E_DATE_EDIT (priv->start_date), now);
e_date_edit_set_time (E_DATE_EDIT (priv->due_date), now);
/* Classification */
e_dialog_radio_set (priv->classification_public,
CAL_COMPONENT_CLASS_PRIVATE, classification_map);
/* Status, priority, complete percent */
e_dialog_spin_set (priv->percent_complete, 0.0);
e_dialog_option_menu_set (priv->status, 0, status_map);
e_dialog_option_menu_set (priv->priority, 0, priority_map);
/* Categories */
e_dialog_editable_set (priv->categories, NULL);
}
static TaskEditorPriority
priority_value_to_index (int priority_value)
{
TaskEditorPriority retval;
if (priority_value == 0)
retval = PRIORITY_UNDEFINED;
else if (priority_value <= 4)
retval = PRIORITY_HIGH;
else if (priority_value == 5)
retval = PRIORITY_NORMAL;
else
retval = PRIORITY_LOW;
return retval;
}
static int
priority_index_to_value (TaskEditorPriority priority)
{
int retval;
switch (priority) {
case PRIORITY_UNDEFINED:
retval = 0;
break;
case PRIORITY_HIGH:
retval = 3;
break;
case PRIORITY_NORMAL:
retval = 5;
break;
case PRIORITY_LOW:
retval = 7;
break;
default:
retval = -1;
g_assert_not_reached ();
break;
}
return retval;
}
/* Decode the radio button group for classifications */
static CalComponentClassification
classification_get (GtkWidget *widget)
{
return e_dialog_radio_get (widget, classification_map);
}
/* fill_widgets handler for the task page */
static void
task_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
{
TaskPage *tpage;
TaskPagePrivate *priv;
CalComponentText text;
CalComponentDateTime d;
CalComponentClassification cl;
GSList *l;
time_t t;
int *priority_value, *percent;
icalproperty_status status;
TaskEditorPriority priority;
const char *categories;
tpage = TASK_PAGE (page);
priv = tpage->priv;
priv->updating = TRUE;
/* Clean the screen */
clear_widgets (tpage);
/* Summary, description(s) */
cal_component_get_summary (comp, &text);
e_dialog_editable_set (priv->summary, text.value);
cal_component_get_description_list (comp, &l);
if (l) {
text = *(CalComponentText *)l->data;
e_dialog_editable_set (priv->description, text.value);
} else {
e_dialog_editable_set (priv->description, NULL);
}
cal_component_free_text_list (l);
/* Due Date. */
cal_component_get_due (comp, &d);
if (d.value) {
t = icaltime_as_timet (*d.value);
} else {
t = -1;
}
e_date_edit_set_time (E_DATE_EDIT (priv->due_date), t);
/* Start Date. */
cal_component_get_dtstart (comp, &d);
if (d.value) {
t = icaltime_as_timet (*d.value);
} else {
t = -1;
}
e_date_edit_set_time (E_DATE_EDIT (priv->start_date), t);
/* Percent Complete. */
cal_component_get_percent (comp, &percent);
if (percent) {
e_dialog_spin_set (priv->percent_complete, *percent);
cal_component_free_percent (percent);
} else {
/* FIXME: Could check if task is completed and set 100%. */
e_dialog_spin_set (priv->percent_complete, 0);
}
/* Status. */
cal_component_get_status (comp, &status);
if (status == ICAL_STATUS_NONE) {
/* Try to user the percent value. */
if (percent) {
if (*percent == 0)
status = ICAL_STATUS_NEEDSACTION;
else if (*percent == 100)
status = ICAL_STATUS_COMPLETED;
else
status = ICAL_STATUS_INPROCESS;
} else
status = ICAL_STATUS_NEEDSACTION;
}
e_dialog_option_menu_set (priv->status, status, status_map);
/* Priority. */
cal_component_get_priority (comp, &priority_value);
if (priority_value) {
priority = priority_value_to_index (*priority_value);
cal_component_free_priority (priority_value);
} else {
priority = PRIORITY_UNDEFINED;
}
e_dialog_option_menu_set (priv->priority, priority, priority_map);
/* Classification. */
cal_component_get_classification (comp, &cl);
switch (cl) {
case CAL_COMPONENT_CLASS_PUBLIC:
e_dialog_radio_set (priv->classification_public,
CAL_COMPONENT_CLASS_PUBLIC,
classification_map);
case CAL_COMPONENT_CLASS_PRIVATE:
e_dialog_radio_set (priv->classification_public,
CAL_COMPONENT_CLASS_PRIVATE,
classification_map);
case CAL_COMPONENT_CLASS_CONFIDENTIAL:
e_dialog_radio_set (priv->classification_public,
CAL_COMPONENT_CLASS_CONFIDENTIAL,
classification_map);
default:
/* What do do? We can't g_assert_not_reached() since it is a
* value from an external file.
*/
}
/* Categories */
cal_component_get_categories (comp, &categories);
e_dialog_editable_set (priv->categories, categories);
priv->updating = FALSE;
}
/* fill_component handler for the task page */
static void
task_page_fill_component (CompEditorPage *page, CalComponent *comp)
{
TaskPage *tpage;
TaskPagePrivate *priv;
CalComponentDateTime date;
time_t t;
icalproperty_status status;
TaskEditorPriority priority;
int priority_value, percent;
char *cat;
char *str;
tpage = TASK_PAGE (page);
priv = tpage->priv;
/* Summary. */
str = e_dialog_editable_get (priv->summary);
if (!str || strlen (str) == 0)
cal_component_set_summary (comp, NULL);
else {
CalComponentText text;
text.value = str;
text.altrep = NULL;
cal_component_set_summary (comp, &text);
}
if (str)
g_free (str);
/* Description */
str = e_dialog_editable_get (priv->description);
if (!str || strlen (str) == 0)
cal_component_set_description_list (comp, NULL);
else {
GSList l;
CalComponentText text;
text.value = str;
text.altrep = NULL;
l.data = &text;
l.next = NULL;
cal_component_set_description_list (comp, &l);
}
if (!str)
g_free (str);
/* Dates */
date.value = g_new (struct icaltimetype, 1);
date.tzid = NULL;
/* Due Date. */
t = e_date_edit_get_time (E_DATE_EDIT (priv->due_date));
if (t != -1) {
*date.value = icaltime_from_timet (t, FALSE);
cal_component_set_due (comp, &date);
} else {
cal_component_set_due (comp, NULL);
}
/* Start Date. */
t = e_date_edit_get_time (E_DATE_EDIT (priv->start_date));
if (t != -1) {
*date.value = icaltime_from_timet (t, FALSE);
cal_component_set_dtstart (comp, &date);
} else {
cal_component_set_dtstart (comp, NULL);
}
/* Percent Complete. */
percent = e_dialog_spin_get_int (priv->percent_complete);
cal_component_set_percent (comp, &percent);
/* Status. */
status = e_dialog_option_menu_get (priv->status, status_map);
cal_component_set_status (comp, status);
/* Priority. */
priority = e_dialog_option_menu_get (priv->priority, priority_map);
priority_value = priority_index_to_value (priority);
cal_component_set_priority (comp, &priority_value);
/* Classification. */
cal_component_set_classification (comp, classification_get (priv->classification_public));
/* Categories */
cat = e_dialog_editable_get (priv->categories);
cal_component_set_categories (comp, cat);
if (cat)
g_free (cat);
}
/* set_summary handler for the task page */
static void
task_page_set_summary (CompEditorPage *page, const char *summary)
{
TaskPage *tpage;
TaskPagePrivate *priv;
tpage = TASK_PAGE (page);
priv = tpage->priv;
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->summary), tpage);
e_utf8_gtk_entry_set_text (GTK_ENTRY (priv->summary), summary);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->summary), tpage);
}
static void
task_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
{
TaskPage *tpage;
TaskPagePrivate *priv;
tpage = TASK_PAGE (page);
priv = tpage->priv;
priv->updating = TRUE;
if (dates->complete != 0) {
if (dates->complete == -1) {
/* If the 'Completed Date' is set to 'None',
we set the status to 'Not Started' and the
percent-complete to 0. The task may
actually be partially-complete, but we
leave it to the user to set those
fields. */
e_dialog_option_menu_set (priv->status,
ICAL_STATUS_NEEDSACTION,
status_map);
e_dialog_spin_set (priv->percent_complete, 0);
} else {
e_dialog_option_menu_set (priv->status,
ICAL_STATUS_COMPLETED,
status_map);
e_dialog_spin_set (priv->percent_complete, 100);
}
}
priv->updating = FALSE;
}
/* Gets the widgets from the XML file and returns if they are all available. */
static gboolean
get_widgets (TaskPage *tpage)
{
TaskPagePrivate *priv;
priv = tpage->priv;
#define GW(name) glade_xml_get_widget (priv->xml, name)
priv->main = GW ("task-page");
g_assert (priv->main);
gtk_widget_ref (priv->main);
gtk_widget_unparent (priv->main);
priv->summary = GW ("summary");
priv->due_date = GW ("due-date");
priv->start_date = GW ("start-date");
priv->percent_complete = GW ("percent-complete");
priv->status = GW ("status");
priv->priority = GW ("priority");
priv->description = GW ("description");
priv->classification_public = GW ("classification-public");
priv->classification_private = GW ("classification-private");
priv->classification_confidential = GW ("classification-confidential");
priv->contacts_btn = GW ("contacts-button");
priv->contacts = GW ("contacts");
priv->categories_btn = GW ("categories-button");
priv->categories = GW ("categories");
#undef GW
return (priv->summary
&& priv->due_date
&& priv->start_date
&& priv->percent_complete
&& priv->status
&& priv->priority
&& priv->classification_public
&& priv->classification_private
&& priv->classification_confidential
&& priv->description
&& priv->contacts_btn
&& priv->contacts
&& priv->categories_btn
&& priv->categories);
}
/* Callback used when the summary changes; we emit the notification signal. */
static void
summary_changed_cb (GtkEditable *editable, gpointer data)
{
TaskPage *tpage;
TaskPagePrivate *priv;
gchar *summary;
tpage = TASK_PAGE (data);
priv = tpage->priv;
if (priv->updating)
return;
summary = gtk_editable_get_chars (editable, 0, -1);
comp_editor_page_notify_summary_changed (COMP_EDITOR_PAGE (tpage),
summary);
g_free (summary);
}
/* Callback used when the start or end date widgets change. We check that the
* start date < end date and we set the "all day task" button as appropriate.
*/
static void
date_changed_cb (EDateEdit *dedit, gpointer data)
{
TaskPage *tpage;
TaskPagePrivate *priv;
CompEditorPageDates dates;
tpage = TASK_PAGE (data);
priv = tpage->priv;
if (priv->updating)
return;
dates.start = e_date_edit_get_time (E_DATE_EDIT (priv->start_date));
dates.end = 0;
dates.due = e_date_edit_get_time (E_DATE_EDIT (priv->due_date));
dates.complete = 0;
/* Notify upstream */
comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tpage),
&dates);
}
/* Callback used when the categories button is clicked; we must bring up the
* category list dialog.
*/
static void
categories_clicked_cb (GtkWidget *button, gpointer data)
{
TaskPage *tpage;
TaskPagePrivate *priv;
char *categories;
GnomeDialog *dialog;
int result;
GtkWidget *entry;
tpage = TASK_PAGE (data);
priv = tpage->priv;
entry = priv->categories;
categories = e_utf8_gtk_entry_get_text (GTK_ENTRY (entry));
dialog = GNOME_DIALOG (e_categories_new (categories));
result = gnome_dialog_run (dialog);
g_free (categories);
if (result == 0) {
gtk_object_get (GTK_OBJECT (dialog),
"categories", &categories,
NULL);
e_utf8_gtk_entry_set_text (GTK_ENTRY (entry), categories);
g_free (categories);
}
gtk_object_destroy (GTK_OBJECT (dialog));
}
/* This is called when any field is changed; it notifies upstream. */
static void
field_changed_cb (GtkWidget *widget, gpointer data)
{
TaskPage *tpage;
TaskPagePrivate *priv;
tpage = TASK_PAGE (data);
priv = tpage->priv;
if (!priv->updating)
comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tpage));
}
static void
complete_date_changed (TaskPage *tpage, time_t complete)
{
TaskPagePrivate *priv;
CompEditorPageDates dates;
priv = tpage->priv;
if (priv->updating)
return;
dates.start = 0;
dates.end = 0;
dates.due = 0;
dates.complete = complete;
/* Notify upstream */
comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tpage),
&dates);
}
static void
status_changed (GtkMenu *menu, TaskPage *tpage)
{
TaskPagePrivate *priv;
icalproperty_status status;
priv = tpage->priv;
if (priv->updating)
return;
status = e_dialog_option_menu_get (priv->status, status_map);
if (status == ICAL_STATUS_NEEDSACTION) {
e_dialog_spin_set (priv->percent_complete, 0);
complete_date_changed (tpage, -1);
} else if (status == ICAL_STATUS_INPROCESS) {
e_dialog_spin_set (priv->percent_complete, 50);
complete_date_changed (tpage, -1);
} else if (status == ICAL_STATUS_COMPLETED) {
e_dialog_spin_set (priv->percent_complete, 100);
complete_date_changed (tpage, time (NULL));
}
comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tpage));
}
static void
percent_complete_changed (GtkAdjustment *adj, TaskPage *tpage)
{
TaskPagePrivate *priv;
gint percent;
icalproperty_status status;
time_t date_completed;
priv = tpage->priv;
if (priv->updating)
return;
percent = e_dialog_spin_get_int (priv->percent_complete);
if (percent == 100) {
date_completed = time (NULL);
status = ICAL_STATUS_COMPLETED;
} else {
date_completed = -1;
if (percent == 0)
status = ICAL_STATUS_NEEDSACTION;
else
status = ICAL_STATUS_INPROCESS;
}
complete_date_changed (tpage, date_completed);
e_dialog_option_menu_set (priv->status, status, status_map);
comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tpage));
}
/* Hooks the widget signals */
static void
init_widgets (TaskPage *tpage)
{
TaskPagePrivate *priv;
priv = tpage->priv;
/* Summary */
gtk_signal_connect (GTK_OBJECT (priv->summary), "changed",
GTK_SIGNAL_FUNC (summary_changed_cb), tpage);
/* Dates */
gtk_signal_connect (GTK_OBJECT (priv->start_date), "changed",
GTK_SIGNAL_FUNC (date_changed_cb), tpage);
gtk_signal_connect (GTK_OBJECT (priv->due_date), "changed",
GTK_SIGNAL_FUNC (date_changed_cb), tpage);
/* Connect signals. The Status, Percent Complete & Date Completed
properties are closely related so whenever one changes we may need
to update the other 2. */
gtk_signal_connect (GTK_OBJECT (GTK_OPTION_MENU (priv->status)->menu),
"deactivate",
GTK_SIGNAL_FUNC (status_changed), tpage);
gtk_signal_connect (GTK_OBJECT (GTK_SPIN_BUTTON (priv->percent_complete)->adjustment),
"value_changed",
GTK_SIGNAL_FUNC (percent_complete_changed), tpage);
/* Classification */
gtk_signal_connect (GTK_OBJECT (priv->description), "changed",
GTK_SIGNAL_FUNC (field_changed_cb), tpage);
gtk_signal_connect (GTK_OBJECT (priv->classification_public),
"toggled",
GTK_SIGNAL_FUNC (field_changed_cb), tpage);
gtk_signal_connect (GTK_OBJECT (priv->classification_private),
"toggled",
GTK_SIGNAL_FUNC (field_changed_cb), tpage);
gtk_signal_connect (GTK_OBJECT (priv->classification_confidential),
"toggled",
GTK_SIGNAL_FUNC (field_changed_cb), tpage);
/* Connect the default signal handler to use to make sure the "changed"
field gets set whenever a field is changed. */
gtk_signal_connect (GTK_OBJECT (GTK_OPTION_MENU (priv->priority)->menu),
"deactivate",
GTK_SIGNAL_FUNC (field_changed_cb), tpage);
gtk_signal_connect (GTK_OBJECT (priv->description), "changed",
GTK_SIGNAL_FUNC (field_changed_cb), tpage);
gtk_signal_connect (GTK_OBJECT (priv->contacts), "changed",
GTK_SIGNAL_FUNC (field_changed_cb), tpage);
gtk_signal_connect (GTK_OBJECT (priv->categories), "changed",
GTK_SIGNAL_FUNC (field_changed_cb), tpage);
/* Button clicks */
gtk_signal_connect (GTK_OBJECT (priv->categories_btn), "clicked",
GTK_SIGNAL_FUNC (categories_clicked_cb), tpage);
/* FIXME: we do not support these fields yet, so we disable them */
gtk_widget_set_sensitive (priv->contacts_btn, FALSE);
gtk_widget_set_sensitive (priv->contacts, FALSE);
}
/**
* task_page_construct:
* @tpage: An task page.
*
* Constructs an task page by loading its Glade data.
*
* Return value: The same object as @tpage, or NULL if the widgets could not be
* created.
**/
TaskPage *
task_page_construct (TaskPage *tpage)
{
TaskPagePrivate *priv;
priv = tpage->priv;
priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/task-page.glade",
NULL);
if (!priv->xml) {
g_message ("task_page_construct(): "
"Could not load the Glade XML file!");
return NULL;
}
if (!get_widgets (tpage)) {
g_message ("task_page_construct(): "
"Could not find all widgets in the XML file!");
return NULL;
}
init_widgets (tpage);
return tpage;
}
/**
* task_page_new:
*
* Creates a new task page.
*
* Return value: A newly-created task page, or NULL if the page could
* not be created.
**/
TaskPage *
task_page_new (void)
{
TaskPage *tpage;
tpage = gtk_type_new (TYPE_TASK_PAGE);
if (!task_page_construct (tpage)) {
gtk_object_unref (GTK_OBJECT (tpage));
return NULL;
}
return tpage;
}
GtkWidget *task_page_create_date_edit (void);
GtkWidget *
task_page_create_date_edit (void)
{
GtkWidget *dedit;
dedit = date_edit_new (TRUE, TRUE);
e_date_edit_set_allow_no_date_set (E_DATE_EDIT (dedit), TRUE);
return dedit;
}

View File

@ -15,6 +15,7 @@
<widget>
<class>GtkWindow</class>
<name>task-toplevel</name>
<visible>False</visible>
<title>window1</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_NONE</position>
@ -184,10 +185,10 @@
<widget>
<class>Custom</class>
<name>due-date</name>
<creation_function>task_editor_create_date_edit</creation_function>
<creation_function>task_page_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
<last_modification_time>Sun, 10 Sep 2000 17:32:18 GMT</last_modification_time>
<last_modification_time>Fri, 01 Jun 2001 18:59:52 GMT</last_modification_time>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
@ -207,10 +208,10 @@
<widget>
<class>Custom</class>
<name>start-date</name>
<creation_function>task_editor_create_date_edit</creation_function>
<creation_function>task_page_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
<last_modification_time>Sun, 10 Sep 2000 17:33:31 GMT</last_modification_time>
<last_modification_time>Fri, 01 Jun 2001 18:59:57 GMT</last_modification_time>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
@ -239,7 +240,7 @@
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
<child>
<padding>0</padding>
<expand>False</expand>
<expand>True</expand>
<fill>True</fill>
</child>
@ -459,7 +460,7 @@ Undefined
<spacing>2</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<expand>False</expand>
<fill>True</fill>
</child>
@ -467,7 +468,6 @@ Undefined
<class>GtkButton</class>
<name>contacts-button</name>
<can_focus>True</can_focus>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
@ -506,7 +506,6 @@ Undefined
<class>GtkButton</class>
<name>categories-button</name>
<can_focus>True</can_focus>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>

View File

@ -0,0 +1,61 @@
/* Evolution calendar - Main page of the task editor dialog
*
* Copyright (C) 2001 Ximian, Inc.
*
* Authors: Federico Mena-Quintero <federico@ximian.com>
* Miguel de Icaza <miguel@ximian.com>
* Seth Alves <alves@hungry.com>
* JP Rosevear <jpr@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef TASK_PAGE_H
#define TASK_PAGE_H
#include "comp-editor-page.h"
BEGIN_GNOME_DECLS
#define TYPE_TASK_PAGE (task_page_get_type ())
#define TASK_PAGE(obj) (GTK_CHECK_CAST ((obj), TYPE_TASK_PAGE, TaskPage))
#define TASK_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_TASK_PAGE, TaskPageClass))
#define IS_TASK_PAGE(obj) (GTK_CHECK_TYPE ((obj), TYPE_TASK_PAGE))
#define IS_TASK_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), TYPE_TASK_PAGE))
typedef struct _TaskPagePrivate TaskPagePrivate;
typedef struct {
CompEditorPage page;
/* Private data */
TaskPagePrivate *priv;
} TaskPage;
typedef struct {
CompEditorPageClass parent_class;
} TaskPageClass;
GtkType task_page_get_type (void);
TaskPage *task_page_construct (TaskPage *epage);
TaskPage *task_page_new (void);
END_GNOME_DECLS
#endif

View File

@ -31,6 +31,7 @@
#include <config.h>
#include <sys/stat.h>
#include <unistd.h>
#include <gnome.h>
#include <gal/e-table/e-cell-checkbox.h>
#include <gal/e-table/e-cell-toggle.h>
#include <gal/e-table/e-cell-text.h>
@ -674,9 +675,9 @@ open_task (ECalendarTable *cal_table, CalComponent *comp)
TaskEditor *tedit;
tedit = task_editor_new ();
task_editor_set_cal_client (tedit, calendar_model_get_cal_client (cal_table->model));
task_editor_set_todo_object (tedit, comp);
task_editor_focus (tedit);
comp_editor_set_cal_client (COMP_EDITOR (tedit), calendar_model_get_cal_client (cal_table->model));
comp_editor_edit_comp (COMP_EDITOR (tedit), comp);
comp_editor_focus (COMP_EDITOR (tedit));
}
/* Opens the task in the specified row */

View File

@ -24,6 +24,7 @@
*/
#include <config.h>
#include <gnome.h>
#include <gal/util/e-util.h>
#include <gal/e-table/e-table-scrolled.h>
#include <gal/menus/gal-view-collection.h>
@ -468,15 +469,15 @@ e_tasks_new_task (ETasks *tasks)
priv = tasks->priv;
tedit = task_editor_new ();
task_editor_set_cal_client (tedit, priv->client);
comp_editor_set_cal_client (COMP_EDITOR (tedit), priv->client);
comp = cal_component_new ();
cal_component_set_new_vtype (comp, CAL_COMPONENT_TODO);
task_editor_set_todo_object (tedit, comp);
comp_editor_edit_comp (COMP_EDITOR (tedit), comp);
gtk_object_unref (GTK_OBJECT (comp));
task_editor_focus (tedit);
comp_editor_focus (COMP_EDITOR (tedit));
}
/**

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -40,10 +40,10 @@
#include "widgets/misc/e-search-bar.h"
#include "widgets/misc/e-filter-bar.h"
#include "dialogs/alarm-notify-dialog.h"
#include "dialogs/event-editor.h"
#include "e-calendar-table.h"
#include "e-day-view.h"
#include "e-week-view.h"
#include "event-editor.h"
#include "gnome-cal.h"
#include "component-factory.h"
#include "calendar-commands.h"
@ -1308,11 +1308,11 @@ gnome_calendar_edit_object (GnomeCalendar *gcal, CalComponent *comp)
GTK_SIGNAL_FUNC (editor_closed_cb),
ec);
event_editor_set_cal_client (EVENT_EDITOR (ee), priv->client);
event_editor_set_event_object (EVENT_EDITOR (ee), comp);
comp_editor_set_cal_client (COMP_EDITOR (ee), priv->client);
comp_editor_edit_comp (COMP_EDITOR (ee), comp);
}
event_editor_focus (ee);
comp_editor_focus (COMP_EDITOR (ee));
}
/**