gnome-control-center/capplets/file-types/file-types-capplet.c

307 lines
8.5 KiB
C
Raw Normal View History

/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2002-01-08 21:25:33 +00:00
/* file-types-capplet.h
*
* Copyright (C) 1998 Redhat Software Inc.
* Copyright (C) 2000 Free Software Foundaton
* Copyright (C) 2000 Eazel, Inc.
2002-01-08 21:25:33 +00:00
* Copyright (C) 2002 Ximian, Inc.
*
* 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.
*
2002-01-08 21:25:33 +00:00
* Authors: Jonathan Blandford <jrb@redhat.com>,
* Gene Z. Ragan <gzr@eazel.com>,
* Bradford Hovinen <hovinen@ximian.com>
*/
2002-01-08 21:25:33 +00:00
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
2002-01-08 21:25:33 +00:00
#include <gnome.h>
#include <glade/glade.h>
#include <gconf/gconf-client.h>
2002-01-08 21:25:33 +00:00
#include "mime-types-model.h"
#include "mime-edit-dialog.h"
Implement. Mostly a copy from the corresponding function in 2002-01-14 Bradford Hovinen <hovinen@ximian.com> * mime-category-edit-dialog.c (populate_application_list): Implement. Mostly a copy from the corresponding function in mime-edit-dialog.c * mime-types-model.c (get_insertion_point): Make this public (find_supported_apps_for_category, reduce_supported_app_list) (intersect_lists, find_possible_supported_apps): Implement * mime-edit-dialog.c (fill_dialog): Fill category_entry (choose_cat_cb): Implement (mime_edit_dialog_init): Connect choose_button to choose_cat_cb * mime-type-info.c (mime_type_info_load): Load category name (mime_type_info_save): Call reinsert_iter to affect category name change * mime-types-model.c (mime_types_model_new): Add parameter is_category_select; TRUE iff this model should be only for selecting a category and not list the actual file types or Internet services (get_category_name): Implement * mime-edit-dialog.c (mime_edit_dialog_init): Add category_label to first size group 2002-01-13 Bradford Hovinen <hovinen@ximian.com> * file-types-capplet.c (edit_cb, row_activated_cb): Don't try to create a category edit dialog if this is the Internet Services category (count_cb): Only count other than internet services category * mime-types-model.c (model_entry_is_category): Implement (model_entry_is_protocol): Use categories[INTERNET_SERVICES_IDX] rather than string (model_entry_is_internet_services_category): Implement * Makefile.am (gnome_file_types_properties_SOURCES): Add mime-category-edit-dialog.[ch] * file-types-capplet.c (edit_cb): Construct a category edit dialog if the tree iterator has children (row_activated_cb): Ditto
2002-01-14 15:28:36 +00:00
#include "mime-category-edit-dialog.h"
2002-01-08 21:25:33 +00:00
#include "mime-type-info.h"
#include "service-edit-dialog.h"
#include "service-info.h"
2002-01-08 21:25:33 +00:00
#define WID(x) (glade_xml_get_widget (dialog, x))
static void
add_mime_cb (GtkButton *button, GladeXML *dialog)
{
GtkTreeView *treeview;
GtkTreeModel *model;
2002-01-08 21:25:33 +00:00
GObject *add_dialog;
treeview = GTK_TREE_VIEW (WID ("mime_types_tree"));
model = gtk_tree_view_get_model (treeview);
add_dialog = mime_add_dialog_new (model);
}
static void
add_service_cb (GtkButton *button, GladeXML *dialog)
{
GtkTreeView *treeview;
GtkTreeModel *model;
GObject *add_dialog;
treeview = GTK_TREE_VIEW (WID ("mime_types_tree"));
model = gtk_tree_view_get_model (treeview);
add_dialog = service_add_dialog_new (model);
}
static GObject *
launch_edit_dialog (GtkTreeModel *model, GtkTreeIter *iter)
{
ModelEntry *entry;
entry = MODEL_ENTRY_FROM_ITER (iter);
switch (entry->type) {
case MODEL_ENTRY_MIME_TYPE:
return mime_edit_dialog_new (model, MIME_TYPE_INFO (entry));
case MODEL_ENTRY_SERVICE:
return service_edit_dialog_new (model, SERVICE_INFO (entry));
case MODEL_ENTRY_CATEGORY:
return mime_category_edit_dialog_new (model, MIME_CATEGORY_INFO (entry));
default:
return NULL;
}
}
static void
2002-01-08 21:25:33 +00:00
edit_cb (GtkButton *button, GladeXML *dialog)
{
2002-01-08 21:25:33 +00:00
GtkTreeView *treeview;
GtkTreeModel *model;
GtkTreeSelection *selection;
GtkTreeIter iter;
2002-01-08 21:25:33 +00:00
treeview = GTK_TREE_VIEW (WID ("mime_types_tree"));
selection = gtk_tree_view_get_selection (treeview);
gtk_tree_selection_get_selected (selection, &model, &iter);
launch_edit_dialog (model, &iter);
}
static void
row_activated_cb (GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, GladeXML *dialog)
{
GtkTreeModel *model;
GtkTreeIter iter;
model = gtk_tree_view_get_model (view);
gtk_tree_model_get_iter (model, &iter, path);
launch_edit_dialog (model, &iter);
}
static void
edit_count_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gint *count)
{
if (MODEL_ENTRY_FROM_ITER (iter)->type != MODEL_ENTRY_SERVICES_CATEGORY)
Implement. Mostly a copy from the corresponding function in 2002-01-14 Bradford Hovinen <hovinen@ximian.com> * mime-category-edit-dialog.c (populate_application_list): Implement. Mostly a copy from the corresponding function in mime-edit-dialog.c * mime-types-model.c (get_insertion_point): Make this public (find_supported_apps_for_category, reduce_supported_app_list) (intersect_lists, find_possible_supported_apps): Implement * mime-edit-dialog.c (fill_dialog): Fill category_entry (choose_cat_cb): Implement (mime_edit_dialog_init): Connect choose_button to choose_cat_cb * mime-type-info.c (mime_type_info_load): Load category name (mime_type_info_save): Call reinsert_iter to affect category name change * mime-types-model.c (mime_types_model_new): Add parameter is_category_select; TRUE iff this model should be only for selecting a category and not list the actual file types or Internet services (get_category_name): Implement * mime-edit-dialog.c (mime_edit_dialog_init): Add category_label to first size group 2002-01-13 Bradford Hovinen <hovinen@ximian.com> * file-types-capplet.c (edit_cb, row_activated_cb): Don't try to create a category edit dialog if this is the Internet Services category (count_cb): Only count other than internet services category * mime-types-model.c (model_entry_is_category): Implement (model_entry_is_protocol): Use categories[INTERNET_SERVICES_IDX] rather than string (model_entry_is_internet_services_category): Implement * Makefile.am (gnome_file_types_properties_SOURCES): Add mime-category-edit-dialog.[ch] * file-types-capplet.c (edit_cb): Construct a category edit dialog if the tree iterator has children (row_activated_cb): Ditto
2002-01-14 15:28:36 +00:00
(*count)++;
}
static void
remove_count_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gint *count)
{
if (MODEL_ENTRY_FROM_ITER (iter)->type != MODEL_ENTRY_SERVICES_CATEGORY &&
MODEL_ENTRY_FROM_ITER (iter)->type != MODEL_ENTRY_CATEGORY)
(*count)++;
}
static void
selection_changed_cb (GtkTreeSelection *selection, GladeXML *dialog)
{
gint count = 0;
gtk_tree_selection_selected_foreach (selection, (GtkTreeSelectionForeachFunc) edit_count_cb, &count);
if (count == 0)
gtk_widget_set_sensitive (WID ("edit_button"), FALSE);
else
gtk_widget_set_sensitive (WID ("edit_button"), TRUE);
count = 0;
gtk_tree_selection_selected_foreach (selection, (GtkTreeSelectionForeachFunc) remove_count_cb, &count);
if (count == 0)
gtk_widget_set_sensitive (WID ("remove_button"), FALSE);
else
gtk_widget_set_sensitive (WID ("remove_button"), TRUE);
}
static void
2002-01-08 21:25:33 +00:00
remove_cb (GtkButton *button, GladeXML *dialog)
{
2002-01-08 21:25:33 +00:00
GtkTreeView *treeview;
GtkTreeModel *model;
GtkTreeSelection *selection;
GtkTreeIter iter;
ModelEntry *entry;
2002-01-08 21:25:33 +00:00
treeview = GTK_TREE_VIEW (WID ("mime_types_tree"));
selection = gtk_tree_view_get_selection (treeview);
gtk_tree_selection_get_selected (selection, &model, &iter);
entry = MODEL_ENTRY_FROM_ITER (&iter);
model_entry_remove_child (entry->parent, entry, model);
model_entry_delete (entry);
selection_changed_cb (selection, dialog);
}
static void
cb_file_type_dialog_response (GtkDialog *dialog, gint response_id)
{
if (response_id == GTK_RESPONSE_HELP) {
GError *error = NULL;
/* TODO : get this written */
gnome_help_display_desktop (NULL,
"control-center-manual",
"config-file-type.xml",
"CONFIGURATION", &error);
if (error) {
g_warning ("help error: %s\n", error->message);
g_error_free (error);
}
} else
gtk_main_quit ();
}
2002-01-08 21:25:33 +00:00
static GladeXML *
create_dialog (void)
{
2002-01-08 21:25:33 +00:00
GladeXML *dialog;
2002-01-08 21:25:33 +00:00
GtkTreeModel *model;
reviewed by: Sullivan 2000-11-17 Mathieu Lacage <mathieu@eazel.com> reviewed by: Sullivan fix Bug 4768. Reported 3 bugs about separate issues: 4796, 4797, 4798. * data/mime/gnome-vfs.keys: change icon filenames to relative paths. * libgnomevfs/Makefile.am: add GNOME_VFS_PREFIX * libgnomevfs/gnome-vfs-mime-info.c: (gnome_vfs_mime_info_reload): add initialition code if the mime stuff is not initalized when doing a reload. This avoids a segfault. * libgnomevfs/gnome-vfs-utils.c: (hack_file_exists): new function copied from gnome-libs: prviously named g_file_exists. (gnome_vfs_icon_path_from_filename): new API function. It looks in GNOME_PATH to find the icons and defaults to the gnome-vfs prefix one. It accepts only relative paths and returns an absolute path. * libgnomevfs/gnome-vfs-utils.h: add prototype. * mime-type-capplet/nautilus-mime-type-capplet.c: (really_change_icon), changes the icon used by a mime type. (gil_icon_selected_cb): changes the icon when you double-click. (change_icon_clicked_cb_real): changes the icon when you click on ok. (change_icon_clicked): connect to the clicked and select_icon signals to know when the user has made up his mind about hte new icon. (nautilus_mime_type_capplet_update_info), spaces. (add_mime_clicked): spaces. (nautilus_mime_type_capplet_update_mime_list_icon): spaces. (capplet_get_icon_pixbuf): spaces. (populate_mime_list): spaces. * mime-type-capplet/nautilus-mime-type-icon-entry.c: (icon_selected_cb): spaces. (nautilus_mime_type_show_icon_selection): spaces. (nautilus_mime_type_icon_entry_get_relative_filename): new function. returns a relative filename instead of an abosulte one. * mime-type-capplet/nautilus-mime-type-icon-entry.h: add relative function prototype
2000-11-17 23:15:20 +00:00
2002-01-08 21:25:33 +00:00
GtkWidget *treeview;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkTreeSelection *selection;
2002-01-08 21:25:33 +00:00
dialog = glade_xml_new (GNOMECC_DATA_DIR "/interfaces/file-types-properties.glade", "main_dialog", NULL);
model = GTK_TREE_MODEL (mime_types_model_new (FALSE));
2002-01-08 21:25:33 +00:00
treeview = WID ("mime_types_tree");
2002-01-08 21:25:33 +00:00
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), model);
Work in progress on the FIle Types and Programs Capplet Removed obsolete 2000-06-15 Gene Z. Ragan <gzr@eazel.com> Work in progress on the FIle Types and Programs Capplet * mime-type-capplet/Makefile.am: Removed obsolete files form build. * mime-type-capplet/edit-window.c: * mime-type-capplet/edit-window.h: Obsolete. Removed. * mime-type-capplet/new-mime-window.c: * mime-type-capplet/new-mime-window.h: Obsolete. Removed. * mime-type-capplet/mime-data.c: (add_mime_vals_to_clist), (selected_row_callback): * mime-type-capplet/nautilus-mime-type-capplet-dialogs.c: * mime-type-capplet/nautilus-mime-type-capplet-dialogs.h: (edit_applications_dialog_destroy), (application_is_in_list), (application_button_toggled_callback), (populate_default_applications_box), (populate_default_components_box), (initialize_edit_applications_dialog), (show_edit_applications_dialog), (show_edit_components_dialog), (nautilus_mime_type_capplet_show_new_mime_window), (nautilus_mime_type_capplet_show_new_extension_window): * mime-type-capplet/nautilus-mime-type-capplet.c: * mime-type-capplet/nautilus-mime-type-capplet.h: (revert_callback), (populate_extension_list), (nautilus_mime_type_capplet_add_extension), (add_extension_clicked), (remove_extension), (extension_list_selected), (extension_list_deselected), (init_mime_capplet), (nautilus_mime_type_capplet_update_info), (add_mime_clicked), (edit_components_clicked), (nautilus_mime_type_capplet_update_application_info), (nautilus_mime_type_capplet_update_component_info):
2000-06-15 23:32:08 +00:00
/* Icon/description column */
column = gtk_tree_view_column_new ();
2002-01-08 21:25:33 +00:00
renderer = gtk_cell_renderer_pixbuf_new ();
gtk_tree_view_column_pack_start (column, renderer, FALSE);
gtk_tree_view_column_set_attributes
(column, renderer, "pixbuf", MODEL_COLUMN_ICON, NULL);
Work in progress on the FIle Types and Programs Capplet Removed obsolete 2000-06-15 Gene Z. Ragan <gzr@eazel.com> Work in progress on the FIle Types and Programs Capplet * mime-type-capplet/Makefile.am: Removed obsolete files form build. * mime-type-capplet/edit-window.c: * mime-type-capplet/edit-window.h: Obsolete. Removed. * mime-type-capplet/new-mime-window.c: * mime-type-capplet/new-mime-window.h: Obsolete. Removed. * mime-type-capplet/mime-data.c: (add_mime_vals_to_clist), (selected_row_callback): * mime-type-capplet/nautilus-mime-type-capplet-dialogs.c: * mime-type-capplet/nautilus-mime-type-capplet-dialogs.h: (edit_applications_dialog_destroy), (application_is_in_list), (application_button_toggled_callback), (populate_default_applications_box), (populate_default_components_box), (initialize_edit_applications_dialog), (show_edit_applications_dialog), (show_edit_components_dialog), (nautilus_mime_type_capplet_show_new_mime_window), (nautilus_mime_type_capplet_show_new_extension_window): * mime-type-capplet/nautilus-mime-type-capplet.c: * mime-type-capplet/nautilus-mime-type-capplet.h: (revert_callback), (populate_extension_list), (nautilus_mime_type_capplet_add_extension), (add_extension_clicked), (remove_extension), (extension_list_selected), (extension_list_deselected), (init_mime_capplet), (nautilus_mime_type_capplet_update_info), (add_mime_clicked), (edit_components_clicked), (nautilus_mime_type_capplet_update_application_info), (nautilus_mime_type_capplet_update_component_info):
2000-06-15 23:32:08 +00:00
2002-01-08 21:25:33 +00:00
/* Description column */
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (column, renderer, FALSE);
gtk_tree_view_column_set_attributes
(column, renderer, "text", MODEL_COLUMN_DESCRIPTION, NULL);
gtk_tree_view_column_set_title (column, _("Description"));
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
gtk_tree_view_set_expander_column (GTK_TREE_VIEW (treeview), column);
2002-01-08 21:25:33 +00:00
/* Extensions column */
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_insert_column_with_attributes
(GTK_TREE_VIEW (treeview), -1, _("Extensions"), renderer,
"text", MODEL_COLUMN_FILE_EXT,
2002-01-08 21:25:33 +00:00
NULL);
gtk_widget_set_sensitive (WID ("edit_button"), FALSE);
gtk_widget_set_sensitive (WID ("remove_button"), FALSE);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
g_signal_connect (G_OBJECT (WID ("add_mime_button")), "clicked", (GCallback) add_mime_cb, dialog);
g_signal_connect (G_OBJECT (WID ("add_service_button")), "clicked", (GCallback) add_service_cb, dialog);
2002-01-08 21:25:33 +00:00
g_signal_connect (G_OBJECT (WID ("edit_button")), "clicked", (GCallback) edit_cb, dialog);
g_signal_connect (G_OBJECT (WID ("remove_button")), "clicked", (GCallback) remove_cb, dialog);
g_signal_connect (G_OBJECT (selection), "changed", (GCallback) selection_changed_cb, dialog);
g_signal_connect (G_OBJECT (WID ("mime_types_tree")), "row-activated", (GCallback) row_activated_cb, dialog);
g_signal_connect (G_OBJECT (WID ("main_dialog")),
"response",
G_CALLBACK (cb_file_type_dialog_response), NULL);
return dialog;
Removed obsolete files. 2000-06-19 Gene Z. Ragan <gzr@eazel.com> * mime-type-capplet/mime-data.c: * mime-type-capplet/mime-data.h: Removed obsolete files. * mime-type-capplet/Makefile.am: Removed above files from Makefile. * libgnomevfs/gnome-vfs-mime-handlers.c: * libgnomevfs/gnome-vfs-mime-handlers.h: (gnome_vfs_mime_add_extension_to_mime_type): New function. Add extension mapping to named mime type and save to .mime file. * libgnomevfs/gnome-vfs-mime-info.c: * libgnomevfs/gnome-vfs-mime-info.h: (load_mime_list_info_from), (load_mime_type_info), (gnome_vfs_mime_get_extensions), (gnome_vfs_mime_extension_list_free): New function to deep free the list returned by gnome_vfs_mime_get_extensions() (gnome_vfs_mime_registered_mime_type_list_free), New function to deep free the list returned by gnome_vfs_mime_get_extensions() (gnome_vfs_mime_commit_registered_types): Public function to commit internal hash table of mime data to disk. (gnome_vfs_mime_set_registered_type_key): This functions sets the key data for the registered mime type's hash table. (write_mime_data_foreach), (write_mime_data): New functions to write out mime data from hash table. * mime-type-capplet/nautilus-mime-type-capplet-dialogs.c: (nautilus_mime_type_capplet_show_new_mime_window), (nautilus_mime_type_capplet_show_new_extension_window): Clean up work on dialogs. * mime-type-capplet/nautilus-mime-type-capplet.c: (ok_callback), (populate_extension_list), (nautilus_mime_type_capplet_add_extension), (remove_extension_clicked), (init_mime_capplet), (delete_mime_clicked), (create_mime_list_and_scroller), (get_selected_item_mime_type): Clean up work on main capplet view.
2000-06-19 23:12:18 +00:00
}
static void
dialog_done_cb (MimeEditDialog *dialog, gboolean done, MimeTypeInfo *info)
{
if (done)
mime_type_info_save (info);
gtk_main_quit ();
}
2002-01-08 21:25:33 +00:00
int
main (int argc, char **argv)
{
gchar *mime_type;
GtkTreeModel *model;
MimeTypeInfo *info = NULL;
GObject *mime_dialog;
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
if (argc >= 1)
mime_type = g_strdup (argv[1]);
else
mime_type = NULL;
2002-01-08 21:25:33 +00:00
gnome_program_init ("gnome-file-types-properties", VERSION, LIBGNOMEUI_MODULE, argc, argv, NULL);
if (mime_type == NULL) {
GladeXML *dialog = create_dialog ();
gtk_widget_show_all (WID ("main_dialog"));
} else {
model = GTK_TREE_MODEL (mime_types_model_new (FALSE));
info = mime_type_info_new (mime_type, model);
mime_dialog = mime_edit_dialog_new (model, info);
g_signal_connect (mime_dialog, "done", (GCallback) dialog_done_cb, info);
}
2002-01-08 21:25:33 +00:00
gtk_main ();
2002-01-08 21:25:33 +00:00
return 0;
}