summaryrefslogtreecommitdiffstats
path: root/gedit/gedit-statusbar.c
diff options
context:
space:
mode:
Diffstat (limited to 'gedit/gedit-statusbar.c')
-rw-r--r--gedit/gedit-statusbar.c241
1 files changed, 241 insertions, 0 deletions
diff --git a/gedit/gedit-statusbar.c b/gedit/gedit-statusbar.c
new file mode 100644
index 0000000..4dd6491
--- /dev/null
+++ b/gedit/gedit-statusbar.c
@@ -0,0 +1,241 @@
+/*
+ * gedit-statusbar.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2005 - Paolo Borelli
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include "gedit-statusbar.h"
+#include <glib/gi18n.h>
+#include "gedit-app.h"
+#include "gedit-status-menu-button.h"
+
+struct _GeditStatusbar
+{
+ GtkStatusbar parent_instance;
+
+ GtkWidget *error_frame;
+ GtkWidget *error_image;
+ GtkWidget *state_frame;
+ GtkWidget *load_image;
+ GtkWidget *save_image;
+ GtkWidget *print_image;
+
+ /* tmp flash timeout data */
+ guint flash_timeout;
+ guint flash_context_id;
+ guint flash_message_id;
+
+ guint generic_message_context_id;
+};
+
+G_DEFINE_TYPE (GeditStatusbar, gedit_statusbar, GTK_TYPE_STATUSBAR)
+
+static void
+gedit_statusbar_dispose (GObject *object)
+{
+ GeditStatusbar *statusbar = GEDIT_STATUSBAR (object);
+
+ if (statusbar->flash_timeout > 0)
+ {
+ g_source_remove (statusbar->flash_timeout);
+ statusbar->flash_timeout = 0;
+ }
+
+ G_OBJECT_CLASS (gedit_statusbar_parent_class)->dispose (object);
+}
+
+static void
+gedit_statusbar_class_init (GeditStatusbarClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->dispose = gedit_statusbar_dispose;
+
+ gtk_widget_class_set_template_from_resource (widget_class,
+ "/org/gnome/gedit/ui/gedit-statusbar.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, GeditStatusbar, error_frame);
+ gtk_widget_class_bind_template_child (widget_class, GeditStatusbar, error_image);
+ gtk_widget_class_bind_template_child (widget_class, GeditStatusbar, state_frame);
+ gtk_widget_class_bind_template_child (widget_class, GeditStatusbar, load_image);
+ gtk_widget_class_bind_template_child (widget_class, GeditStatusbar, save_image);
+ gtk_widget_class_bind_template_child (widget_class, GeditStatusbar, print_image);
+}
+
+static void
+gedit_statusbar_init (GeditStatusbar *statusbar)
+{
+ gtk_widget_init_template (GTK_WIDGET (statusbar));
+
+ statusbar->generic_message_context_id =
+ gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar), "generic_message");
+}
+
+/**
+ * gedit_statusbar_new:
+ *
+ * Creates a new #GeditStatusbar.
+ *
+ * Return value: the new #GeditStatusbar object
+ */
+GtkWidget *
+gedit_statusbar_new (void)
+{
+ return g_object_new (GEDIT_TYPE_STATUSBAR, NULL);
+}
+
+static gboolean
+remove_message_timeout (GeditStatusbar *statusbar)
+{
+ gtk_statusbar_remove (GTK_STATUSBAR (statusbar),
+ statusbar->flash_context_id,
+ statusbar->flash_message_id);
+
+ /* Remove the timeout. */
+ statusbar->flash_timeout = 0;
+ return G_SOURCE_REMOVE;
+}
+
+static void
+flash_text (GeditStatusbar *statusbar,
+ guint context_id,
+ const gchar *text)
+{
+ const guint32 flash_length = 3000; /* Three seconds. */
+
+ /* Remove a currently ongoing flash message. */
+ if (statusbar->flash_timeout > 0)
+ {
+ g_source_remove (statusbar->flash_timeout);
+ statusbar->flash_timeout = 0;
+
+ gtk_statusbar_remove (GTK_STATUSBAR (statusbar),
+ statusbar->flash_context_id,
+ statusbar->flash_message_id);
+ }
+
+ statusbar->flash_context_id = context_id;
+ statusbar->flash_message_id = gtk_statusbar_push (GTK_STATUSBAR (statusbar),
+ context_id,
+ text);
+
+ statusbar->flash_timeout = g_timeout_add (flash_length,
+ (GSourceFunc) remove_message_timeout,
+ statusbar);
+}
+
+/* FIXME this is an issue for introspection */
+/**
+ * gedit_statusbar_flash_message:
+ * @statusbar: a #GeditStatusbar
+ * @context_id: message context_id
+ * @format: message to flash on the statusbar
+ * @...: the arguments to insert in @format
+ *
+ * Flash a temporary message on the statusbar.
+ */
+void
+gedit_statusbar_flash_message (GeditStatusbar *statusbar,
+ guint context_id,
+ const gchar *format,
+ ...)
+{
+ va_list args;
+ gchar *text;
+
+ g_return_if_fail (GEDIT_IS_STATUSBAR (statusbar));
+ g_return_if_fail (format != NULL);
+
+ va_start (args, format);
+ text = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ flash_text (statusbar, context_id, text);
+
+ g_free (text);
+}
+
+void
+_gedit_statusbar_flash_generic_message (GeditStatusbar *statusbar,
+ const gchar *format,
+ ...)
+{
+ va_list args;
+ gchar *text;
+
+ g_return_if_fail (GEDIT_IS_STATUSBAR (statusbar));
+ g_return_if_fail (format != NULL);
+
+ va_start (args, format);
+ text = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ flash_text (statusbar, statusbar->generic_message_context_id, text);
+
+ g_free (text);
+}
+
+void
+gedit_statusbar_set_window_state (GeditStatusbar *statusbar,
+ GeditWindowState state,
+ gint num_of_errors)
+{
+ g_return_if_fail (GEDIT_IS_STATUSBAR (statusbar));
+
+ gtk_widget_hide (statusbar->state_frame);
+ gtk_widget_hide (statusbar->save_image);
+ gtk_widget_hide (statusbar->load_image);
+ gtk_widget_hide (statusbar->print_image);
+
+ if (state & GEDIT_WINDOW_STATE_SAVING)
+ {
+ gtk_widget_show (statusbar->state_frame);
+ gtk_widget_show (statusbar->save_image);
+ }
+ if (state & GEDIT_WINDOW_STATE_LOADING)
+ {
+ gtk_widget_show (statusbar->state_frame);
+ gtk_widget_show (statusbar->load_image);
+ }
+ if (state & GEDIT_WINDOW_STATE_PRINTING)
+ {
+ gtk_widget_show (statusbar->state_frame);
+ gtk_widget_show (statusbar->print_image);
+ }
+ if (state & GEDIT_WINDOW_STATE_ERROR)
+ {
+ gchar *tip;
+
+ tip = g_strdup_printf (ngettext("There is a tab with errors",
+ "There are %d tabs with errors",
+ num_of_errors),
+ num_of_errors);
+
+ gtk_widget_set_tooltip_text (statusbar->error_image, tip);
+ g_free (tip);
+
+ gtk_widget_show (statusbar->error_frame);
+ }
+ else
+ {
+ gtk_widget_hide (statusbar->error_frame);
+ }
+}
+
+/* ex:set ts=8 noet: */