evolution r35777 - in trunk: shell widgets/misc



Author: mbarnes
Date: Sun Jul 20 16:37:22 2008
New Revision: 35777
URL: http://svn.gnome.org/viewvc/evolution?rev=35777&view=rev

Log:
2008-07-20  Matthew Barnes  <mbarnes redhat com>

	** Fixes bug #542587

	* shell/e-shell-window.c: Use new EOnlineButton widget.

	* widgets/misc/e-online-button.c:
	* widgets/misc/e-online-button.h:
	New widget implements the online/offline button used in the main
	window.  The button just maintains an "online" flag and displays
	the appropriate button image for the flag.



Added:
   trunk/widgets/misc/e-online-button.c
   trunk/widgets/misc/e-online-button.h
Modified:
   trunk/shell/ChangeLog
   trunk/shell/e-shell-window.c
   trunk/widgets/misc/ChangeLog
   trunk/widgets/misc/Makefile.am

Modified: trunk/shell/e-shell-window.c
==============================================================================
--- trunk/shell/e-shell-window.c	(original)
+++ trunk/shell/e-shell-window.c	Sun Jul 20 16:37:22 2008
@@ -30,6 +30,7 @@
 #include "Evolution.h"
 
 #include "e-util/e-util-private.h"
+#include "widgets/misc/e-online-button.h"
 
 #include "e-component-registry.h"
 #include "e-shell-window-commands.h"
@@ -115,7 +116,6 @@
 	/* The status bar widgetry.  */
 	GtkWidget *status_bar;
 	GtkWidget *offline_toggle;
-	GtkWidget *offline_toggle_image;
 	GtkWidget *menu_hint_label;
 
 	/* The timeout for saving the window size */
@@ -133,10 +133,6 @@
 
 G_DEFINE_TYPE (EShellWindow, e_shell_window, BONOBO_TYPE_WINDOW)
 
-/* The icons for the offline/online status.  */
-#define OFFLINE_ICON "offline.png"
-#define ONLINE_ICON  "online.png"
-
 static gboolean store_window_size (GtkWidget* widget);
 
 /* ComponentView handling.  */
