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

310 lines
8.8 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>
#include "capplet-util.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"
static void
add_mime_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 = mime_add_dialog_new (model,
GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))),
NULL);
}
static void
add_service_cb (GtkButton *button, GladeXML *dialog)
{
GtkTreeView *treeview;
GtkTreeModel *model;
treeview = GTK_TREE_VIEW (WID ("mime_types_tree"));
model = gtk_tree_view_get_model (treeview);
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));
#if 0
case MODEL_ENTRY_CATEGORY:
return mime_category_edit_dialog_new (model, MIME_CATEGORY_INFO (entry));
#endif
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
selection_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) selection_count_cb, &count);
gtk_widget_set_sensitive (WID ("edit_button"), count != 0);
gtk_widget_set_sensitive (WID ("remove_button"), count != 0);
}
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)
capplet_help (GTK_WINDOW (dialog),
"wgoscustlookandfeel.xml",
"goscustdoc-7");
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-07-10 21:45:45 +00:00
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_column_set_title (column, _("Description"));
2002-01-08 21:25:33 +00:00
renderer = gtk_cell_renderer_pixbuf_new ();
gtk_tree_view_column_pack_start (column, renderer, FALSE);
2002-07-10 21:45:45 +00:00
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);
http://bugzilla.gnome.org/show_bug.cgi?id=85397 2002-06-15 Jody Goldberg <jody@gnome.org> http://bugzilla.gnome.org/show_bug.cgi?id=85397 http://bugzilla.gnome.org/show_bug.cgi?id=84545 * mime-types-model.c (mime_types_model_get_value) : gtk_tree_view_search_equal_func does not like NULL. (IS_CATEGORY) : check for NULL. * file-types-capplet.c (create_dialog) : search the description not the mime type. 2002-06-08 Jody Goldberg <jody@gnome.org> * mime-types-model.c (IS_CATEGORY) : test for null in case we are stupid. 2002-06-07 Jody Goldberg <jody@gnome.org> * file-types-capplet.c (dialog_done_cb) : no need to save things again. The only caller had already done that. * mime-type-info.c (mime_type_info_save) : Don't mess with the application here, it should already be setup. However, be really really anal about verifying it because I do not trust the surrounding code or know it well enough to trust it. Make sure that the assigned app is on the short list of associated apps. * mime-category-edit-dialog.c (store_data) : Use mime_edit_dialog_get_app. * mime-edit-dialog.c (store_data) : Use it here too. (mime_edit_dialog_get_app) : new. split some duplicated code out of the type and category dialogs and move it here. Then make it readable and less stupid about creating copies of existing applications. While we're at it have it handle the creation of new applications, merging commands with existing applications and other useful stuff. 2002-06-07 Jody Goldberg <jody@gnome.org> * mime-category-edit-dialog.c (store_data) : clarify and remove the custom flag. * mime-type-info.c (mime_category_info_using_custom_app) : delete. (mime_type_info_using_custom_app) : delete. * mime-edit-dialog.c (validate_data) : correct the warning about invalid type, we would _not_ create one for the user :-( Allow a user to optionally overwrite an existing mime type. This is useful when editing. * mime-edit-dialog.c (store_data) : clarify and remove the custom flag. 2002-06-10 Jody Goldberg <jody@gnome.org> * accessibility-keyboard.c : tweak the layout as requested and adjust the max slowkey delay to 500 to avoid losing the keyboard due to some sort of an X problem. 2002-06-13 Jody Goldberg <jody@gnome.org> * gnome-keyboard-properties.c (accessibility_button_clicked) : produce a better warning for failure to launch the keyboard accessibility capplet.
2002-06-18 18:55:14 +00:00
g_object_set (G_OBJECT (treeview),
"search_column", MODEL_COLUMN_DESCRIPTION,
NULL);
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 */
2002-07-10 21:45:45 +00:00
column = gtk_tree_view_column_new ();
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_column_set_title (column, _("Extensions"));
2002-01-08 21:25:33 +00:00
renderer = gtk_cell_renderer_text_new ();
2002-07-10 21:45:45 +00:00
gtk_tree_view_column_pack_start (column, renderer, TRUE);
gtk_tree_view_column_set_attributes
(column, renderer, "text", MODEL_COLUMN_FILE_EXT, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
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)
{
gtk_main_quit ();
}
2002-01-08 21:25:33 +00:00
int
main (int argc, char **argv)
{
char const *mime_type = NULL;
char const *file_name = NULL;
GtkTreeModel *model;
GnomeProgram *program;
poptContext popt_ctxt = 0;
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
program = gnome_program_init ("gnome-file-types-properties",
VERSION, LIBGNOMEUI_MODULE,
argc, argv,
NULL);
g_object_get (G_OBJECT (program),
GNOME_PARAM_POPT_CONTEXT, &popt_ctxt,
NULL);
if (popt_ctxt) {
const gchar **startup_files = poptGetArgs (popt_ctxt);
if (startup_files != NULL) {
mime_type = startup_files [0];
if (mime_type != NULL)
file_name = startup_files [1];
}
}
if (mime_type == NULL) {
GladeXML *dialog = create_dialog ();
GtkWidget *mime_dialog = WID ("main_dialog");
gtk_dialog_set_default_response (GTK_DIALOG (mime_dialog),
GTK_RESPONSE_CLOSE);
capplet_set_icon (mime_dialog, "gnome-ccmime.png");
gtk_widget_show_all (mime_dialog);
} else {
2002-07-10 21:45:45 +00:00
MimeTypeInfo *info = NULL;
GObject *mime_dialog;
2002-07-10 21:45:45 +00:00
model = GTK_TREE_MODEL (mime_types_model_new (FALSE));
if (strcmp (GNOME_VFS_MIME_TYPE_UNKNOWN, mime_type)) {
info = mime_type_info_new (mime_type, model);
mime_dialog = mime_edit_dialog_new (model, info);
2002-07-10 21:45:45 +00:00
} else
mime_dialog = mime_add_dialog_new (model, NULL, file_name);
g_signal_connect (mime_dialog,
2002-07-10 21:45:45 +00:00
"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;
}