aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/dialogs/comp-editor-page.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@src.gnome.org>2008-07-16 02:34:59 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2008-07-16 02:34:59 +0800
commitac0c655f3f2a8e47b0cca877aabae66421c58187 (patch)
treedd86bd195dff93b54184840e7beca7ffa5a11e99 /calendar/gui/dialogs/comp-editor-page.c
parentc049cedd6969d77649db15b71f4ba112d4a2c065 (diff)
downloadgsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar
gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.gz
gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.bz2
gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.lz
gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.xz
gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.zst
gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.zip
Migrate CompEditor, CompEditorPage, and the various subclasses from
BonoboUI to GtkUIManager. See bug #542125. svn path=/branches/kill-bonobo/; revision=35746
Diffstat (limited to 'calendar/gui/dialogs/comp-editor-page.c')
-rw-r--r--calendar/gui/dialogs/comp-editor-page.c487
1 files changed, 207 insertions, 280 deletions
diff --git a/calendar/gui/dialogs/comp-editor-page.c b/calendar/gui/dialogs/comp-editor-page.c
index d05e0eed74..4a48611d01 100644
--- a/calendar/gui/dialogs/comp-editor-page.c
+++ b/calendar/gui/dialogs/comp-editor-page.c
@@ -23,84 +23,111 @@
#endif
#include <glib/gi18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
+#include "comp-editor.h"
#include "comp-editor-page.h"
-
+#define COMP_EDITOR_PAGE_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), TYPE_COMP_EDITOR_PAGE, CompEditorPagePrivate))
-static void comp_editor_page_class_init (CompEditorPageClass *class);
-static void comp_editor_page_init (CompEditorPage *page);
-static void comp_editor_page_dispose (GObject *object);
-
-static gpointer parent_class;
+struct _CompEditorPagePrivate {
+ CompEditor *editor; /* not referenced */
+ gboolean updating;
+};
-/* Signal IDs */
+enum {
+ PROP_0,
+ PROP_EDITOR,
+ PROP_UPDATING
+};
enum {
- CHANGED,
- NEEDS_SEND,
- SUMMARY_CHANGED,
DATES_CHANGED,
- CLIENT_CHANGED,
- FOCUS_IN,
- FOCUS_OUT,
LAST_SIGNAL
};
+static gpointer parent_class;
static guint comp_editor_page_signals[LAST_SIGNAL];
-#define CLASS(page) (COMP_EDITOR_PAGE_CLASS (G_OBJECT_GET_CLASS (page)))
+static void
+comp_editor_page_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ CompEditorPagePrivate *priv;
+
+ priv = COMP_EDITOR_PAGE_GET_PRIVATE (object);
-
+ switch (property_id) {
+ case PROP_EDITOR:
+ priv->editor = g_value_get_object (value);
+ return;
-/**
- * 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.
- **/
-GType
-comp_editor_page_get_type (void)
+ case PROP_UPDATING:
+ comp_editor_page_set_updating (
+ COMP_EDITOR_PAGE (object),
+ g_value_get_boolean (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+comp_editor_page_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
{
- static GType type = 0;
+ switch (property_id) {
+ case PROP_EDITOR:
+ g_value_set_object (
+ value, comp_editor_page_get_editor (
+ COMP_EDITOR_PAGE (object)));
+ return;
+
+ case PROP_UPDATING:
+ g_value_set_boolean (
+ value, comp_editor_page_get_updating (
+ COMP_EDITOR_PAGE (object)));
+ }
- if (G_UNLIKELY (type == 0)) {
- static const GTypeInfo type_info = {
- sizeof (CompEditorPageClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) comp_editor_page_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (CompEditorPage),
- 0, /* n_preallocs */
- (GInstanceInitFunc) comp_editor_page_init,
- NULL /* value_table */
- };
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
- type = g_type_register_static (
- G_TYPE_OBJECT, "CompEditorPage", &type_info, 0);
+static void
+comp_editor_page_dispose (GObject *object)
+{
+ CompEditorPage *page;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (IS_COMP_EDITOR_PAGE (object));
+
+ page = COMP_EDITOR_PAGE (object);
+
+ if (page->accel_group) {
+ g_object_unref (page->accel_group);
+ page->accel_group = NULL;
}
- return type;
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (parent_class)->dispose (object);
}
-/* Class initialization function for the abstract editor page */
static void
comp_editor_page_class_init (CompEditorPageClass *class)
{
GObjectClass *object_class;
parent_class = g_type_class_peek_parent (class);
+ g_type_class_add_private (class, sizeof (CompEditorPagePrivate));
object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = comp_editor_page_set_property;
+ object_class->get_property = comp_editor_page_get_property;
object_class->dispose = comp_editor_page_dispose;
- class->changed = NULL;
- class->summary_changed = NULL;
class->dates_changed = NULL;
class->get_widget = NULL;
@@ -108,35 +135,28 @@ comp_editor_page_class_init (CompEditorPageClass *class)
class->fill_widgets = NULL;
class->fill_component = NULL;
class->fill_timezones = NULL;
- class->set_summary = NULL;
class->set_dates = NULL;
- comp_editor_page_signals[CHANGED] =
- g_signal_new ("changed",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- comp_editor_page_signals[NEEDS_SEND] =
- g_signal_new ("needs_send",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, needs_send),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- comp_editor_page_signals[SUMMARY_CHANGED] =
- g_signal_new ("summary_changed",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, summary_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
+ g_object_class_install_property (
+ object_class,
+ PROP_EDITOR,
+ g_param_spec_object (
+ "editor",
+ NULL,
+ NULL,
+ TYPE_COMP_EDITOR,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_UPDATING,
+ g_param_spec_boolean (
+ "updating",
+ NULL,
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE));
comp_editor_page_signals[DATES_CHANGED] =
g_signal_new ("dates_changed",
@@ -146,66 +166,57 @@ comp_editor_page_class_init (CompEditorPageClass *class)
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- comp_editor_page_signals[CLIENT_CHANGED] =
- g_signal_new ("client_changed",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, client_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
- comp_editor_page_signals[FOCUS_IN] =
- g_signal_new ("focus_in",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, focus_in),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
- comp_editor_page_signals[FOCUS_OUT] =
- g_signal_new ("focus_out",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, focus_out),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
}
-
-
static void
comp_editor_page_init (CompEditorPage *page)
{
- page->client = NULL;
+ page->priv = COMP_EDITOR_PAGE_GET_PRIVATE (page);
+
page->accel_group = NULL;
}
-
-static void
-comp_editor_page_dispose (GObject *object)
+GType
+comp_editor_page_get_type (void)
{
- CompEditorPage *page;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (object));
-
- page = COMP_EDITOR_PAGE (object);
+ static GType type = 0;
- if (page->client) {
- g_object_unref (page->client);
- page->client = NULL;
- }
+ if (G_UNLIKELY (type == 0)) {
+ static const GTypeInfo type_info = {
+ sizeof (CompEditorPageClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) comp_editor_page_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (CompEditorPage),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) comp_editor_page_init,
+ NULL /* value_table */
+ };
- if (page->accel_group) {
- g_object_unref (page->accel_group);
- page->accel_group = NULL;
+ type = g_type_register_static (
+ G_TYPE_OBJECT, "CompEditorPage", &type_info, 0);
}
- G_OBJECT_CLASS (parent_class)->dispose (object);
+ return type;
}
+/**
+ * comp_editor_page_get_editor:
+ * @page: a #CompEditorPage
+ *
+ * Returns the #CompEditor to which @page belongs.
+ *
+ * Returns: the parent #CompEditor
+ **/
+CompEditor *
+comp_editor_page_get_editor (CompEditorPage *page)
+{
+ g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), NULL);
+
+ return page->priv->editor;
+}
/**
* comp_editor_page_get_widget:
@@ -219,11 +230,50 @@ comp_editor_page_dispose (GObject *object)
GtkWidget *
comp_editor_page_get_widget (CompEditorPage *page)
{
- g_return_val_if_fail (page != NULL, NULL);
+ CompEditorPageClass *class;
+
g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), NULL);
- g_return_val_if_fail (CLASS (page)->get_widget != NULL, NULL);
- return (* CLASS (page)->get_widget) (page);
+ class = COMP_EDITOR_PAGE_GET_CLASS (page);
+ g_return_val_if_fail (class->get_widget != NULL, NULL);
+
+ return class->get_widget (page);
+}
+
+gboolean
+comp_editor_page_get_updating (CompEditorPage *page)
+{
+ g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
+
+ return page->priv->updating;
+}
+
+void
+comp_editor_page_set_updating (CompEditorPage *page,
+ gboolean updating)
+{
+ g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
+
+ page->priv->updating = updating;
+
+ g_object_notify (G_OBJECT (page), "updating");
+}
+
+void
+comp_editor_page_changed (CompEditorPage *page)
+{
+ CompEditor *editor;
+
+ g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
+
+ /* Block change notifications if the page is updating. This right
+ * here is why we have an 'updating' flag. It's up to subclasses
+ * to set and clear it at appropriate times. */
+ if (page->priv->updating)
+ return;
+
+ editor = comp_editor_page_get_editor (page);
+ comp_editor_set_changed (editor, TRUE);
}
/**
@@ -237,11 +287,14 @@ comp_editor_page_get_widget (CompEditorPage *page)
void
comp_editor_page_focus_main_widget (CompEditorPage *page)
{
- g_return_if_fail (page != NULL);
+ CompEditorPageClass *class;
+
g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
- g_return_if_fail (CLASS (page)->focus_main_widget != NULL);
- (* CLASS (page)->focus_main_widget) (page);
+ class = COMP_EDITOR_PAGE_GET_CLASS (page);
+ g_return_if_fail (class->focus_main_widget != NULL);
+
+ class->focus_main_widget (page);
}
/**
@@ -252,13 +305,23 @@ comp_editor_page_focus_main_widget (CompEditorPage *page)
* Fills the widgets of an editor page with the data from a calendar component.
**/
gboolean
-comp_editor_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
+comp_editor_page_fill_widgets (CompEditorPage *page,
+ ECalComponent *comp)
{
+ CompEditorPageClass *class;
+ gboolean success;
+
g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE);
- g_return_val_if_fail (CLASS (page)->fill_widgets != NULL, FALSE);
- return (* CLASS (page)->fill_widgets) (page, comp);
+ class = COMP_EDITOR_PAGE_GET_CLASS (page);
+ g_return_val_if_fail (class->fill_widgets != NULL, FALSE);
+
+ comp_editor_page_set_updating (page, TRUE);
+ success = class->fill_widgets (page, comp);
+ comp_editor_page_set_updating (page, FALSE);
+
+ return success;
}
/**
@@ -275,12 +338,15 @@ comp_editor_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
gboolean
comp_editor_page_fill_component (CompEditorPage *page, ECalComponent *comp)
{
- g_return_val_if_fail (page != NULL, FALSE);
+ CompEditorPageClass *class;
+
g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
g_return_val_if_fail (comp != NULL, FALSE);
- if (CLASS (page)->fill_component != NULL)
- return (* CLASS (page)->fill_component) (page, comp);
+ class = COMP_EDITOR_PAGE_GET_CLASS (page);
+
+ if (class->fill_component != NULL)
+ return class->fill_component (page, comp);
return TRUE;
}
@@ -298,90 +364,20 @@ comp_editor_page_fill_component (CompEditorPage *page, ECalComponent *comp)
gboolean
comp_editor_page_fill_timezones (CompEditorPage *page, GHashTable *timezones)
{
+ CompEditorPageClass *class;
+
g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
g_return_val_if_fail (timezones != NULL, FALSE);
- if (CLASS (page)->fill_timezones != NULL)
- return (* CLASS (page)->fill_timezones) (page, timezones);
-
- return TRUE;
-}
-
-/**
- * comp_editor_page_set_e_cal:
- * @page: An editor page
- * @client: A #ECal object
- *
- * Sets the #ECal for the dialog page to use.
- **/
-void
-comp_editor_page_set_e_cal (CompEditorPage *page, ECal *client)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- if (client == page->client)
- return;
-
- if (page->client)
- g_object_unref (page->client);
-
- page->client = client;
- if (page->client)
- g_object_ref (client);
-}
-
-/**
- * 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_unset_focused_widget
- * @page: An editor page
- * @widget: The widget that has the current focus
-**/
-void
-comp_editor_page_unset_focused_widget (CompEditorPage *page, GtkWidget *widget)
-{
- g_return_if_fail (page!= NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
+ class = COMP_EDITOR_PAGE_GET_CLASS (page);
- g_signal_emit (page,
- comp_editor_page_signals[FOCUS_OUT], 0,
- widget);
+ if (class->fill_timezones != NULL)
+ return class->fill_timezones (page, timezones);
+ return TRUE;
}
/**
- * comp_editor_page_set_focussed_widget:
- * @page: An editor page
- * @widget: The widget that has the current focus
-**/
-void
-comp_editor_page_set_focused_widget (CompEditorPage *page, GtkWidget *widget)
-{
- g_return_if_fail (page!= NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- g_signal_emit (page,
- comp_editor_page_signals[FOCUS_IN], 0,
- widget);
-
-}
-/**
* comp_editor_page_set_dates:
* @page: An editor page
* @dates: A collection of various dates in time_t format
@@ -391,62 +387,14 @@ comp_editor_page_set_focused_widget (CompEditorPage *page, GtkWidget *widget)
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));
-
- g_signal_emit (page, comp_editor_page_signals[CHANGED], 0);
-}
-
-/**
- * comp_editor_page_notify_needs_send:
- * @page:
- *
- *
- **/
-void
-comp_editor_page_notify_needs_send (CompEditorPage *page)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
+ CompEditorPageClass *class;
- g_signal_emit (page, comp_editor_page_signals[NEEDS_SEND], 0);
-}
-
-/**
- * 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));
+ class = COMP_EDITOR_PAGE_GET_CLASS (page);
- g_signal_emit (page,
- comp_editor_page_signals[SUMMARY_CHANGED], 0,
- summary);
+ if (class->set_dates != NULL)
+ class->set_dates (page, dates);
}
/**
@@ -460,7 +408,6 @@ 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));
g_signal_emit (page,
@@ -469,26 +416,6 @@ comp_editor_page_notify_dates_changed (CompEditorPage *page,
}
/**
- * comp_editor_page_notify_client_changed:
- * @page: An editor page.
- *
- * Makes an editor page emit the "client_changed" signal. This is meant to be
- * used only by page implementations.
- **/
-void
-comp_editor_page_notify_client_changed (CompEditorPage *page,
- ECal *client)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- comp_editor_page_set_e_cal (page, client);
- g_signal_emit (page,
- comp_editor_page_signals[CLIENT_CHANGED], 0,
- client);
-}
-
-/**
* comp_editor_page_display_validation_error:
* @page: An editor page.
* @msg: Error message to display.