@@ -365,9 +361,9 @@
 update_offline_toggle_status (EShellWindow *window)
 {
 	EShellWindowPrivate *priv;
-	const char *icon;
-	char *icon_file;
-	const char *tooltip;
+	GtkWidget *widget;
+	const gchar *tooltip;
+	gboolean online;
 	gboolean sensitive;
 	guint32 flags = 0;
 	ESMenuTargetShell *t;
@@ -376,23 +372,23 @@
 
 	switch (e_shell_get_line_status (priv->shell.eshell)) {
 	case E_SHELL_LINE_STATUS_ONLINE:
-		icon        = ONLINE_ICON;
+		online      = TRUE;
 		sensitive   = TRUE;
-		tooltip     = _("Evolution is currently online. "
+		tooltip     = _("Evolution is currently online.\n"
 				"Click on this button to work offline.");
 		flags = ES_MENU_SHELL_ONLINE;
 		break;
 	case E_SHELL_LINE_STATUS_GOING_OFFLINE:
-		icon        = ONLINE_ICON;
+		online      = TRUE;
 		sensitive   = FALSE;
 		tooltip     = _("Evolution is in the process of going offline.");
 		flags = ES_MENU_SHELL_OFFLINE;
 		break;
 	case E_SHELL_LINE_STATUS_OFFLINE:
 	case E_SHELL_LINE_STATUS_FORCED_OFFLINE:
-		icon        = OFFLINE_ICON;
+		online      = FALSE;
 		sensitive   = TRUE;
-		tooltip     = _("Evolution is currently offline. "
+		tooltip     = _("Evolution is currently offline.\n"
 				"Click on this button to work online.");
 		flags = ES_MENU_SHELL_OFFLINE;
 		break;
@@ -400,11 +396,10 @@
 		g_return_if_reached ();
 	}
 
-	icon_file = g_build_filename (EVOLUTION_IMAGESDIR, icon, NULL);
-	gtk_image_set_from_file (GTK_IMAGE (priv->offline_toggle_image), icon_file);
-	g_free (icon_file);
-	gtk_widget_set_sensitive (priv->offline_toggle, sensitive);
-	gtk_widget_set_tooltip_text (priv->offline_toggle, tooltip);
+        widget = window->priv->offline_toggle;
+        gtk_widget_set_sensitive (widget, sensitive);
+        gtk_widget_set_tooltip_text (widget, tooltip);
+        e_online_button_set_online (E_ONLINE_BUTTON (widget), online);
 
 	/* TODO: If we get more shell flags, this should be centralised */
 	t = es_menu_target_new_shell(priv->menu, flags);
@@ -476,8 +471,7 @@
 }
 
 static void
-offline_toggle_clicked_callback (GtkButton *button,
-				 EShellWindow *window)
+offline_toggle_clicked_cb (EShellWindow *window)
 {
 	EShellWindowPrivate *priv = window->priv;
 
@@ -527,39 +521,21 @@
 static void
 setup_offline_toggle (EShellWindow *window)
 {
-	EShellWindowPrivate *priv;
-	GtkWidget *toggle;
-	GtkWidget *image;
-	GtkWidget *label;
-	GtkWidget *hbox;
-
-	priv = window->priv;
-
-	toggle = gtk_button_new ();
-	GTK_WIDGET_UNSET_FLAGS (toggle, GTK_CAN_FOCUS);
-	gtk_button_set_relief (GTK_BUTTON (toggle), GTK_RELIEF_NONE);
+	GtkWidget *widget;
 
-	g_signal_connect (toggle, "clicked",
-			  G_CALLBACK (offline_toggle_clicked_callback), window);
-	hbox = gtk_hbox_new (FALSE, 0);
-	gtk_container_add (GTK_CONTAINER (toggle), hbox);
+	g_return_if_fail (window->priv->status_bar != NULL);
 
-	image = gtk_image_new ();
-	gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
-
-	label = gtk_label_new ("");
-	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
-	gtk_widget_show_all (toggle);
-
-	priv->offline_toggle       = toggle;
-	priv->offline_toggle_image = image;
+	widget = e_online_button_new ();
+	g_signal_connect_swapped (
+		widget, "clicked",
+		G_CALLBACK (offline_toggle_clicked_cb), window);
+	gtk_box_pack_start (
+		GTK_BOX (window->priv->status_bar),
+		widget, FALSE, TRUE, 0);
+	window->priv->offline_toggle = widget;
+	gtk_widget_show (widget);
 
 	update_offline_toggle_status (window);
-
-	g_return_if_fail (priv->status_bar != NULL);
-
-	gtk_box_pack_start (GTK_BOX (priv->status_bar), priv->offline_toggle, FALSE, TRUE, 0);
 }
 
 static void

Modified: trunk/widgets/misc/Makefile.am
==============================================================================
--- trunk/widgets/misc/Makefile.am	(original)
+++ trunk/widgets/misc/Makefile.am	Sun Jul 20 16:37:22 2008
@@ -57,6 +57,7 @@
 	e-info-label.h				\
 	e-map.h					\
 	e-multi-config-dialog.h			\
+	e-online-button.h			\
 	e-search-bar.h				\
 	e-task-bar.h				\
 	e-task-widget.h				\
@@ -104,6 +105,7 @@
 	e-info-label.c				\
 	e-map.c					\
 	e-multi-config-dialog.c			\
+	e-online-button.c			\
 	e-search-bar.c				\
 	e-task-bar.c				\
 	e-task-widget.c				\

Added: trunk/widgets/misc/e-online-button.c
==============================================================================
--- (empty file)
+++ trunk/widgets/misc/e-online-button.c	Sun Jul 20 16:37:22 2008
@@ -0,0 +1,194 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-offline-button.c
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * 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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "e-online-button.h"
+
+#include <glib/gi18n.h>
+
+#define ONLINE_IMAGE	"online.png"
+#define OFFLINE_IMAGE	"offline.png"
+
+#define E_ONLINE_BUTTON_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_ONLINE_BUTTON, EOnlineButtonPrivate))
+
+struct _EOnlineButtonPrivate {
+	GtkWidget *image;
+	gboolean online;
+};
+
+enum {
+	PROP_0,
+	PROP_ONLINE
+};
+
+static gpointer parent_class;
+
+static void
+online_button_set_property (GObject *object,
+                             guint property_id,
+                             const GValue *value,
+                             GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_ONLINE:
+			e_online_button_set_online (
+				E_ONLINE_BUTTON (object),
+				g_value_get_boolean (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+online_button_get_property (GObject *object,
+                             guint property_id,
+                             GValue *value,
+                             GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_ONLINE:
+			g_value_set_boolean (
+				value, e_online_button_get_online (
+				E_ONLINE_BUTTON (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+online_button_dispose (GObject *object)
+{
+	EOnlineButtonPrivate *priv;
+
+	priv = E_ONLINE_BUTTON_GET_PRIVATE (object);
+
+	if (priv->image != NULL) {
+		g_object_unref (priv->image);
+		priv->image = NULL;
+	}
+
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+online_button_class_init (EOnlineButtonClass *class)
+{
+	GObjectClass *object_class;
+
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EOnlineButtonPrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = online_button_set_property;
+	object_class->get_property = online_button_get_property;
+	object_class->dispose = online_button_dispose;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_ONLINE,
+		g_param_spec_boolean (
+			"online",
+			_("Online"),
+			_("The button state is online"),
+			TRUE,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+}
+
+static void
+online_button_init (EOnlineButton *button)
+{
+	GtkWidget *widget;
+
+	button->priv = E_ONLINE_BUTTON_GET_PRIVATE (button);
+
+	GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
+	gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+
+	widget = gtk_image_new ();
+	gtk_container_add (GTK_CONTAINER (button), widget);
+	button->priv->image = g_object_ref (widget);
+	gtk_widget_show (widget);
+}
+
+GType
+e_online_button_get_type (void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		const GTypeInfo type_info = {
+			sizeof (EOnlineButtonClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) online_button_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EOnlineButton),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) online_button_init,
+			NULL   /* value_table */
+		};
+
+		type = g_type_register_static (
+			GTK_TYPE_BUTTON, "EOnlineButton", &type_info, 0);
+	}
+
+	return type;
+}
+
+GtkWidget *
+e_online_button_new (void)
+{
+	return g_object_new (E_TYPE_ONLINE_BUTTON, NULL);
+}
+
+gboolean
+e_online_button_get_online (EOnlineButton *button)
+{
+	g_return_val_if_fail (E_IS_ONLINE_BUTTON (button), FALSE);
+
+	return button->priv->online;
+}
+
+void
+e_online_button_set_online (EOnlineButton *button,
+                            gboolean online)
+{
+	GtkImage *image;
+	gchar *filename;
+	const gchar *image_name;
+
+	g_return_if_fail (E_IS_ONLINE_BUTTON (button));
+
+	button->priv->online = online;
+	image_name = online ? ONLINE_IMAGE : OFFLINE_IMAGE;
+
+	image = GTK_IMAGE (button->priv->image);
+	filename = g_build_filename (EVOLUTION_IMAGES, image_name, NULL);
+	gtk_image_set_from_file (image, filename);
+	g_free (filename);
+
+	g_object_notify (G_OBJECT (button), "online");
+}

Added: trunk/widgets/misc/e-online-button.h
==============================================================================
--- (empty file)
+++ trunk/widgets/misc/e-online-button.h	Sun Jul 20 16:37:22 2008
@@ -0,0 +1,68 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-online-button.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * 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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef E_ONLINE_BUTTON_H
+#define E_ONLINE_BUTTON_H
+
+#include <gtk/gtk.h>
+
+/* Standard GObject macros */
+#define E_TYPE_ONLINE_BUTTON \
+	(e_online_button_get_type ())
+#define E_ONLINE_BUTTON(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_ONLINE_BUTTON, EOnlineButton))
+#define E_ONLINE_BUTTON_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_ONLINE_BUTTON, EOnlineButtonClass))
+#define E_IS_ONLINE_BUTTON(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_ONLINE_BUTTON))
+#define E_IS_ONLINE_BUTTON_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_ONLINE_BUTTON))
+#define E_ONLINE_BUTTON_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_ONLINE_BUTTON, EOnlineButtonClass))
+
+G_BEGIN_DECLS
+
+typedef struct _EOnlineButton EOnlineButton;
+typedef struct _EOnlineButtonClass EOnlineButtonClass;
+typedef struct _EOnlineButtonPrivate EOnlineButtonPrivate;
+
+struct _EOnlineButton {
+	GtkButton parent;
+	EOnlineButtonPrivate *priv;
+};
+
+struct _EOnlineButtonClass {
+	GtkButtonClass parent_class;
+};
+
+GType		e_online_button_get_type	(void);
+GtkWidget *	e_online_button_new		(void);
+gboolean	e_online_button_get_online	(EOnlineButton *button);
+void		e_online_button_set_online	(EOnlineButton *button,
+						 gboolean online);
+
+G_END_DECLS
+
+#endif /* E_ONLINE_BUTTON_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]