Blame src/e-util/gal-view-instance-save-as-dialog.c

Packit Service de44cd
/*
Packit Service de44cd
 * This program is free software; you can redistribute it and/or modify it
Packit Service de44cd
 * under the terms of the GNU Lesser General Public License as published by
Packit Service de44cd
 * the Free Software Foundation.
Packit Service de44cd
 *
Packit Service de44cd
 * This program is distributed in the hope that it will be useful, but
Packit Service de44cd
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit Service de44cd
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit Service de44cd
 * for more details.
Packit Service de44cd
 *
Packit Service de44cd
 * You should have received a copy of the GNU Lesser General Public License
Packit Service de44cd
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service de44cd
 *
Packit Service de44cd
 *
Packit Service de44cd
 * Authors:
Packit Service de44cd
 *		Chris Lahey <clahey@ximian.com>
Packit Service de44cd
 *
Packit Service de44cd
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
Packit Service de44cd
 *
Packit Service de44cd
 */
Packit Service de44cd
Packit Service de44cd
#include "evolution-config.h"
Packit Service de44cd
Packit Service de44cd
#include <glib/gi18n.h>
Packit Service de44cd
Packit Service de44cd
#include "e-misc-utils.h"
Packit Service de44cd
#include "e-util-private.h"
Packit Service de44cd
#include "gal-view-etable.h"
Packit Service de44cd
#include "gal-view-instance-save-as-dialog.h"
Packit Service de44cd
Packit Service de44cd
G_DEFINE_TYPE (GalViewInstanceSaveAsDialog, gal_view_instance_save_as_dialog, GTK_TYPE_DIALOG)
Packit Service de44cd
Packit Service de44cd
enum {
Packit Service de44cd
	PROP_0,
Packit Service de44cd
	PROP_INSTANCE
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
enum {
Packit Service de44cd
	COL_GALVIEW_NAME,
Packit Service de44cd
	COL_GALVIEW_DATA
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
/* Static functions */
Packit Service de44cd
static void
Packit Service de44cd
gal_view_instance_save_as_dialog_set_instance (GalViewInstanceSaveAsDialog *dialog,
Packit Service de44cd
                                               GalViewInstance *instance)
Packit Service de44cd
{
Packit Service de44cd
	GtkListStore *store;
Packit Service de44cd
	GtkCellRenderer *renderer;
Packit Service de44cd
	gint ii, view_count;
Packit Service de44cd
Packit Service de44cd
	dialog->instance = instance;
Packit Service de44cd
Packit Service de44cd
	store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
Packit Service de44cd
Packit Service de44cd
	view_count = gal_view_collection_get_count (instance->collection);
Packit Service de44cd
Packit Service de44cd
	for (ii = 0; ii < view_count; ii++) {
Packit Service de44cd
		GalViewCollectionItem *item;
Packit Service de44cd
		GtkTreeIter iter;
Packit Service de44cd
		gchar *title = NULL;
Packit Service de44cd
Packit Service de44cd
		item = gal_view_collection_get_view_item (
Packit Service de44cd
			instance->collection, ii);
Packit Service de44cd
Packit Service de44cd
		title = e_str_without_underscores (item->title);
Packit Service de44cd
Packit Service de44cd
		gtk_list_store_append (store, &iter);
Packit Service de44cd
		gtk_list_store_set (
Packit Service de44cd
			store, &iter,
Packit Service de44cd
			COL_GALVIEW_NAME, title,
Packit Service de44cd
			COL_GALVIEW_DATA, item,
Packit Service de44cd
			-1);
Packit Service de44cd
Packit Service de44cd
		g_free (title);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	gtk_tree_sortable_set_sort_column_id (
Packit Service de44cd
		GTK_TREE_SORTABLE (store),
Packit Service de44cd
			COL_GALVIEW_NAME, GTK_SORT_ASCENDING);
Packit Service de44cd
Packit Service de44cd
	/* attaching treeview to model */
Packit Service de44cd
	gtk_tree_view_set_model (dialog->treeview, GTK_TREE_MODEL (store));
Packit Service de44cd
	gtk_tree_view_set_search_column (dialog->treeview, COL_GALVIEW_NAME);
Packit Service de44cd
Packit Service de44cd
	dialog->model = GTK_TREE_MODEL (store);
Packit Service de44cd
Packit Service de44cd
	renderer = gtk_cell_renderer_text_new ();
Packit Service de44cd
Packit Service de44cd
	gtk_tree_view_insert_column_with_attributes (
Packit Service de44cd
		dialog->treeview,
Packit Service de44cd
		COL_GALVIEW_NAME, _("Name"),
Packit Service de44cd
		renderer, "text", COL_GALVIEW_NAME,
Packit Service de44cd
		NULL);
Packit Service de44cd
Packit Service de44cd
	/* set sort column */
Packit Service de44cd
	gtk_tree_sortable_set_sort_column_id (
Packit Service de44cd
		GTK_TREE_SORTABLE (dialog->model),
Packit Service de44cd
		COL_GALVIEW_NAME, GTK_SORT_ASCENDING);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
gvisad_setup_validate_button (GalViewInstanceSaveAsDialog *dialog)
Packit Service de44cd
{
Packit Service de44cd
	if ((dialog->toggle == GAL_VIEW_INSTANCE_SAVE_AS_DIALOG_TOGGLE_CREATE
Packit Service de44cd
	      && g_utf8_strlen (gtk_entry_get_text (GTK_ENTRY (dialog->entry_create)), -1) > 0)
Packit Service de44cd
	    || dialog->toggle == GAL_VIEW_INSTANCE_SAVE_AS_DIALOG_TOGGLE_REPLACE) {
Packit Service de44cd
		gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
Packit Service de44cd
	} else {
Packit Service de44cd
		gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
gvisad_setup_radio_buttons (GalViewInstanceSaveAsDialog *dialog)
Packit Service de44cd
{
Packit Service de44cd
	GtkWidget        *widget;
Packit Service de44cd
Packit Service de44cd
	widget = dialog->scrolledwindow;
Packit Service de44cd
	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->radiobutton_replace))) {
Packit Service de44cd
		GtkTreeIter       iter;
Packit Service de44cd
		GtkTreeSelection *selection;
Packit Service de44cd
Packit Service de44cd
		selection = gtk_tree_view_get_selection (dialog->treeview);
Packit Service de44cd
		if (!gtk_tree_selection_get_selected (selection, &dialog->model, &iter)) {
Packit Service de44cd
			if (gtk_tree_model_get_iter_first (dialog->model, &iter)) {
Packit Service de44cd
				gtk_tree_selection_select_iter (selection, &iter);
Packit Service de44cd
			}
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		gtk_widget_set_sensitive (widget, TRUE);
Packit Service de44cd
		dialog->toggle = GAL_VIEW_INSTANCE_SAVE_AS_DIALOG_TOGGLE_REPLACE;
Packit Service de44cd
	} else {
Packit Service de44cd
		gtk_widget_set_sensitive (widget, FALSE);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	widget = dialog->entry_create;
Packit Service de44cd
	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->radiobutton_create))) {
Packit Service de44cd
		gtk_widget_set_sensitive (widget, TRUE);
Packit Service de44cd
		dialog->toggle = GAL_VIEW_INSTANCE_SAVE_AS_DIALOG_TOGGLE_CREATE;
Packit Service de44cd
	} else {
Packit Service de44cd
		gtk_widget_set_sensitive (widget, FALSE);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	gvisad_setup_validate_button (dialog);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
gvisad_radio_toggled (GtkWidget *widget,
Packit Service de44cd
                      GalViewInstanceSaveAsDialog *dialog)
Packit Service de44cd
{
Packit Service de44cd
	gvisad_setup_radio_buttons (dialog);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
gvisad_entry_changed (GtkWidget *widget,
Packit Service de44cd
                      GalViewInstanceSaveAsDialog *dialog)
Packit Service de44cd
{
Packit Service de44cd
	gvisad_setup_validate_button (dialog);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* Method override implementations */
Packit Service de44cd
static void
Packit Service de44cd
gal_view_instance_save_as_dialog_set_property (GObject *object,
Packit Service de44cd
                                               guint property_id,
Packit Service de44cd
                                               const GValue *value,
Packit Service de44cd
                                               GParamSpec *pspec)
Packit Service de44cd
{
Packit Service de44cd
	GalViewInstanceSaveAsDialog *dialog;
Packit Service de44cd
Packit Service de44cd
	dialog = GAL_VIEW_INSTANCE_SAVE_AS_DIALOG (object);
Packit Service de44cd
Packit Service de44cd
	switch (property_id) {
Packit Service de44cd
	case PROP_INSTANCE:
Packit Service de44cd
		if (g_value_get_object (value))
Packit Service de44cd
			gal_view_instance_save_as_dialog_set_instance (dialog, GAL_VIEW_INSTANCE (g_value_get_object (value)));
Packit Service de44cd
		else
Packit Service de44cd
			gal_view_instance_save_as_dialog_set_instance (dialog, NULL);
Packit Service de44cd
		break;
Packit Service de44cd
Packit Service de44cd
	default:
Packit Service de44cd
		return;
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
gal_view_instance_save_as_dialog_get_property (GObject *object,
Packit Service de44cd
                                               guint property_id,
Packit Service de44cd
                                               GValue *value,
Packit Service de44cd
                                               GParamSpec *pspec)
Packit Service de44cd
{
Packit Service de44cd
	GalViewInstanceSaveAsDialog *dialog;
Packit Service de44cd
Packit Service de44cd
	dialog = GAL_VIEW_INSTANCE_SAVE_AS_DIALOG (object);
Packit Service de44cd
Packit Service de44cd
	switch (property_id) {
Packit Service de44cd
	case PROP_INSTANCE:
Packit Service de44cd
		g_value_set_object (value, dialog->instance);
Packit Service de44cd
		break;
Packit Service de44cd
Packit Service de44cd
	default:
Packit Service de44cd
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit Service de44cd
		break;
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
gal_view_instance_save_as_dialog_dispose (GObject *object)
Packit Service de44cd
{
Packit Service de44cd
	GalViewInstanceSaveAsDialog *gal_view_instance_save_as_dialog = GAL_VIEW_INSTANCE_SAVE_AS_DIALOG (object);
Packit Service de44cd
Packit Service de44cd
	if (gal_view_instance_save_as_dialog->builder)
Packit Service de44cd
		g_object_unref (gal_view_instance_save_as_dialog->builder);
Packit Service de44cd
	gal_view_instance_save_as_dialog->builder = NULL;
Packit Service de44cd
Packit Service de44cd
	/* Chain up to parent's dispose() method. */
Packit Service de44cd
	G_OBJECT_CLASS (gal_view_instance_save_as_dialog_parent_class)->dispose (object);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* Init functions */
Packit Service de44cd
static void
Packit Service de44cd
gal_view_instance_save_as_dialog_class_init (GalViewInstanceSaveAsDialogClass *class)
Packit Service de44cd
{
Packit Service de44cd
	GObjectClass *object_class;
Packit Service de44cd
Packit Service de44cd
	object_class = (GObjectClass *) class;
Packit Service de44cd
Packit Service de44cd
	object_class->set_property = gal_view_instance_save_as_dialog_set_property;
Packit Service de44cd
	object_class->get_property = gal_view_instance_save_as_dialog_get_property;
Packit Service de44cd
	object_class->dispose = gal_view_instance_save_as_dialog_dispose;
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_INSTANCE,
Packit Service de44cd
		g_param_spec_object (
Packit Service de44cd
			"instance",
Packit Service de44cd
			"Instance",
Packit Service de44cd
			NULL,
Packit Service de44cd
			GAL_TYPE_VIEW_INSTANCE,
Packit Service de44cd
			G_PARAM_READWRITE));
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
gal_view_instance_save_as_dialog_init (GalViewInstanceSaveAsDialog *dialog)
Packit Service de44cd
{
Packit Service de44cd
	GtkWidget *content_area;
Packit Service de44cd
	GtkWidget *widget;
Packit Service de44cd
Packit Service de44cd
	dialog->instance = NULL;
Packit Service de44cd
	dialog->model = NULL;
Packit Service de44cd
	dialog->collection = NULL;
Packit Service de44cd
Packit Service de44cd
	dialog->builder = gtk_builder_new ();
Packit Service de44cd
	e_load_ui_builder_definition (
Packit Service de44cd
		dialog->builder, "gal-view-instance-save-as-dialog.ui");
Packit Service de44cd
Packit Service de44cd
	widget = e_builder_get_widget (dialog->builder, "vbox-top");
Packit Service de44cd
	content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
Packit Service de44cd
	gtk_box_pack_start (GTK_BOX (content_area), widget, TRUE, TRUE, 0);
Packit Service de44cd
Packit Service de44cd
	/* TODO: add position/size saving/restoring */
Packit Service de44cd
	gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
Packit Service de44cd
	gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 360);
Packit Service de44cd
Packit Service de44cd
	gtk_dialog_add_buttons (
Packit Service de44cd
		GTK_DIALOG (dialog),
Packit Service de44cd
		_("_Cancel"), GTK_RESPONSE_CANCEL,
Packit Service de44cd
		_("_Save"), GTK_RESPONSE_OK,
Packit Service de44cd
		NULL);
Packit Service de44cd
Packit Service de44cd
	dialog->scrolledwindow = e_builder_get_widget (dialog->builder, "scrolledwindow2");
Packit Service de44cd
	dialog->treeview = GTK_TREE_VIEW (e_builder_get_widget (dialog->builder, "custom-replace"));
Packit Service de44cd
	dialog->entry_create = e_builder_get_widget (dialog->builder, "entry-create");
Packit Service de44cd
	dialog->radiobutton_replace = e_builder_get_widget (dialog->builder, "radiobutton-replace");
Packit Service de44cd
	dialog->radiobutton_create = e_builder_get_widget (dialog->builder, "radiobutton-create");
Packit Service de44cd
Packit Service de44cd
	gtk_tree_view_set_reorderable (GTK_TREE_VIEW (dialog->treeview), FALSE);
Packit Service de44cd
	gtk_tree_view_set_headers_visible (dialog->treeview, FALSE);
Packit Service de44cd
Packit Service de44cd
	g_signal_connect (
Packit Service de44cd
		dialog->radiobutton_replace, "toggled",
Packit Service de44cd
		G_CALLBACK (gvisad_radio_toggled), dialog);
Packit Service de44cd
	g_signal_connect (
Packit Service de44cd
		dialog->radiobutton_create, "toggled",
Packit Service de44cd
		G_CALLBACK (gvisad_radio_toggled), dialog);
Packit Service de44cd
	g_signal_connect (
Packit Service de44cd
		dialog->entry_create, "changed",
Packit Service de44cd
		G_CALLBACK (gvisad_entry_changed), dialog);
Packit Service de44cd
Packit Service de44cd
	gvisad_setup_radio_buttons (dialog);
Packit Service de44cd
	gvisad_setup_validate_button (dialog);
Packit Service de44cd
Packit Service de44cd
	gtk_window_set_title (GTK_WINDOW (dialog), _("Save Current View"));
Packit Service de44cd
	gtk_widget_show (GTK_WIDGET (dialog));
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* External methods */
Packit Service de44cd
/**
Packit Service de44cd
 * gal_view_instance_save_as_dialog_new
Packit Service de44cd
 *
Packit Service de44cd
 * Returns a new dialog for defining views.
Packit Service de44cd
 *
Packit Service de44cd
 * Returns: The GalViewInstanceSaveAsDialog.
Packit Service de44cd
 */
Packit Service de44cd
GtkWidget *
Packit Service de44cd
gal_view_instance_save_as_dialog_new (GalViewInstance *instance)
Packit Service de44cd
{
Packit Service de44cd
	GtkWidget *widget = g_object_new (GAL_TYPE_VIEW_INSTANCE_SAVE_AS_DIALOG, NULL);
Packit Service de44cd
	gal_view_instance_save_as_dialog_set_instance (GAL_VIEW_INSTANCE_SAVE_AS_DIALOG (widget), instance);
Packit Service de44cd
	return widget;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
gal_view_instance_save_as_dialog_save (GalViewInstanceSaveAsDialog *dialog)
Packit Service de44cd
{
Packit Service de44cd
	GalView *view = gal_view_instance_get_current_view (dialog->instance);
Packit Service de44cd
	const gchar *title;
Packit Service de44cd
	const gchar *id = NULL;
Packit Service de44cd
	GalViewCollection *collection;
Packit Service de44cd
	GalViewCollectionItem *item;
Packit Service de44cd
	gint ii, view_count;
Packit Service de44cd
Packit Service de44cd
	collection = dialog->instance->collection;
Packit Service de44cd
	view_count = gal_view_collection_get_count (collection);
Packit Service de44cd
Packit Service de44cd
	view = gal_view_clone (view);
Packit Service de44cd
Packit Service de44cd
	switch (dialog->toggle) {
Packit Service de44cd
	case GAL_VIEW_INSTANCE_SAVE_AS_DIALOG_TOGGLE_REPLACE:
Packit Service de44cd
		if (dialog->treeview) {
Packit Service de44cd
			GtkTreeIter iter;
Packit Service de44cd
			GtkTreeSelection *selection;
Packit Service de44cd
Packit Service de44cd
			selection = gtk_tree_view_get_selection (dialog->treeview);
Packit Service de44cd
			if (gtk_tree_selection_get_selected (selection, &dialog->model, &iter)) {
Packit Service de44cd
				gtk_tree_model_get (dialog->model, &iter, COL_GALVIEW_DATA, &item, -1);
Packit Service de44cd
Packit Service de44cd
				for (ii = 0; ii < view_count; ii++) {
Packit Service de44cd
					GalViewCollectionItem *candidate;
Packit Service de44cd
Packit Service de44cd
					candidate = gal_view_collection_get_view_item (collection, ii);
Packit Service de44cd
					if (item == candidate) {
Packit Service de44cd
						id = gal_view_collection_set_nth_view (collection, ii, view);
Packit Service de44cd
						gal_view_collection_save (collection);
Packit Service de44cd
					}
Packit Service de44cd
				}
Packit Service de44cd
			}
Packit Service de44cd
Packit Service de44cd
		}
Packit Service de44cd
		break;
Packit Service de44cd
Packit Service de44cd
	case GAL_VIEW_INSTANCE_SAVE_AS_DIALOG_TOGGLE_CREATE:
Packit Service de44cd
		if (dialog->entry_create && GTK_IS_ENTRY (dialog->entry_create)) {
Packit Service de44cd
			title = gtk_entry_get_text (GTK_ENTRY (dialog->entry_create));
Packit Service de44cd
			id = gal_view_collection_append_with_title (collection, title, view);
Packit Service de44cd
			gal_view_collection_save (collection);
Packit Service de44cd
		}
Packit Service de44cd
		break;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	/* The view stored in the collection should not be left attached, but detach it
Packit Service de44cd
	   only after it's saved, to have data to save. */
Packit Service de44cd
	if (GAL_IS_VIEW_ETABLE (view))
Packit Service de44cd
		gal_view_etable_detach (GAL_VIEW_ETABLE (view));
Packit Service de44cd
Packit Service de44cd
	if (id) {
Packit Service de44cd
		gal_view_instance_set_current_view_id (dialog->instance, id);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_clear_object (&view);
Packit Service de44cd
}