/* * 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 . */ #include "config.h" #include "gedit-statusbar.h" #include #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: */