gtranslator r3560 - in trunk/src: . dialogs
- From: icq svn gnome org
- To: svn-commits-list gnome org
- Subject: gtranslator r3560 - in trunk/src: . dialogs
- Date: Sun, 20 Apr 2008 20:02:29 +0100 (BST)
Author: icq
Date: Sun Apr 20 19:02:29 2008
New Revision: 3560
URL: http://svn.gnome.org/viewvc/gtranslator?rev=3560&view=rev
Log:
2008-04-20 Ignacio Casal Quinteiro <nacho resa gmail com>
* dialogs/close-confirmation-dialog.ch:
* dialogs/Makefile.am:
Added close confirmation dialogs.
* window.ch:
* tab.ch:
* actions-file.c:
* notebook.c:
Added close dialog for a single tab.
Added:
trunk/src/dialogs/close-confirmation-dialog.c
trunk/src/dialogs/close-confirmation-dialog.h
Modified:
trunk/src/ChangeLog
trunk/src/actions-file.c
trunk/src/dialogs/Makefile.am
trunk/src/notebook.c
trunk/src/tab.c
trunk/src/tab.h
trunk/src/window.c
trunk/src/window.h
Modified: trunk/src/actions-file.c
==============================================================================
--- trunk/src/actions-file.c (original)
+++ trunk/src/actions-file.c Sun Apr 20 19:02:29 2008
@@ -29,6 +29,7 @@
#include <string.h>
#include "actions.h"
+#include "dialogs/close-confirmation-dialog.h"
#include "file-dialogs.h"
#include "notebook.h"
#include "po.h"
@@ -315,25 +316,6 @@
gtk_widget_show (GTK_WIDGET (dialog));
}
-void
-gtranslator_file_close(GtkAction * widget,
- GtranslatorWindow *window)
-{
- GtranslatorNotebook *nb;
- GtranslatorTab *current_page;
- gint i;
-
- current_page = gtranslator_window_get_active_tab(window);
- nb = gtranslator_window_get_notebook(window);
- g_assert(current_page != NULL);
-
- i = gtk_notebook_page_num(GTK_NOTEBOOK(nb), GTK_WIDGET(current_page));
- if (i != -1)
- gtk_notebook_remove_page(GTK_NOTEBOOK(nb), i);
-
- set_sensitive_according_to_window(window);
-}
-
void
gtranslator_file_quit (GtkAction *action,
GtranslatorWindow *window)
@@ -507,3 +489,107 @@
load_file_list (window, uris);
}
+
+static void
+save_and_close_document (GtranslatorPo *po,
+ GtranslatorWindow *window)
+{
+ GtranslatorTab *tab;
+
+ gtranslator_save_current_file_dialog (NULL, window);
+
+ tab = gtranslator_tab_get_from_document (po);
+
+ _gtranslator_window_close_tab (window, tab);
+}
+
+static void
+close_confirmation_dialog_response_handler (GtranslatorCloseConfirmationDialog *dlg,
+ gint response_id,
+ GtranslatorWindow *window)
+{
+ GList *selected_documents;
+ const GList *unsaved_documents;
+
+ gtk_widget_hide (GTK_WIDGET (dlg));
+
+ switch (response_id)
+ {
+ case GTK_RESPONSE_YES: /* Save and Close */
+ selected_documents = gtranslator_close_confirmation_dialog_get_selected_documents (dlg);
+ if (selected_documents == NULL)
+ {
+ g_return_if_reached ();
+ }
+ else
+ {
+ /*if (is_closing_all)
+ {
+ save_and_close_all_documents (selected_documents,
+ window);
+ }
+ else
+ {*/
+ save_and_close_document (selected_documents->data,
+ window);
+ //}
+ }
+
+ g_list_free (selected_documents);
+
+ break;
+
+ case GTK_RESPONSE_NO: /* Close without Saving */
+ /*if (is_closing_all)
+ {
+ gtk_widget_destroy (GTK_WIDGET (dlg));
+
+ close_all_tabs (window);
+
+ return;
+ }
+ else
+ {*/
+
+
+ unsaved_documents = gtranslator_close_confirmation_dialog_get_unsaved_documents (dlg);
+ g_return_if_fail (unsaved_documents->next == NULL);
+
+ _gtranslator_window_close_tab (window,
+ gtranslator_tab_get_from_document (unsaved_documents->data));
+ //}
+
+ break;
+ default: /* Do not close */
+ break;
+ }
+
+ gtk_widget_destroy (GTK_WIDGET (dlg));
+}
+
+void
+gtranslator_file_close (GtkAction * widget,
+ GtranslatorWindow *window)
+{
+ GtranslatorTab *tab;
+
+ tab = gtranslator_window_get_active_tab (window);
+
+ if (!_gtranslator_tab_can_close (tab))
+ {
+ GtkWidget *dlg;
+
+ dlg = gtranslator_close_confirmation_dialog_new_single (GTK_WINDOW (window),
+ gtranslator_tab_get_po (tab),
+ FALSE);
+
+ g_signal_connect (dlg,
+ "response",
+ G_CALLBACK (close_confirmation_dialog_response_handler),
+ window);
+
+ gtk_widget_show (dlg);
+ }
+ else
+ _gtranslator_window_close_tab (window, tab);
+}
Modified: trunk/src/dialogs/Makefile.am
==============================================================================
--- trunk/src/dialogs/Makefile.am (original)
+++ trunk/src/dialogs/Makefile.am Sun Apr 20 19:02:29 2008
@@ -14,6 +14,8 @@
libdialogs.la
libdialogs_la_SOURCES = \
+ close-confirmation-dialog.c \
+ close-confirmation-dialog.h \
file-dialogs.c \
file-dialogs.h \
preferences-dialog.c \
Added: trunk/src/dialogs/close-confirmation-dialog.c
==============================================================================
--- (empty file)
+++ trunk/src/dialogs/close-confirmation-dialog.c Sun Apr 20 19:02:29 2008
@@ -0,0 +1,636 @@
+/*
+ * gtranslator-close-confirmation-dialog.c
+ * This file is part of gtranslator
+ *
+ * Copyright (C) 2004-2005 GNOME Foundation
+ * 2008 Ignacio Casal Quinteiro
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n.h>
+
+#include "close-confirmation-dialog.h"
+#include "application.h"
+#include "utils.h"
+#include "window.h"
+#include "po.h"
+
+
+/* Properties */
+enum
+{
+ PROP_0,
+ PROP_UNSAVED_DOCUMENTS,
+ PROP_LOGOUT_MODE
+};
+
+/* Mode */
+enum
+{
+ SINGLE_DOC_MODE,
+ MULTIPLE_DOCS_MODE
+};
+
+/* Columns */
+enum
+{
+ SAVE_COLUMN,
+ NAME_COLUMN,
+ DOC_COLUMN, /* a handy pointer to the document */
+ N_COLUMNS
+};
+
+struct _GtranslatorCloseConfirmationDialogPrivate
+{
+ gboolean logout_mode;
+
+ GList *unsaved_documents;
+
+ GList *selected_documents;
+
+ GtkTreeModel *list_store;
+
+ gboolean disable_save_to_disk;
+};
+
+#define GTR_CLOSE_CONFIRMATION_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
+ GTR_TYPE_CLOSE_CONFIRMATION_DIALOG, \
+ GtranslatorCloseConfirmationDialogPrivate))
+
+#define GET_MODE(priv) (((priv->unsaved_documents != NULL) && \
+ (priv->unsaved_documents->next == NULL)) ? \
+ SINGLE_DOC_MODE : MULTIPLE_DOCS_MODE)
+
+G_DEFINE_TYPE(GtranslatorCloseConfirmationDialog, gtranslator_close_confirmation_dialog, GTK_TYPE_DIALOG)
+
+static void set_unsaved_document (GtranslatorCloseConfirmationDialog *dlg,
+ const GList *list);
+
+static GList *get_selected_docs (GtkTreeModel *store);
+
+/* Since we connect in the costructor we are sure this handler will be called
+ * before the user ones
+ */
+static void
+response_cb (GtranslatorCloseConfirmationDialog *dlg,
+ gint response_id,
+ gpointer data)
+{
+ GtranslatorCloseConfirmationDialogPrivate *priv;
+
+ g_return_if_fail (GTR_IS_CLOSE_CONFIRMATION_DIALOG (dlg));
+
+ priv = dlg->priv;
+
+ if (priv->selected_documents != NULL)
+ g_list_free (priv->selected_documents);
+
+ if (response_id == GTK_RESPONSE_YES)
+ {
+ if (GET_MODE (priv) == SINGLE_DOC_MODE)
+ {
+ priv->selected_documents =
+ g_list_copy (priv->unsaved_documents);
+ }
+ else
+ {
+ g_return_if_fail (priv->list_store);
+
+ priv->selected_documents =
+ get_selected_docs (priv->list_store);
+ }
+ }
+ else
+ priv->selected_documents = NULL;
+}
+
+static void
+set_logout_mode (GtranslatorCloseConfirmationDialog *dlg,
+ gboolean logout_mode)
+{
+
+ gtk_dialog_add_button (GTK_DIALOG (dlg),
+ _("Close _without Saving"),
+ GTK_RESPONSE_NO);
+
+ gtk_dialog_add_button (GTK_DIALOG (dlg),
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+
+ gtk_dialog_add_button (GTK_DIALOG (dlg),
+ GTK_STOCK_SAVE,
+ GTK_RESPONSE_YES);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dlg),
+ GTK_RESPONSE_YES);
+}
+
+static void
+gtranslator_close_confirmation_dialog_init (GtranslatorCloseConfirmationDialog *dlg)
+{
+ AtkObject *atk_obj;
+
+ dlg->priv = GTR_CLOSE_CONFIRMATION_DIALOG_GET_PRIVATE (dlg);
+
+ gtk_container_set_border_width (GTK_CONTAINER (dlg), 5);
+ gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dlg)->vbox), 14);
+ gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
+ gtk_dialog_set_has_separator (GTK_DIALOG (dlg), FALSE);
+ gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dlg), TRUE);
+
+ gtk_window_set_title (GTK_WINDOW (dlg), "");
+
+ gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
+ gtk_window_set_destroy_with_parent (GTK_WINDOW (dlg), TRUE);
+
+ atk_obj = gtk_widget_get_accessible (GTK_WIDGET (dlg));
+ atk_object_set_role (atk_obj, ATK_ROLE_ALERT);
+ atk_object_set_name (atk_obj, _("Question"));
+
+ g_signal_connect (dlg,
+ "response",
+ G_CALLBACK (response_cb),
+ NULL);
+}
+
+static void
+gtranslator_close_confirmation_dialog_finalize (GObject *object)
+{
+ GtranslatorCloseConfirmationDialogPrivate *priv;
+
+ priv = GTR_CLOSE_CONFIRMATION_DIALOG (object)->priv;
+
+ if (priv->unsaved_documents != NULL)
+ g_list_free (priv->unsaved_documents);
+
+ if (priv->selected_documents != NULL)
+ g_list_free (priv->selected_documents);
+
+ /* Call the parent's destructor */
+ G_OBJECT_CLASS (gtranslator_close_confirmation_dialog_parent_class)->finalize (object);
+}
+
+static void
+gtranslator_close_confirmation_dialog_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GtranslatorCloseConfirmationDialog *dlg;
+
+ dlg = GTR_CLOSE_CONFIRMATION_DIALOG (object);
+
+ switch (prop_id)
+ {
+ case PROP_UNSAVED_DOCUMENTS:
+ set_unsaved_document (dlg, g_value_get_pointer (value));
+ break;
+
+ case PROP_LOGOUT_MODE:
+ set_logout_mode (dlg, g_value_get_boolean (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gtranslator_close_confirmation_dialog_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtranslatorCloseConfirmationDialogPrivate *priv;
+
+ priv = GTR_CLOSE_CONFIRMATION_DIALOG (object)->priv;
+
+ switch( prop_id )
+ {
+ case PROP_UNSAVED_DOCUMENTS:
+ g_value_set_pointer (value, priv->unsaved_documents);
+ break;
+
+ case PROP_LOGOUT_MODE:
+ g_value_set_boolean (value, priv->logout_mode);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gtranslator_close_confirmation_dialog_class_init (GtranslatorCloseConfirmationDialogClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property = gtranslator_close_confirmation_dialog_set_property;
+ gobject_class->get_property = gtranslator_close_confirmation_dialog_get_property;
+ gobject_class->finalize = gtranslator_close_confirmation_dialog_finalize;
+
+ g_type_class_add_private (klass, sizeof (GtranslatorCloseConfirmationDialogPrivate));
+
+ g_object_class_install_property (gobject_class,
+ PROP_UNSAVED_DOCUMENTS,
+ g_param_spec_pointer ("unsaved_documents",
+ "Unsaved Documents",
+ "List of Unsaved Documents",
+ (G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_LOGOUT_MODE,
+ g_param_spec_boolean ("logout_mode",
+ "Logout Mode",
+ "Whether the dialog is in logout mode",
+ FALSE,
+ (G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY)));
+}
+
+static GList *
+get_selected_docs (GtkTreeModel *store)
+{
+ GList *list;
+ gboolean valid;
+ GtkTreeIter iter;
+
+ list = NULL;
+ valid = gtk_tree_model_get_iter_first (store, &iter);
+
+ while (valid)
+ {
+ gboolean to_save;
+ GtranslatorPo *doc;
+
+ gtk_tree_model_get (store, &iter,
+ SAVE_COLUMN, &to_save,
+ DOC_COLUMN, &doc,
+ -1);
+ if (to_save)
+ list = g_list_prepend (list, doc);
+
+ valid = gtk_tree_model_iter_next (store, &iter);
+ }
+
+ list = g_list_reverse (list);
+
+ return list;
+}
+
+GList *
+gtranslator_close_confirmation_dialog_get_selected_documents (GtranslatorCloseConfirmationDialog *dlg)
+{
+ g_return_val_if_fail (GTR_IS_CLOSE_CONFIRMATION_DIALOG (dlg), NULL);
+
+ return g_list_copy (dlg->priv->selected_documents);
+}
+
+GtkWidget *
+gtranslator_close_confirmation_dialog_new (GtkWindow *parent,
+ GList *unsaved_documents,
+ gboolean logout_mode)
+{
+ GtkWidget *dlg;
+ g_return_val_if_fail (unsaved_documents != NULL, NULL);
+
+ dlg = GTK_WIDGET (g_object_new (GTR_TYPE_CLOSE_CONFIRMATION_DIALOG,
+ "unsaved_documents", unsaved_documents,
+ "logout_mode", logout_mode,
+ NULL));
+ g_return_val_if_fail (dlg != NULL, NULL);
+
+ if (parent != NULL)
+ {
+ gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
+ }
+
+ return dlg;
+}
+
+GtkWidget *
+gtranslator_close_confirmation_dialog_new_single (GtkWindow *parent,
+ GtranslatorPo *doc,
+ gboolean logout_mode)
+{
+ GtkWidget *dlg;
+ GList *unsaved_documents;
+ g_return_val_if_fail (doc != NULL, NULL);
+
+ unsaved_documents = g_list_prepend (NULL, doc);
+
+ dlg = gtranslator_close_confirmation_dialog_new (parent,
+ unsaved_documents,
+ logout_mode);
+
+ g_list_free (unsaved_documents);
+
+ return dlg;
+}
+
+static void
+build_single_doc_dialog (GtranslatorCloseConfirmationDialog *dlg)
+{
+ GtkWidget *hbox;
+ GtkWidget *vbox;
+ GtkWidget *primary_label;
+ GtkWidget *image;
+ GtranslatorPo *doc;
+ const gchar *doc_name;
+ gchar *str;
+ gchar *markup_str;
+
+ g_return_if_fail (dlg->priv->unsaved_documents->data != NULL);
+ doc = GTR_PO (dlg->priv->unsaved_documents->data);
+
+ /* Image */
+ image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
+ GTK_ICON_SIZE_DIALOG);
+ gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
+
+ /* Primary label */
+ primary_label = gtk_label_new (NULL);
+ gtk_label_set_line_wrap (GTK_LABEL (primary_label), TRUE);
+ gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (primary_label), 0.0, 0.5);
+ gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE);
+
+ doc_name = gtranslator_po_get_filename (doc);
+
+ str = g_markup_printf_escaped (_("Save the changes to document \"%s\" before closing?"),
+ doc_name);
+
+ markup_str = g_strconcat ("<span weight=\"bold\" size=\"larger\">", str, "</span>", NULL);
+ g_free (str);
+
+ gtk_label_set_markup (GTK_LABEL (primary_label), markup_str);
+ g_free (markup_str);
+
+ hbox = gtk_hbox_new (FALSE, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 12);
+
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ gtk_box_pack_start (GTK_BOX (vbox), primary_label, FALSE, FALSE, 0);
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox),
+ hbox,
+ FALSE,
+ FALSE,
+ 0);
+
+ gtk_widget_show_all (hbox);
+}
+
+static void
+populate_model (GtkTreeModel *store,
+ GList *docs)
+{
+ GtkTreeIter iter;
+
+ while (docs != NULL)
+ {
+ GtranslatorPo *po;
+ const gchar *name;
+
+ po = GTR_PO (docs->data);
+
+ name = gtranslator_po_get_filename (po);
+
+ gtk_list_store_append (GTK_LIST_STORE (store), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (store), &iter,
+ SAVE_COLUMN, TRUE,
+ NAME_COLUMN, name,
+ DOC_COLUMN, po,
+ -1);
+
+ docs = g_list_next (docs);
+ }
+}
+
+static void
+save_toggled (GtkCellRendererToggle *renderer,
+ gchar *path_str,
+ GtkTreeModel *store)
+{
+ GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
+ GtkTreeIter iter;
+ gboolean active;
+
+ gtk_tree_model_get_iter (store, &iter, path);
+ gtk_tree_model_get (store, &iter, SAVE_COLUMN, &active, -1);
+
+ active ^= 1;
+
+ gtk_list_store_set (GTK_LIST_STORE (store), &iter,
+ SAVE_COLUMN, active, -1);
+
+ gtk_tree_path_free (path);
+}
+
+static GtkWidget *
+create_treeview (GtranslatorCloseConfirmationDialogPrivate *priv)
+{
+ GtkListStore *store;
+ GtkWidget *treeview;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ treeview = gtk_tree_view_new ();
+ gtk_widget_set_size_request (treeview, 260, 120);
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
+ gtk_tree_view_set_enable_search (GTK_TREE_VIEW (treeview), FALSE);
+
+ /* Create and populate the model */
+ store = gtk_list_store_new (N_COLUMNS, G_TYPE_BOOLEAN,
+ G_TYPE_STRING, G_TYPE_POINTER);
+ populate_model (GTK_TREE_MODEL (store), priv->unsaved_documents);
+
+ /* Set model to the treeview */
+ gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
+ GTK_TREE_MODEL (store));
+ g_object_unref (store);
+
+ priv->list_store = GTK_TREE_MODEL (store);
+
+ /* Add columns */
+ if (!priv->disable_save_to_disk)
+ {
+ renderer = gtk_cell_renderer_toggle_new ();
+ g_signal_connect (renderer, "toggled",
+ G_CALLBACK (save_toggled), store);
+
+ column = gtk_tree_view_column_new_with_attributes ("Save?",
+ renderer,
+ "active",
+ SAVE_COLUMN,
+ NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+ }
+
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Name",
+ renderer,
+ "text",
+ NAME_COLUMN,
+ NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+
+ return treeview;
+}
+
+static void
+build_multiple_docs_dialog (GtranslatorCloseConfirmationDialog *dlg)
+{
+ GtranslatorCloseConfirmationDialogPrivate *priv;
+ GtkWidget *hbox;
+ GtkWidget *image;
+ GtkWidget *vbox;
+ GtkWidget *primary_label;
+ GtkWidget *vbox2;
+ GtkWidget *select_label;
+ GtkWidget *scrolledwindow;
+ GtkWidget *treeview;
+ GtkWidget *secondary_label;
+ gchar *str;
+ gchar *markup_str;
+
+ priv = dlg->priv;
+
+ hbox = gtk_hbox_new (FALSE, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox),
+ hbox, TRUE, TRUE, 0);
+
+ /* Image */
+ image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
+ GTK_ICON_SIZE_DIALOG);
+ gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
+ gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 12);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ /* Primary label */
+ primary_label = gtk_label_new (NULL);
+ gtk_label_set_line_wrap (GTK_LABEL (primary_label), TRUE);
+ gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (primary_label), 0.0, 0.5);
+ gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE);
+
+ if (priv->disable_save_to_disk)
+ str = g_strdup_printf (
+ ngettext ("Changes to %d document will be permanently lost.",
+ "Changes to %d documents will be permanently lost.",
+ g_list_length (priv->unsaved_documents)),
+ g_list_length (priv->unsaved_documents));
+ else
+ str = g_strdup_printf (
+ ngettext ("There is %d document with unsaved changes. "
+ "Save changes before closing?",
+ "There are %d documents with unsaved changes. "
+ "Save changes before closing?",
+ g_list_length (priv->unsaved_documents)),
+ g_list_length (priv->unsaved_documents));
+
+ markup_str = g_strconcat ("<span weight=\"bold\" size=\"larger\">", str, "</span>", NULL);
+ g_free (str);
+
+ gtk_label_set_markup (GTK_LABEL (primary_label), markup_str);
+ g_free (markup_str);
+ gtk_box_pack_start (GTK_BOX (vbox), primary_label, FALSE, FALSE, 0);
+
+ vbox2 = gtk_vbox_new (FALSE, 8);
+ gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0);
+
+ if (priv->disable_save_to_disk)
+ select_label = gtk_label_new_with_mnemonic (_("Docum_ents with unsaved changes:"));
+ else
+ select_label = gtk_label_new_with_mnemonic (_("S_elect the documents you want to save:"));
+
+ gtk_box_pack_start (GTK_BOX (vbox2), select_label, FALSE, FALSE, 0);
+ gtk_label_set_line_wrap (GTK_LABEL (select_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (select_label), 0.0, 0.5);
+
+ scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+ gtk_box_pack_start (GTK_BOX (vbox2), scrolledwindow, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
+ GTK_SHADOW_IN);
+
+ treeview = create_treeview (priv);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), treeview);
+
+ /* Secondary label */
+ if (priv->disable_save_to_disk)
+ secondary_label = gtk_label_new (_("Saving has been disabled by the system administrator."));
+ else
+ secondary_label = gtk_label_new (_("If you don't save, "
+ "all your changes will be permanently lost."));
+
+ gtk_box_pack_start (GTK_BOX (vbox2), secondary_label, FALSE, FALSE, 0);
+ gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (secondary_label), 0, 0.5);
+ gtk_label_set_selectable (GTK_LABEL (secondary_label), TRUE);
+
+ gtk_label_set_mnemonic_widget (GTK_LABEL (select_label), treeview);
+
+ gtk_widget_show_all (hbox);
+}
+
+static void
+set_unsaved_document (GtranslatorCloseConfirmationDialog *dlg,
+ const GList *list)
+{
+ GtranslatorCloseConfirmationDialogPrivate *priv;
+
+ g_return_if_fail (list != NULL);
+
+ priv = dlg->priv;
+ g_return_if_fail (priv->unsaved_documents == NULL);
+
+ priv->unsaved_documents = g_list_copy ((GList *)list);
+
+ if (GET_MODE (priv) == SINGLE_DOC_MODE)
+ {
+ build_single_doc_dialog (dlg);
+ }
+ else
+ {
+ build_multiple_docs_dialog (dlg);
+ }
+}
+
+const GList *
+gtranslator_close_confirmation_dialog_get_unsaved_documents (GtranslatorCloseConfirmationDialog *dlg)
+{
+ g_return_val_if_fail (GTR_IS_CLOSE_CONFIRMATION_DIALOG (dlg), NULL);
+
+ return dlg->priv->unsaved_documents;
+}
Added: trunk/src/dialogs/close-confirmation-dialog.h
==============================================================================
--- (empty file)
+++ trunk/src/dialogs/close-confirmation-dialog.h Sun Apr 20 19:02:29 2008
@@ -0,0 +1,76 @@
+/*
+ * gtranslator-close-confirmation-dialog.h
+ * This file is part of gtranslator
+ *
+ * Copyright (C) 2004-2005 GNOME Foundation
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the gtranslator Team, 2004-2005. See the AUTHORS file for a
+ * list of people on the gtranslator Team.
+ * See the ChangeLog files for a list of changes.
+ */
+
+#ifndef __GTR_CLOSE_CONFIRMATION_DIALOG_H__
+#define __GTR_CLOSE_CONFIRMATION_DIALOG_H__
+
+#include <glib.h>
+#include <gtk/gtkwidget.h>
+#include <gtk/gtkdialog.h>
+
+#include "po.h"
+
+#define GTR_TYPE_CLOSE_CONFIRMATION_DIALOG (gtranslator_close_confirmation_dialog_get_type ())
+#define GTR_CLOSE_CONFIRMATION_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTR_TYPE_CLOSE_CONFIRMATION_DIALOG, GtranslatorCloseConfirmationDialog))
+#define GTR_CLOSE_CONFIRMATION_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTR_TYPE_CLOSE_CONFIRMATION_DIALOG, GtranslatorCloseConfirmationDialogClass))
+#define GTR_IS_CLOSE_CONFIRMATION_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTR_TYPE_CLOSE_CONFIRMATION_DIALOG))
+#define GTR_IS_CLOSE_CONFIRMATION_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTR_TYPE_CLOSE_CONFIRMATION_DIALOG))
+#define GTR_CLOSE_CONFIRMATION_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GTR_TYPE_CLOSE_CONFIRMATION_DIALOG, GtranslatorCloseConfirmationDialogClass))
+
+typedef struct _GtranslatorCloseConfirmationDialog GtranslatorCloseConfirmationDialog;
+typedef struct _GtranslatorCloseConfirmationDialogClass GtranslatorCloseConfirmationDialogClass;
+typedef struct _GtranslatorCloseConfirmationDialogPrivate GtranslatorCloseConfirmationDialogPrivate;
+
+struct _GtranslatorCloseConfirmationDialog
+{
+ GtkDialog parent;
+
+ /*< private > */
+ GtranslatorCloseConfirmationDialogPrivate *priv;
+};
+
+struct _GtranslatorCloseConfirmationDialogClass
+{
+ GtkDialogClass parent_class;
+};
+
+GType gtranslator_close_confirmation_dialog_get_type (void) G_GNUC_CONST;
+
+GtkWidget *gtranslator_close_confirmation_dialog_new (GtkWindow *parent,
+ GList *unsaved_documents,
+ gboolean logout_mode);
+GtkWidget *gtranslator_close_confirmation_dialog_new_single (GtkWindow *parent,
+ GtranslatorPo *doc,
+ gboolean logout_mode);
+
+const GList *gtranslator_close_confirmation_dialog_get_unsaved_documents (GtranslatorCloseConfirmationDialog *dlg);
+
+GList *gtranslator_close_confirmation_dialog_get_selected_documents (GtranslatorCloseConfirmationDialog *dlg);
+
+#endif /* __GTR_CLOSE_CONFIRMATION_DIALOG_H__ */
+
Modified: trunk/src/notebook.c
==============================================================================
--- trunk/src/notebook.c (original)
+++ trunk/src/notebook.c Sun Apr 20 19:02:29 2008
@@ -66,7 +66,7 @@
}
static void
-sync_name (GtranslatorTab *tab,
+sync_name (GtranslatorPo *po,
GParamSpec *pspec,
GtkWidget *hbox)
{
@@ -74,12 +74,11 @@
GtkWidget *label;
GtkWidget *ebox;
gchar *tooltip;
- GtranslatorPo *po;
+ GtranslatorTab *tab;
label = GTK_WIDGET (g_object_get_data (G_OBJECT (hbox), "label"));
ebox = GTK_WIDGET (g_object_get_data (G_OBJECT (hbox), "label-ebox"));
-
- po = gtranslator_tab_get_po (tab);
+ tab = gtranslator_tab_get_from_document (po);
str = gtranslator_tab_get_name (tab);
g_return_if_fail (str != NULL);
@@ -229,28 +228,31 @@
}
void
-gtranslator_notebook_add_page(GtranslatorNotebook *notebook,
- GtranslatorTab *tab)
+gtranslator_notebook_add_page (GtranslatorNotebook *notebook,
+ GtranslatorTab *tab)
{
GtranslatorNotebookPrivate *priv = notebook->priv;
+ GtranslatorPo *po;
GtkWidget *label;
- g_return_if_fail(GTR_IS_NOTEBOOK(notebook));
- g_return_if_fail(GTR_IS_TAB(tab));
+ g_return_if_fail (GTR_IS_NOTEBOOK (notebook));
+ g_return_if_fail (GTR_IS_TAB (tab));
+
+ po = gtranslator_tab_get_po (tab);
- label = build_tab_label(notebook, tab);
+ label = build_tab_label (notebook, tab);
- sync_name (tab, NULL, label);
+ sync_name (po, NULL, label);
- g_signal_connect_object (tab,
+ g_signal_connect_object (po,
"notify::state",
G_CALLBACK (sync_name),
label,
0);
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
- GTK_WIDGET(tab), label);
- priv->pages = g_list_append(priv->pages, tab);
+ gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
+ GTK_WIDGET (tab), label);
+ priv->pages = g_list_append (priv->pages, tab);
}
GtranslatorTab *
Modified: trunk/src/tab.c
==============================================================================
--- trunk/src/tab.c (original)
+++ trunk/src/tab.c Sun Apr 20 19:02:29 2008
@@ -46,6 +46,8 @@
#define MAX_PLURALS 6
+#define GTR_TAB_KEY "GtranslatorTabFromDocument"
+
G_DEFINE_TYPE(GtranslatorTab, gtranslator_tab, GTK_TYPE_VBOX)
struct _GtranslatorTabPrivate
@@ -594,6 +596,7 @@
tab = g_object_new (GTR_TYPE_TAB, NULL);
tab->priv->po = po;
+ g_object_set_data (G_OBJECT (po), GTR_TAB_KEY, tab);
/*
* Now we have to initialize the number of msgstr tabs
@@ -731,25 +734,25 @@
* Return value: a new allocated string with the name of the @tab.
*/
gchar *
-gtranslator_tab_get_name(GtranslatorTab *tab)
+gtranslator_tab_get_name (GtranslatorTab *tab)
{
GtranslatorHeader *header;
GtranslatorPoState state;
gchar *str;
gchar *tab_name;
- header = gtranslator_po_get_header(tab->priv->po);
+ header = gtranslator_po_get_header (tab->priv->po);
state = gtranslator_po_get_state (tab->priv->po);
- str = gtranslator_header_get_prj_id_version(header);
+ str = gtranslator_header_get_prj_id_version (header);
- if(state == GTR_PO_STATE_MODIFIED)
+ if (state == GTR_PO_STATE_MODIFIED)
{
- tab_name = g_strdup_printf("*%s", str);
+ tab_name = g_strdup_printf ("*%s", str);
return tab_name;
}
- return g_strdup(str);
+ return g_strdup (str);
}
/**
@@ -797,3 +800,21 @@
g_signal_emit(G_OBJECT(tab), signals[SHOWED_MESSAGE], 0, GTR_MSG(to_go->data));
}
+
+gboolean
+_gtranslator_tab_can_close (GtranslatorTab *tab)
+{
+ return gtranslator_po_get_state (tab->priv->po) == GTR_PO_STATE_SAVED;
+}
+
+GtranslatorTab *
+gtranslator_tab_get_from_document (GtranslatorPo *po)
+{
+ gpointer res;
+
+ g_return_val_if_fail (GTR_IS_PO (po), NULL);
+
+ res = g_object_get_data (G_OBJECT (po), GTR_TAB_KEY);
+
+ return (res != NULL) ? GTR_TAB (res) : NULL;
+}
Modified: trunk/src/tab.h
==============================================================================
--- trunk/src/tab.h (original)
+++ trunk/src/tab.h Sun Apr 20 19:02:29 2008
@@ -100,6 +100,10 @@
void gtranslator_tab_message_go_to (GtranslatorTab *tab,
GList * to_go);
+
+GtranslatorTab *gtranslator_tab_get_from_document (GtranslatorPo *po);
+
+gboolean _gtranslator_tab_can_close (GtranslatorTab *tab);
G_END_DECLS
Modified: trunk/src/window.c
==============================================================================
--- trunk/src/window.c (original)
+++ trunk/src/window.c Sun Apr 20 19:02:29 2008
@@ -1723,3 +1723,19 @@
gtk_notebook_set_current_page (GTK_NOTEBOOK (window->priv->notebook),
page);
}
+
+void
+_gtranslator_window_close_tab (GtranslatorWindow *window,
+ GtranslatorTab *tab)
+{
+ gint i;
+
+ g_return_if_fail (GTR_IS_TAB (tab));
+
+ i = gtk_notebook_page_num (GTK_NOTEBOOK (window->priv->notebook),
+ GTK_WIDGET (tab));
+ if (i != -1)
+ gtk_notebook_remove_page (GTK_NOTEBOOK (window->priv->notebook), i);
+
+ set_sensitive_according_to_window (window);
+}
Modified: trunk/src/window.h
==============================================================================
--- trunk/src/window.h (original)
+++ trunk/src/window.h Sun Apr 20 19:02:29 2008
@@ -127,6 +127,9 @@
void gtranslator_window_set_active_tab (GtranslatorWindow *window,
GtkWidget *tab);
+
+void _gtranslator_window_close_tab (GtranslatorWindow *window,
+ GtranslatorTab *tab);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]