aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2014-03-19 23:25:41 +0800
committerMatthew Barnes <mbarnes@redhat.com>2014-03-27 08:24:34 +0800
commit70185ec1d2aafb951a81e4a64c1ccb3c24b0f5be (patch)
treeee0f072c76d451f308653c691ae3d44288dd8589 /mail
parenta0015666b9e36abfb3270159d28f5ef584b77b33 (diff)
downloadgsoc2013-evolution-70185ec1d2aafb951a81e4a64c1ccb3c24b0f5be.tar
gsoc2013-evolution-70185ec1d2aafb951a81e4a64c1ccb3c24b0f5be.tar.gz
gsoc2013-evolution-70185ec1d2aafb951a81e4a64c1ccb3c24b0f5be.tar.bz2
gsoc2013-evolution-70185ec1d2aafb951a81e4a64c1ccb3c24b0f5be.tar.lz
gsoc2013-evolution-70185ec1d2aafb951a81e4a64c1ccb3c24b0f5be.tar.xz
gsoc2013-evolution-70185ec1d2aafb951a81e4a64c1ccb3c24b0f5be.tar.zst
gsoc2013-evolution-70185ec1d2aafb951a81e4a64c1ccb3c24b0f5be.zip
EMFolderSelector: Override constructed() method.
Now that all the instantiation arguments have either been eliminated or made into GObject properties, we can initialize the dialog properly via the constructed() method instead of some custom internal function. This makes EMFolderSelector a LOT more "subclassable".
Diffstat (limited to 'mail')
-rw-r--r--mail/em-folder-selector.c317
1 files changed, 159 insertions, 158 deletions
diff --git a/mail/em-folder-selector.c b/mail/em-folder-selector.c
index 76b5cc5940..68d9894528 100644
--- a/mail/em-folder-selector.c
+++ b/mail/em-folder-selector.c
@@ -49,6 +49,7 @@ struct _EMFolderSelectorPrivate {
EMFolderTreeModel *model;
GtkWidget *alert_bar;
GtkWidget *caption_label;
+ GtkWidget *content_area;
GtkEntry *name_entry;
gchar *selected_uri;
@@ -79,6 +80,53 @@ G_DEFINE_TYPE_WITH_CODE (
em_folder_selector_alert_sink_init))
static void
+folder_selector_create_name_changed (GtkEntry *entry,
+ EMFolderSelector *selector)
+{
+ EMFolderTree *folder_tree;
+ gchar *path;
+ const gchar *text = NULL;
+ gboolean active;
+
+ if (gtk_entry_get_text_length (selector->priv->name_entry) > 0)
+ text = gtk_entry_get_text (selector->priv->name_entry);
+
+ folder_tree = em_folder_selector_get_folder_tree (selector);
+
+ path = em_folder_tree_get_selected_uri (folder_tree);
+ active = text && path && !strchr (text, '/');
+ g_free (path);
+
+ gtk_dialog_set_response_sensitive (
+ GTK_DIALOG (selector), GTK_RESPONSE_OK, active);
+}
+
+static void
+folder_selector_selected_cb (EMFolderTree *emft,
+ CamelStore *store,
+ const gchar *folder_name,
+ CamelFolderInfoFlags flags,
+ EMFolderSelector *selector)
+{
+ if (selector->priv->name_entry != NULL) {
+ folder_selector_create_name_changed (
+ selector->priv->name_entry, selector);
+ } else {
+ gtk_dialog_set_response_sensitive (
+ GTK_DIALOG (selector), GTK_RESPONSE_OK, TRUE);
+ }
+}
+
+static void
+folder_selector_activated_cb (EMFolderTree *emft,
+ CamelStore *store,
+ const gchar *folder_name,
+ EMFolderSelector *selector)
+{
+ gtk_dialog_response (GTK_DIALOG (selector), GTK_RESPONSE_OK);
+}
+
+static void
folder_selector_set_model (EMFolderSelector *selector,
EMFolderTreeModel *model)
{
@@ -172,6 +220,7 @@ folder_selector_dispose (GObject *object)
g_clear_object (&priv->model);
g_clear_object (&priv->alert_bar);
g_clear_object (&priv->caption_label);
+ g_clear_object (&priv->content_area);
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (em_folder_selector_parent_class)->dispose (object);
@@ -193,6 +242,112 @@ folder_selector_finalize (GObject *object)
}
static void
+folder_selector_constructed (GObject *object)
+{
+ EMFolderSelector *selector;
+ EMailSession *session;
+ EMFolderTreeModel *model;
+ GtkWidget *content_area;
+ GtkWidget *container;
+ GtkWidget *widget;
+
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (em_folder_selector_parent_class)->constructed (object);
+
+ selector = EM_FOLDER_SELECTOR (object);
+ model = em_folder_selector_get_model (selector);
+ session = em_folder_tree_model_get_session (model);
+
+ gtk_window_set_default_size (GTK_WINDOW (selector), 400, 500);
+ gtk_container_set_border_width (GTK_CONTAINER (selector), 5);
+
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (selector));
+
+ widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 5);
+ gtk_box_pack_start (GTK_BOX (content_area), widget, TRUE, TRUE, 0);
+ selector->priv->content_area = g_object_ref (widget);
+ gtk_widget_show (widget);
+
+ container = widget;
+
+ gtk_dialog_add_buttons (
+ GTK_DIALOG (selector),
+ _("_New"), EM_FOLDER_SELECTOR_RESPONSE_NEW,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ selector->priv->default_button_label, GTK_RESPONSE_OK, NULL);
+
+ gtk_dialog_set_response_sensitive (
+ GTK_DIALOG (selector), GTK_RESPONSE_OK, FALSE);
+ gtk_dialog_set_default_response (
+ GTK_DIALOG (selector), GTK_RESPONSE_OK);
+
+ widget = gtk_dialog_get_widget_for_response (
+ GTK_DIALOG (selector), EM_FOLDER_SELECTOR_RESPONSE_NEW);
+
+ g_object_bind_property (
+ selector, "can-create",
+ widget, "visible",
+ G_BINDING_SYNC_CREATE);
+
+ widget = gtk_dialog_get_widget_for_response (
+ GTK_DIALOG (selector), GTK_RESPONSE_OK);
+
+ /* No need to synchronize properties. */
+ g_object_bind_property (
+ selector, "default-button-label",
+ widget, "label",
+ G_BINDING_DEFAULT);
+
+ widget = e_alert_bar_new ();
+ gtk_box_pack_end (GTK_BOX (container), widget, FALSE, FALSE, 0);
+ selector->priv->alert_bar = g_object_ref (widget);
+ /* EAlertBar controls its own visibility. */
+
+ widget = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (
+ GTK_SCROLLED_WINDOW (widget),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (
+ GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN);
+ gtk_box_pack_end (GTK_BOX (container), widget, TRUE, TRUE, 0);
+ gtk_widget_show (widget);
+
+ container = widget;
+
+ widget = em_folder_tree_new_with_model (
+ session, E_ALERT_SINK (selector), model);
+ emu_restore_folder_tree_state (EM_FOLDER_TREE (widget));
+ gtk_container_add (GTK_CONTAINER (container), widget);
+ selector->priv->folder_tree = EM_FOLDER_TREE (widget);
+ gtk_widget_show (widget);
+
+ g_signal_connect (
+ widget, "folder-selected",
+ G_CALLBACK (folder_selector_selected_cb), selector);
+ g_signal_connect (
+ widget, "folder-activated",
+ G_CALLBACK (folder_selector_activated_cb), selector);
+
+ container = selector->priv->content_area;
+
+ /* This can be made visible by setting the "caption" property. */
+ widget = gtk_label_new (NULL);
+ gtk_widget_set_margin_top (widget, 6);
+ gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_LEFT);
+ gtk_box_pack_end (GTK_BOX (container), widget, FALSE, TRUE, 0);
+ selector->priv->caption_label = g_object_ref (widget);
+ gtk_widget_hide (widget);
+
+ g_object_bind_property (
+ selector, "caption",
+ widget, "label",
+ G_BINDING_DEFAULT);
+
+ gtk_widget_grab_focus (GTK_WIDGET (selector->priv->folder_tree));
+}
+
+static void
folder_selector_response (GtkDialog *dialog,
gint response_id)
{
@@ -264,6 +419,7 @@ em_folder_selector_class_init (EMFolderSelectorClass *class)
object_class->get_property = folder_selector_get_property;
object_class->dispose = folder_selector_dispose;
object_class->finalize = folder_selector_finalize;
+ object_class->constructed = folder_selector_constructed;
dialog_class = GTK_DIALOG_CLASS (class);
dialog_class->response = folder_selector_response;
@@ -331,171 +487,16 @@ em_folder_selector_init (EMFolderSelector *selector)
g_strdup (gettext (DEFAULT_BUTTON_LABEL));
}
-static void
-folder_selector_create_name_changed (GtkEntry *entry,
- EMFolderSelector *selector)
-{
- EMFolderTree *folder_tree;
- gchar *path;
- const gchar *text = NULL;
- gboolean active;
-
- if (gtk_entry_get_text_length (selector->priv->name_entry) > 0)
- text = gtk_entry_get_text (selector->priv->name_entry);
-
- folder_tree = em_folder_selector_get_folder_tree (selector);
-
- path = em_folder_tree_get_selected_uri (folder_tree);
- active = text && path && !strchr (text, '/');
- g_free (path);
-
- gtk_dialog_set_response_sensitive (
- GTK_DIALOG (selector), GTK_RESPONSE_OK, active);
-}
-
-static void
-folder_selected_cb (EMFolderTree *emft,
- CamelStore *store,
- const gchar *folder_name,
- CamelFolderInfoFlags flags,
- EMFolderSelector *selector)
-{
- if (selector->priv->name_entry != NULL) {
- folder_selector_create_name_changed (
- selector->priv->name_entry, selector);
- } else {
- gtk_dialog_set_response_sensitive (
- GTK_DIALOG (selector), GTK_RESPONSE_OK, TRUE);
- }
-}
-
-static void
-folder_activated_cb (EMFolderTree *emft,
- CamelStore *store,
- const gchar *folder_name,
- EMFolderSelector *selector)
-{
- gtk_dialog_response (GTK_DIALOG (selector), GTK_RESPONSE_OK);
-}
-
-static GtkWidget *
-folder_selector_construct (EMFolderSelector *selector)
-{
- EMailSession *session;
- EMFolderTreeModel *model;
- GtkWidget *content_area;
- GtkWidget *container;
- GtkWidget *widget;
- GtkWidget *vbox;
-
- model = em_folder_selector_get_model (selector);
- session = em_folder_tree_model_get_session (model);
-
- gtk_window_set_default_size (GTK_WINDOW (selector), 400, 500);
- gtk_container_set_border_width (GTK_CONTAINER (selector), 5);
-
- content_area = gtk_dialog_get_content_area (GTK_DIALOG (selector));
-
- vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
- gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
- gtk_widget_show (vbox);
-
- container = vbox;
-
- gtk_dialog_add_buttons (
- GTK_DIALOG (selector),
- _("_New"), EM_FOLDER_SELECTOR_RESPONSE_NEW,
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- selector->priv->default_button_label, GTK_RESPONSE_OK, NULL);
-
- gtk_dialog_set_response_sensitive (
- GTK_DIALOG (selector), GTK_RESPONSE_OK, FALSE);
- gtk_dialog_set_default_response (
- GTK_DIALOG (selector), GTK_RESPONSE_OK);
-
- widget = gtk_dialog_get_widget_for_response (
- GTK_DIALOG (selector), EM_FOLDER_SELECTOR_RESPONSE_NEW);
-
- g_object_bind_property (
- selector, "can-create",
- widget, "visible",
- G_BINDING_SYNC_CREATE);
-
- widget = gtk_dialog_get_widget_for_response (
- GTK_DIALOG (selector), GTK_RESPONSE_OK);
-
- /* No need to synchronize properties. */
- g_object_bind_property (
- selector, "default-button-label",
- widget, "label",
- G_BINDING_DEFAULT);
-
- widget = e_alert_bar_new ();
- gtk_box_pack_end (GTK_BOX (container), widget, FALSE, FALSE, 0);
- selector->priv->alert_bar = g_object_ref (widget);
- /* EAlertBar controls its own visibility. */
-
- widget = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (
- GTK_SCROLLED_WINDOW (widget),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (
- GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN);
- gtk_box_pack_end (GTK_BOX (container), widget, TRUE, TRUE, 0);
- gtk_widget_show (widget);
-
- container = widget;
-
- widget = em_folder_tree_new_with_model (
- session, E_ALERT_SINK (selector), model);
- emu_restore_folder_tree_state (EM_FOLDER_TREE (widget));
- gtk_container_add (GTK_CONTAINER (container), widget);
- selector->priv->folder_tree = EM_FOLDER_TREE (widget);
- gtk_widget_show (widget);
-
- g_signal_connect (
- widget, "folder-selected",
- G_CALLBACK (folder_selected_cb), selector);
- g_signal_connect (
- widget, "folder-activated",
- G_CALLBACK (folder_activated_cb), selector);
-
- container = vbox;
-
- /* This can be made visible by setting the "caption" property. */
- widget = gtk_label_new (NULL);
- gtk_widget_set_margin_top (widget, 6);
- gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_LEFT);
- gtk_box_pack_end (GTK_BOX (container), widget, FALSE, TRUE, 0);
- selector->priv->caption_label = g_object_ref (widget);
- gtk_widget_hide (widget);
-
- g_object_bind_property (
- selector, "caption",
- widget, "label",
- G_BINDING_DEFAULT);
-
- gtk_widget_grab_focus (GTK_WIDGET (selector->priv->folder_tree));
-
- return vbox;
-}
-
GtkWidget *
em_folder_selector_new (GtkWindow *parent,
EMFolderTreeModel *model)
{
- EMFolderSelector *selector;
-
g_return_val_if_fail (EM_IS_FOLDER_TREE_MODEL (model), NULL);
- selector = g_object_new (
+ return g_object_new (
EM_TYPE_FOLDER_SELECTOR,
"transient-for", parent,
"model", model, NULL);
- folder_selector_construct (selector);
-
- return GTK_WIDGET (selector);
}
static void
@@ -545,11 +546,11 @@ em_folder_selector_create_new (GtkWindow *parent,
"model", model,
"default-button-label", _("C_reate"), NULL);
- container = folder_selector_construct (selector);
-
folder_tree = em_folder_selector_get_folder_tree (selector);
em_folder_tree_set_excluded (folder_tree, EMFT_EXCLUDE_NOINFERIORS);
+ container = selector->priv->content_area;
+
widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
gtk_box_pack_start (GTK_BOX (container), widget, FALSE, TRUE, 0);
gtk_widget_show (widget);