gtranslator r3560 - in trunk/src: . dialogs



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]