Work in progress on the File Types and Program capplet
2000-06-13 Gene Z. Ragan <gzr@eazel.com> Work in progress on the File Types and Program capplet * mime-type-capplet/edit-window.c: (initialize_main_win): * mime-type-capplet/mime-data.c: (get_priority), (add_to_key), (mime_fill_from_file), (add_mime_vals_to_clist), (selected_row_callback), (create_mime_clist), (add_new_mime_type): * mime-type-capplet/mime-data.h: * mime-type-capplet/nautilus-mime-type-capplet.c: (init_mime_capplet), (nautilus_mime_type_capplet_update_info), (populate_application_menu), (populate_component_menu), (free_mime_info), (delete_mime_clicked), (add_mime_clicked), (edit_applications_clicked), (edit_components_clicked):
This commit is contained in:
parent
c2d296c095
commit
53ce9946a6
6 changed files with 500 additions and 157 deletions
|
@ -75,6 +75,7 @@ entry_changed (GtkWidget *widget, gpointer data)
|
|||
capplet_widget_state_changed (CAPPLET_WIDGET (capplet),
|
||||
TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
ext_clist_selected (GtkWidget *clist, gint row, gint column, gpointer data)
|
||||
{
|
||||
|
@ -165,7 +166,7 @@ initialize_main_win ()
|
|||
{
|
||||
GtkWidget *align, *vbox, *hbox, *vbox2, *vbox3;
|
||||
GtkWidget *frame, *table, *label;
|
||||
|
||||
|
||||
gchar *title[2] = {"Extensions"};
|
||||
|
||||
main_win = g_new0 (edit_window, 1);
|
||||
|
@ -180,81 +181,70 @@ initialize_main_win ()
|
|||
NULL);
|
||||
vbox = GNOME_DIALOG (main_win->window)->vbox;
|
||||
|
||||
/* icon box */
|
||||
main_win->icon_entry = gnome_icon_entry_new ("mime_icon_entry", _("Select an icon..."));
|
||||
align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
|
||||
gtk_container_add (GTK_CONTAINER (align), main_win->icon_entry);
|
||||
gtk_signal_connect (GTK_OBJECT (gnome_icon_entry_gtk_entry (GNOME_ICON_ENTRY (main_win->icon_entry))),
|
||||
"changed",
|
||||
entry_changed,
|
||||
NULL);
|
||||
|
||||
|
||||
/* Main vertical box */
|
||||
gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
|
||||
|
||||
/* Create and add mime type label */
|
||||
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Mime Type: ")), FALSE, FALSE, 0);
|
||||
main_win->mime_type = gtk_label_new ("");
|
||||
gtk_box_pack_start (GTK_BOX (hbox), main_win->mime_type, FALSE, FALSE, 0);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
|
||||
|
||||
/* extension/regexp */
|
||||
/* Main horizontal box */
|
||||
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
|
||||
|
||||
/* Icon Control */
|
||||
vbox2 = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0);
|
||||
|
||||
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
|
||||
main_win->icon_entry = gnome_icon_entry_new ("mime_icon_entry", _("Select an icon..."));
|
||||
gtk_signal_connect (GTK_OBJECT (gnome_icon_entry_gtk_entry (GNOME_ICON_ENTRY (main_win->icon_entry))),
|
||||
"changed",
|
||||
entry_changed,
|
||||
NULL);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), main_win->icon_entry, FALSE, FALSE, 0);
|
||||
|
||||
/* Extension List */
|
||||
main_win->ext_clist = gtk_clist_new_with_titles (1, title);
|
||||
gtk_clist_column_titles_passive (GTK_CLIST (main_win->ext_clist));
|
||||
gtk_clist_set_auto_sort (GTK_CLIST (main_win->ext_clist), TRUE);
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_clist),
|
||||
"select-row",
|
||||
GTK_SIGNAL_FUNC (ext_clist_selected),
|
||||
NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_clist),
|
||||
"unselect-row",
|
||||
GTK_SIGNAL_FUNC (ext_clist_deselected),
|
||||
NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_clist), "select-row",
|
||||
GTK_SIGNAL_FUNC (ext_clist_selected), NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_clist), "unselect-row",
|
||||
GTK_SIGNAL_FUNC (ext_clist_deselected), NULL);
|
||||
main_win->ext_scroll = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (main_win->ext_scroll),
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC);
|
||||
gtk_container_add (GTK_CONTAINER (main_win->ext_scroll),
|
||||
main_win->ext_clist);
|
||||
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
||||
gtk_container_add (GTK_CONTAINER (main_win->ext_scroll), main_win->ext_clist);
|
||||
|
||||
/* Extension Buttons */
|
||||
vbox3 = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
|
||||
main_win->ext_add_button = gtk_button_new_with_label (_("Add"));
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_add_button),
|
||||
"clicked",
|
||||
GTK_SIGNAL_FUNC (add_extension),
|
||||
NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_add_button), "clicked",
|
||||
GTK_SIGNAL_FUNC (add_extension), NULL);
|
||||
gtk_box_pack_start (GTK_BOX (vbox3), main_win->ext_add_button, FALSE, FALSE, 0);
|
||||
gtk_widget_set_sensitive (main_win->ext_add_button, FALSE);
|
||||
|
||||
main_win->ext_remove_button = gtk_button_new_with_label (_("Remove"));
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_remove_button),
|
||||
"clicked",
|
||||
GTK_SIGNAL_FUNC (remove_extension),
|
||||
NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_remove_button), "clicked",
|
||||
GTK_SIGNAL_FUNC (remove_extension), NULL);
|
||||
gtk_widget_set_sensitive (main_win->ext_remove_button, FALSE);
|
||||
gtk_box_pack_start (GTK_BOX (vbox3), main_win->ext_remove_button,
|
||||
FALSE, FALSE, 0);
|
||||
gtk_box_pack_start (GTK_BOX (vbox3), main_win->ext_remove_button, FALSE, FALSE, 0);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (hbox), main_win->ext_scroll, TRUE, TRUE, 0);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), vbox3, FALSE, FALSE, 0);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);
|
||||
|
||||
/* Extension entry box */
|
||||
main_win->ext_entry = gtk_entry_new ();
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_entry),
|
||||
"changed",
|
||||
ext_entry_changed,
|
||||
NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_entry),
|
||||
"activate",
|
||||
add_extension,
|
||||
NULL);
|
||||
gtk_box_pack_start (GTK_BOX (vbox2), main_win->ext_entry, TRUE, TRUE, 0);
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_entry), "changed", ext_entry_changed, NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (main_win->ext_entry), "activate", add_extension, NULL);
|
||||
gtk_box_pack_start (GTK_BOX (vbox3), main_win->ext_entry, FALSE, FALSE, 0);
|
||||
|
||||
/* Defaults box */
|
||||
frame = gtk_frame_new (NULL);
|
||||
|
@ -266,14 +256,14 @@ initialize_main_win ()
|
|||
gtk_container_add (GTK_CONTAINER (frame), vbox2);
|
||||
|
||||
/* Default application label and menu */
|
||||
label = gtk_label_new (_("Default Application:"));
|
||||
label = gtk_label_new (_("Application:"));
|
||||
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
|
||||
|
||||
main_win->application_menu = gtk_option_menu_new();
|
||||
gtk_table_attach_defaults (GTK_TABLE (table), main_win->application_menu, 1, 2, 0, 1);
|
||||
|
||||
/* Default component label and menu */
|
||||
label = gtk_label_new (_("Default Component:"));
|
||||
label = gtk_label_new (_("Component:"));
|
||||
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
|
||||
|
||||
main_win->component_menu = gtk_option_menu_new();
|
||||
|
|
|
@ -1,30 +1,72 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
|
||||
/* Copyright (C) 1998 Redhat Software Inc.
|
||||
* Authors: Jonathan Blandford <jrb@redhat.com>
|
||||
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
|
||||
|
||||
/* nautilus-mime-type-capplet.h
|
||||
*
|
||||
* Copyright (C) 1998 Redhat Software Inc.
|
||||
* Copyright (C) 2000 Free Software Foundaton
|
||||
* Copyright (C) 2000 Eazel, 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.
|
||||
*
|
||||
* Authors: Jonathan Blandford <jrb@redhat.com>
|
||||
* Gene Z. Ragan <gzr@eazel.com>
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "capplet-widget.h"
|
||||
#include "gnome.h"
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h>
|
||||
#include <dirent.h>
|
||||
#include <regex.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <libgnomevfs/gnome-vfs-mime-handlers.h>
|
||||
#include <libgnomevfs/gnome-vfs-mime-info.h>
|
||||
|
||||
#include "capplet-widget.h"
|
||||
#include "gnome.h"
|
||||
#include "mime-data.h"
|
||||
#include "mime-info.h"
|
||||
#include "edit-window.h"
|
||||
#include "new-mime-window.h"
|
||||
|
||||
/* Prototypes */
|
||||
static void try_callback ();
|
||||
static void revert_callback ();
|
||||
static void ok_callback ();
|
||||
static void cancel_callback ();
|
||||
#include "nautilus-mime-type-capplet.h"
|
||||
|
||||
|
||||
/* Local Prototypes */
|
||||
static void populate_application_menu (GtkWidget *menu, const char *mime_string);
|
||||
static void populate_component_menu (GtkWidget *menu, const char *mime_string);
|
||||
static void delete_mime_clicked (GtkWidget *widget, gpointer data);
|
||||
static void add_mime_clicked (GtkWidget *widget, gpointer data);
|
||||
static void edit_applications_clicked (GtkWidget *widget, gpointer data);
|
||||
static void edit_components_clicked (GtkWidget *widget, gpointer data);
|
||||
|
||||
static void try_callback ();
|
||||
static void revert_callback ();
|
||||
static void ok_callback ();
|
||||
static void cancel_callback ();
|
||||
#if 0
|
||||
static void help_callback ();
|
||||
static void help_callback ();
|
||||
#endif
|
||||
|
||||
/* Global variables */
|
||||
GtkWidget *capplet = NULL;
|
||||
GtkWidget *delete_button = NULL;
|
||||
GtkWidget *icon_entry, *extension_list, *mime_list;
|
||||
GtkWidget *application_menu, *component_menu;
|
||||
|
||||
|
||||
static GtkWidget *
|
||||
left_aligned_button (gchar *label)
|
||||
|
@ -77,31 +119,109 @@ help_callback ()
|
|||
static void
|
||||
init_mime_capplet ()
|
||||
{
|
||||
GtkWidget *vbox;
|
||||
GtkWidget *hbox;
|
||||
GtkWidget *main_vbox;
|
||||
GtkWidget *vbox, *hbox;
|
||||
GtkWidget *button;
|
||||
GtkWidget *info_frame;
|
||||
GtkWidget *label;
|
||||
GtkWidget *fixed;
|
||||
GtkWidget *icon_entry;
|
||||
GtkWidget *mime_list_container;
|
||||
GList *children, *child;
|
||||
|
||||
gchar *title[2] = {"Extensions"};
|
||||
|
||||
capplet = capplet_widget_new ();
|
||||
delete_button = left_aligned_button (_("Delete"));
|
||||
gtk_signal_connect (GTK_OBJECT (delete_button), "clicked",
|
||||
delete_clicked, NULL);
|
||||
|
||||
|
||||
/* Main vertical box */
|
||||
main_vbox = gtk_vbox_new (FALSE, GNOME_PAD);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), GNOME_PAD_SMALL);
|
||||
gtk_container_add (GTK_CONTAINER (capplet), main_vbox);
|
||||
|
||||
|
||||
/* Main horizontal box and mime list*/
|
||||
hbox = gtk_hbox_new (FALSE, GNOME_PAD);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
|
||||
gtk_container_add (GTK_CONTAINER (capplet), hbox);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), get_mime_clist (), TRUE, TRUE, 0);
|
||||
vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
|
||||
gtk_box_pack_start (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 0);
|
||||
mime_list_container = create_mime_clist ();
|
||||
gtk_box_pack_start (GTK_BOX (hbox), mime_list_container, TRUE, TRUE, 0);
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
|
||||
|
||||
/* Set up info frame */
|
||||
info_frame = gtk_frame_new ("Info");
|
||||
gtk_box_pack_end (GTK_BOX (main_vbox), info_frame, FALSE, FALSE, 0);
|
||||
|
||||
fixed = gtk_fixed_new ();
|
||||
gtk_container_add (GTK_CONTAINER (info_frame), fixed);
|
||||
|
||||
/* Create label, menu and edit button for default applications */
|
||||
label = gtk_label_new (_("Default Application:"));
|
||||
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
|
||||
gtk_fixed_put (GTK_FIXED (fixed), label, 10, 5);
|
||||
|
||||
application_menu = gtk_option_menu_new();
|
||||
gtk_fixed_put (GTK_FIXED (fixed), application_menu, 125, 0);
|
||||
gtk_widget_set_usize (application_menu, 150, 25);
|
||||
|
||||
button = left_aligned_button (_("Edit List"));
|
||||
gtk_fixed_put (GTK_FIXED (fixed), button, 285, 1);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked", edit_applications_clicked, NULL);
|
||||
|
||||
/* Create label, menu and edit button for default components */
|
||||
label = gtk_label_new (_("Default Component:"));
|
||||
gtk_fixed_put (GTK_FIXED (fixed), label, 10, 35);
|
||||
|
||||
component_menu = gtk_option_menu_new();
|
||||
gtk_fixed_put (GTK_FIXED (fixed), component_menu, 125, 30);
|
||||
gtk_widget_set_usize (component_menu, 150, 25);
|
||||
|
||||
button = left_aligned_button (_("Edit List"));
|
||||
gtk_fixed_put (GTK_FIXED (fixed), button, 285, 31);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked", edit_components_clicked, NULL);
|
||||
|
||||
/* Add icon box */
|
||||
icon_entry = gnome_icon_entry_new ("mime_icon_entry", _("Select an icon..."));
|
||||
//gtk_signal_connect (GTK_OBJECT (gnome_icon_entry_gtk_entry (GNOME_ICON_ENTRY (main_win->icon_entry))),
|
||||
// "changed",
|
||||
// entry_changed,
|
||||
// NULL);
|
||||
gtk_fixed_put (GTK_FIXED (fixed), icon_entry, 35, 65);
|
||||
|
||||
/* Add extension list and buttons */
|
||||
extension_list = gtk_clist_new_with_titles (1, title);
|
||||
gtk_clist_column_titles_passive (GTK_CLIST (extension_list));
|
||||
gtk_clist_set_auto_sort (GTK_CLIST (extension_list), TRUE);
|
||||
|
||||
//gtk_signal_connect (GTK_OBJECT (main_win->ext_clist), "select-row",
|
||||
// GTK_SIGNAL_FUNC (ext_clist_selected), NULL);
|
||||
//gtk_signal_connect (GTK_OBJECT (main_win->ext_clist), "unselect-row",
|
||||
// GTK_SIGNAL_FUNC (ext_clist_deselected), NULL);
|
||||
gtk_fixed_put (GTK_FIXED (fixed), extension_list, 125, 65);
|
||||
gtk_widget_set_usize (extension_list, 150, 60);
|
||||
|
||||
button = gtk_button_new_with_label (_("Add"));
|
||||
gtk_fixed_put (GTK_FIXED (fixed), button, 285, 70);
|
||||
gtk_widget_set_usize (button, 60, 20);
|
||||
|
||||
button = gtk_button_new_with_label (_("Remove"));
|
||||
gtk_fixed_put (GTK_FIXED (fixed), button, 285, 95);
|
||||
gtk_widget_set_usize (button, 60, 20);
|
||||
|
||||
/* Mime list Add and Delete buttons */
|
||||
button = left_aligned_button (_("Add..."));
|
||||
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
add_clicked, NULL);
|
||||
button = left_aligned_button (_("Edit..."));
|
||||
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
edit_clicked, NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked", add_mime_clicked, NULL);
|
||||
|
||||
delete_button = left_aligned_button (_("Delete"));
|
||||
gtk_signal_connect (GTK_OBJECT (delete_button), "clicked", delete_mime_clicked, NULL);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), delete_button, FALSE, FALSE, 0);
|
||||
|
||||
/* Yes, show all widgets */
|
||||
gtk_widget_show_all (capplet);
|
||||
|
||||
/* Setup capplet signals */
|
||||
gtk_signal_connect(GTK_OBJECT(capplet), "try",
|
||||
GTK_SIGNAL_FUNC(try_callback), NULL);
|
||||
gtk_signal_connect(GTK_OBJECT(capplet), "revert",
|
||||
|
@ -118,8 +238,219 @@ init_mime_capplet ()
|
|||
gtk_signal_connect(GTK_OBJECT(capplet), "help",
|
||||
GTK_SIGNAL_FUNC(help_callback), NULL);
|
||||
#endif
|
||||
|
||||
/* Force list to update menus */
|
||||
children = gtk_container_children (GTK_CONTAINER (mime_list_container));
|
||||
child = g_list_first (children);
|
||||
mime_list = child->data;
|
||||
gtk_clist_select_row (GTK_CLIST (mime_list), 0, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* nautilus_mime_type_capplet_update_info
|
||||
*
|
||||
* Update controls with info based on mime type
|
||||
*/
|
||||
|
||||
void
|
||||
nautilus_mime_type_capplet_update_info (const char *mime_string) {
|
||||
populate_application_menu (application_menu, mime_string);
|
||||
populate_component_menu (component_menu, mime_string);
|
||||
}
|
||||
|
||||
static void
|
||||
populate_application_menu (GtkWidget *application_menu, const char *mime_type)
|
||||
{
|
||||
GtkWidget *new_menu, *menu_item;
|
||||
GList *app_list, *copy_list;
|
||||
GnomeVFSMimeApplication *default_app, *application;
|
||||
gboolean has_none, found_match;
|
||||
char *mime_copy;
|
||||
const char *name;
|
||||
GList *children;
|
||||
int index;
|
||||
|
||||
has_none = TRUE;
|
||||
found_match = FALSE;
|
||||
|
||||
mime_copy = g_strdup (mime_type);
|
||||
|
||||
new_menu = gtk_menu_new ();
|
||||
|
||||
/* Get the default application */
|
||||
default_app = gnome_vfs_mime_get_default_application (mime_type);
|
||||
|
||||
/* Get the application short list */
|
||||
app_list = gnome_vfs_mime_get_short_list_applications (mime_type);
|
||||
for (copy_list = app_list; copy_list != NULL; copy_list = copy_list->next) {
|
||||
has_none = FALSE;
|
||||
|
||||
application = copy_list->data;
|
||||
menu_item = gtk_menu_item_new_with_label (application->name);
|
||||
|
||||
/* Store copy of application name in item; free when item destroyed. */
|
||||
gtk_object_set_data_full (GTK_OBJECT (menu_item),
|
||||
"application",
|
||||
g_strdup (application->name),
|
||||
g_free);
|
||||
|
||||
gtk_menu_append (GTK_MENU (new_menu), menu_item);
|
||||
gtk_widget_show (menu_item);
|
||||
}
|
||||
|
||||
if (app_list != NULL) {
|
||||
gnome_vfs_mime_application_list_free (app_list);
|
||||
app_list = NULL;
|
||||
}
|
||||
|
||||
/* Find all appliactions or add a "None" item */
|
||||
if (has_none && default_app == NULL) {
|
||||
/* Add all applications */
|
||||
app_list = gnome_vfs_mime_get_all_applications (mime_type);
|
||||
for (copy_list = app_list; copy_list != NULL; copy_list = copy_list->next) {
|
||||
has_none = FALSE;
|
||||
|
||||
application = copy_list->data;
|
||||
menu_item = gtk_menu_item_new_with_label (application->name);
|
||||
|
||||
/* Store copy of application name in item; free when item destroyed. */
|
||||
gtk_object_set_data_full (GTK_OBJECT (menu_item),
|
||||
"application",
|
||||
g_strdup (application->name),
|
||||
g_free);
|
||||
|
||||
gtk_menu_append (GTK_MENU (new_menu), menu_item);
|
||||
gtk_widget_show (menu_item);
|
||||
}
|
||||
|
||||
if (app_list != NULL) {
|
||||
gnome_vfs_mime_application_list_free (app_list);
|
||||
app_list = NULL;
|
||||
} else {
|
||||
menu_item = gtk_menu_item_new_with_label (_("None"));
|
||||
gtk_menu_append (GTK_MENU (new_menu), menu_item);
|
||||
gtk_widget_show (menu_item);
|
||||
}
|
||||
|
||||
} else {
|
||||
/* Check and see if default is in the short list */
|
||||
if (default_app != NULL) {
|
||||
/* Iterate */
|
||||
children = gtk_container_children (GTK_CONTAINER (new_menu));
|
||||
for (index = 0; children != NULL; children = children->next, ++index) {
|
||||
name = (const char *)(gtk_object_get_data (GTK_OBJECT (children->data), "application"));
|
||||
if (name != NULL) {
|
||||
if (strcmp (default_app->name, name) == 0) {
|
||||
found_match = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
g_list_free (children);
|
||||
|
||||
/* See if we have a match */
|
||||
if (found_match) {
|
||||
/* Have menu appear with default application selected */
|
||||
gtk_menu_set_active (GTK_MENU (new_menu), index);
|
||||
} else {
|
||||
/* FIXME bugzilla.eazel.com 1221:
|
||||
* What should we do in this case?
|
||||
* */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gtk_option_menu_set_menu (GTK_OPTION_MENU (application_menu), new_menu);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
populate_component_menu (GtkWidget *component_menu, const char *mime_string)
|
||||
{
|
||||
GtkWidget *new_menu;
|
||||
GtkWidget *menu_item;
|
||||
GList *mime_list;
|
||||
gboolean has_none;
|
||||
|
||||
has_none = TRUE;
|
||||
|
||||
new_menu = gtk_menu_new ();
|
||||
|
||||
mime_list = gnome_vfs_mime_get_short_list_components (mime_string);
|
||||
while (mime_list != NULL) {
|
||||
has_none = FALSE;
|
||||
menu_item = gtk_menu_item_new_with_label ("Test Menu Item");
|
||||
gtk_menu_append (GTK_MENU (new_menu), menu_item);
|
||||
gtk_widget_show (menu_item);
|
||||
mime_list = g_list_next (mime_list);
|
||||
}
|
||||
|
||||
/* Add None menu item */
|
||||
if (has_none) {
|
||||
menu_item = gtk_menu_item_new_with_label (_("None"));
|
||||
gtk_menu_append (GTK_MENU (new_menu), menu_item);
|
||||
gtk_widget_show (menu_item);
|
||||
}
|
||||
|
||||
gtk_option_menu_set_menu (GTK_OPTION_MENU (component_menu), new_menu);
|
||||
}
|
||||
|
||||
static void
|
||||
free_mime_info (MimeInfo *mi)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* delete_mime_clicked
|
||||
*
|
||||
* Delete mime type if it is a user defined type.
|
||||
*/
|
||||
|
||||
static void
|
||||
delete_mime_clicked (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
MimeInfo *mi;
|
||||
gint row = 0;
|
||||
|
||||
if (GTK_CLIST (mime_list)->selection)
|
||||
row = GPOINTER_TO_INT ((GTK_CLIST (mime_list)->selection)->data);
|
||||
else
|
||||
return;
|
||||
mi = (MimeInfo *) gtk_clist_get_row_data (GTK_CLIST (mime_list), row);
|
||||
|
||||
gtk_clist_remove (GTK_CLIST (mime_list), row);
|
||||
g_hash_table_remove (user_mime_types, mi->mime_type);
|
||||
remove_mime_info (mi->mime_type);
|
||||
free_mime_info (mi);
|
||||
capplet_widget_state_changed (CAPPLET_WIDGET (capplet),
|
||||
TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
add_mime_clicked (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
launch_new_mime_window ();
|
||||
}
|
||||
|
||||
static void
|
||||
edit_applications_clicked (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
g_message ("edit_applications_clicked");
|
||||
}
|
||||
|
||||
static void
|
||||
edit_components_clicked (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
g_message ("edit_components_clicked");
|
||||
}
|
||||
|
||||
/*
|
||||
* main
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
|
|
|
@ -42,6 +42,8 @@
|
|||
|
||||
#include <libgnomevfs/gnome-vfs-mime-info.h>
|
||||
|
||||
#include "nautilus-mime-type-capplet.h"
|
||||
|
||||
/* Prototypes */
|
||||
static void mime_fill_from_file (const char *filename, gboolean init_user);
|
||||
static void mime_load_from_dir (const char *mime_info_dir, gboolean system_dir);
|
||||
|
@ -57,6 +59,7 @@ GHashTable *user_mime_types = NULL;
|
|||
static GtkWidget *clist = NULL;
|
||||
extern GtkWidget *delete_button;
|
||||
extern GtkWidget *capplet;
|
||||
|
||||
/* Initialization functions */
|
||||
static void
|
||||
run_error (gchar *message)
|
||||
|
@ -91,11 +94,7 @@ get_priority (char *def, int *priority)
|
|||
|
||||
return def;
|
||||
}
|
||||
static void
|
||||
free_mime_info (MimeInfo *mi)
|
||||
{
|
||||
|
||||
}
|
||||
void
|
||||
add_to_key (char *mime_type, char *def, GHashTable *table, gboolean init_user)
|
||||
{
|
||||
|
@ -121,7 +120,8 @@ add_to_key (char *mime_type, char *def, GHashTable *table, gboolean init_user)
|
|||
info->keys = gnome_vfs_mime_get_keys (mime_type);
|
||||
g_hash_table_insert (table, info->mime_type, info);
|
||||
}
|
||||
if (strncmp (def, "ext", 3) == 0){
|
||||
|
||||
if (strncmp (def, "ext", 3) == 0) {
|
||||
char *tokp;
|
||||
|
||||
def += 3;
|
||||
|
@ -142,11 +142,13 @@ add_to_key (char *mime_type, char *def, GHashTable *table, gboolean init_user)
|
|||
used = 1;
|
||||
s = NULL;
|
||||
}
|
||||
if (!used)
|
||||
|
||||
if (!used) {
|
||||
g_free (p);
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp (def, "regex", 5) == 0){
|
||||
if (strncmp (def, "regex", 5) == 0) {
|
||||
regex_t *regex;
|
||||
|
||||
regex = g_new (regex_t, 1);
|
||||
|
@ -156,17 +158,20 @@ add_to_key (char *mime_type, char *def, GHashTable *table, gboolean init_user)
|
|||
while (*def && isspace (*def))
|
||||
def++;
|
||||
|
||||
if (!*def)
|
||||
if (!*def) {
|
||||
return;
|
||||
if (regcomp (regex, def, REG_EXTENDED | REG_NOSUB))
|
||||
}
|
||||
|
||||
if (regcomp (regex, def, REG_EXTENDED | REG_NOSUB)) {
|
||||
g_free (regex);
|
||||
else {
|
||||
} else {
|
||||
info->regex[priority] = regex;
|
||||
g_free (info->regex_readable[priority]);
|
||||
info->regex_readable[priority] = g_strdup (def);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mime_fill_from_file (const char *filename, gboolean init_user)
|
||||
{
|
||||
|
@ -207,8 +212,10 @@ mime_fill_from_file (const char *filename, gboolean init_user)
|
|||
while (*p && isspace (*p))
|
||||
p++;
|
||||
|
||||
if (*p == 0)
|
||||
if (*p == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
add_to_key (current_key, p, mime_types, init_user);
|
||||
if (init_user) {
|
||||
add_to_key (current_key, p,
|
||||
|
@ -273,29 +280,35 @@ mime_load_from_dir (const char *mime_info_dir, gboolean system_dir)
|
|||
}
|
||||
closedir (dir);
|
||||
}
|
||||
|
||||
static int
|
||||
add_mime_vals_to_clist (gchar *mime_type, gpointer mi, gpointer cl)
|
||||
{
|
||||
/* we also finalize the MimeInfo structure here, now that we're done
|
||||
* loading it */
|
||||
static gchar *text[2];
|
||||
GList *list;
|
||||
GString *extension;
|
||||
static gchar *text[1];
|
||||
gint row;
|
||||
|
||||
|
||||
/*
|
||||
GList *list;
|
||||
GString *extension;
|
||||
extension = g_string_new ("");
|
||||
for (list = ((MimeInfo *) mi)->ext[0];list; list=list->next) {
|
||||
g_string_append (extension, (gchar *) list->data);
|
||||
if (list->next != NULL)
|
||||
g_string_append (extension, ", ");
|
||||
}
|
||||
if (strcmp (extension->str, "") != 0 && ((MimeInfo *)mi)->user_ext[0])
|
||||
|
||||
if (strcmp (extension->str, "") != 0 && ((MimeInfo *)mi)->user_ext[0]) {
|
||||
g_string_append (extension, ", ");
|
||||
}
|
||||
|
||||
for (list = ((MimeInfo *) mi)->user_ext[0]; list; list=list->next) {
|
||||
g_string_append (extension, (gchar *) list->data);
|
||||
if (list->next != NULL)
|
||||
g_string_append (extension, ", ");
|
||||
}
|
||||
|
||||
((MimeInfo *) mi)->ext_readable[0] = extension->str;
|
||||
g_string_free (extension, FALSE);
|
||||
|
||||
|
@ -305,8 +318,11 @@ add_mime_vals_to_clist (gchar *mime_type, gpointer mi, gpointer cl)
|
|||
if (list->next)
|
||||
g_string_append (extension, ", ");
|
||||
}
|
||||
if (strcmp (extension->str, "") != 0 && ((MimeInfo *)mi)->user_ext[1])
|
||||
|
||||
if (strcmp (extension->str, "") != 0 && ((MimeInfo *)mi)->user_ext[1]) {
|
||||
g_string_append (extension, ", ");
|
||||
}
|
||||
|
||||
for (list = ((MimeInfo *) mi)->user_ext[1]; list; list=list->next) {
|
||||
g_string_append (extension, (gchar *) list->data);
|
||||
if (list->next != NULL)
|
||||
|
@ -317,112 +333,85 @@ add_mime_vals_to_clist (gchar *mime_type, gpointer mi, gpointer cl)
|
|||
|
||||
if (((MimeInfo *) mi)->ext[0] || ((MimeInfo *) mi)->user_ext[0]) {
|
||||
extension = g_string_new ((((MimeInfo *) mi)->ext_readable[0]));
|
||||
|
||||
if (((MimeInfo *) mi)->ext[1] || ((MimeInfo *) mi)->user_ext[1]) {
|
||||
g_string_append (extension, ", ");
|
||||
g_string_append (extension, (((MimeInfo *) mi)->ext_readable[1]));
|
||||
}
|
||||
} else if (((MimeInfo *) mi)->ext[1] || ((MimeInfo *) mi)->user_ext[1])
|
||||
} else if (((MimeInfo *) mi)->ext[1] || ((MimeInfo *) mi)->user_ext[1]) {
|
||||
extension = g_string_new ((((MimeInfo *) mi)->ext_readable[1]));
|
||||
else
|
||||
extension = g_string_new ("");
|
||||
|
||||
} else {
|
||||
extension = g_string_new ("");
|
||||
}
|
||||
*/
|
||||
|
||||
text[0] = ((MimeInfo *) mi)->mime_type;
|
||||
text[1] = extension->str;
|
||||
|
||||
row = gtk_clist_insert (GTK_CLIST (cl), 1, text);
|
||||
gtk_clist_set_row_data (GTK_CLIST (cl), row, mi);
|
||||
g_string_free (extension, TRUE);
|
||||
//g_string_free (extension, TRUE);
|
||||
return row;
|
||||
}
|
||||
|
||||
static void
|
||||
selected_row_callback (GtkWidget *widget, gint row, gint column, GdkEvent *event, gpointer data)
|
||||
{
|
||||
MimeInfo *mi;
|
||||
|
||||
if (column < 0)
|
||||
return;
|
||||
|
||||
mi = (MimeInfo *) gtk_clist_get_row_data (GTK_CLIST (widget),row);
|
||||
|
||||
if (event && event->type == GDK_2BUTTON_PRESS)
|
||||
launch_edit_window (mi->mime_type);
|
||||
|
||||
/* Update info on selection */
|
||||
nautilus_mime_type_capplet_update_info (mi->mime_type);
|
||||
|
||||
if (g_hash_table_lookup (user_mime_types, mi->mime_type)) {
|
||||
gtk_widget_set_sensitive (delete_button, TRUE);
|
||||
} else
|
||||
gtk_widget_set_sensitive (delete_button, FALSE);
|
||||
}
|
||||
|
||||
/* public functions */
|
||||
void
|
||||
delete_clicked (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
MimeInfo *mi;
|
||||
gint row = 0;
|
||||
|
||||
if (GTK_CLIST (clist)->selection)
|
||||
row = GPOINTER_TO_INT ((GTK_CLIST (clist)->selection)->data);
|
||||
else
|
||||
return;
|
||||
mi = (MimeInfo *) gtk_clist_get_row_data (GTK_CLIST (clist), row);
|
||||
|
||||
gtk_clist_remove (GTK_CLIST (clist), row);
|
||||
g_hash_table_remove (user_mime_types, mi->mime_type);
|
||||
remove_mime_info (mi->mime_type);
|
||||
free_mime_info (mi);
|
||||
capplet_widget_state_changed (CAPPLET_WIDGET (capplet),
|
||||
TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
edit_clicked (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
MimeInfo *mi;
|
||||
gint row = 0;
|
||||
|
||||
if (GTK_CLIST (clist)->selection)
|
||||
row = GPOINTER_TO_INT ((GTK_CLIST (clist)->selection)->data);
|
||||
else
|
||||
return;
|
||||
mi = (MimeInfo *) gtk_clist_get_row_data (GTK_CLIST (clist), row);
|
||||
if (mi)
|
||||
launch_edit_window (mi->mime_type);
|
||||
gtk_clist_remove (GTK_CLIST (clist), row);
|
||||
row = add_mime_vals_to_clist (mi->mime_type, mi, clist);
|
||||
gtk_clist_select_row (GTK_CLIST (clist), row, 0);
|
||||
}
|
||||
void
|
||||
add_clicked (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
launch_new_mime_window ();
|
||||
}
|
||||
/**
|
||||
* create_mime_clist:
|
||||
*
|
||||
**/
|
||||
|
||||
GtkWidget *
|
||||
get_mime_clist (void)
|
||||
create_mime_clist (void)
|
||||
{
|
||||
GtkWidget *retval;
|
||||
gchar *titles[2];
|
||||
gchar *titles[3];
|
||||
|
||||
titles[0] = _("Mime Type");
|
||||
titles[1] = _("Extension");
|
||||
titles[1] = _("Description");
|
||||
titles[2] = _("Application");
|
||||
|
||||
retval = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (retval),
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC);
|
||||
clist = gtk_clist_new_with_titles (2, titles);
|
||||
gtk_signal_connect (GTK_OBJECT (clist),
|
||||
"select_row",
|
||||
GTK_SIGNAL_FUNC (selected_row_callback),
|
||||
NULL);
|
||||
clist = gtk_clist_new_with_titles (3, titles);
|
||||
gtk_signal_connect (GTK_OBJECT (clist),"select_row",
|
||||
GTK_SIGNAL_FUNC (selected_row_callback), NULL);
|
||||
gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_BROWSE);
|
||||
gtk_clist_set_auto_sort (GTK_CLIST (clist), TRUE);
|
||||
if (clist)
|
||||
|
||||
if (clist) {
|
||||
g_hash_table_foreach (mime_types, (GHFunc) add_mime_vals_to_clist, clist);
|
||||
}
|
||||
|
||||
gtk_clist_columns_autosize (GTK_CLIST (clist));
|
||||
gtk_clist_select_row (GTK_CLIST (clist), 0, 0);
|
||||
gtk_container_add (GTK_CONTAINER (retval), clist);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
finalize_mime_type_foreach (gpointer mime_type, gpointer info, gpointer data)
|
||||
{
|
||||
|
@ -536,6 +525,7 @@ add_new_mime_type (gchar *mime_type, gchar *raw_ext)
|
|||
}
|
||||
*ptr2 = '\000';
|
||||
}
|
||||
|
||||
/* passed check, now we add it. */
|
||||
if (ext) {
|
||||
temp = g_strconcat ("ext: ", ext, NULL);
|
||||
|
@ -552,6 +542,7 @@ add_new_mime_type (gchar *mime_type, gchar *raw_ext)
|
|||
}
|
||||
g_free (ext);
|
||||
}
|
||||
|
||||
static void
|
||||
write_mime_foreach (gpointer mime_type, gpointer info, gpointer data)
|
||||
{
|
||||
|
@ -640,11 +631,13 @@ reread_list ()
|
|||
g_hash_table_foreach (mime_types, (GHFunc) add_mime_vals_to_clist, clist);
|
||||
gtk_clist_thaw (GTK_CLIST (clist));
|
||||
}
|
||||
|
||||
static void
|
||||
clean_mime_type (gpointer mime_type, gpointer mime_info, gpointer data)
|
||||
{
|
||||
/* we should write this )-: */
|
||||
}
|
||||
|
||||
void
|
||||
discard_mime_info ()
|
||||
{
|
||||
|
|
|
@ -2,10 +2,12 @@
|
|||
/* Copyright (C) 1998 Redhat Software Inc.
|
||||
* Authors: Jonathan Blandford <jrb@redhat.com>
|
||||
*/
|
||||
#ifndef _MIME_DATA_H_
|
||||
#define _MIME_DATA_H_
|
||||
#ifndef MIME_DATA_H
|
||||
#define MIME_DATA_H
|
||||
|
||||
#include "gnome.h"
|
||||
#include <regex.h>
|
||||
|
||||
/* Typedefs */
|
||||
typedef struct {
|
||||
char *mime_type;
|
||||
|
@ -21,14 +23,12 @@ typedef struct {
|
|||
extern GHashTable *user_mime_types;
|
||||
extern void add_to_key (char *mime_type, char *def, GHashTable *table, gboolean init_user);
|
||||
|
||||
GtkWidget *get_mime_clist (void);
|
||||
GtkWidget *create_mime_clist (void);
|
||||
void init_mime_type (void);
|
||||
void delete_clicked (GtkWidget *widget, gpointer data);
|
||||
void add_clicked (GtkWidget *widget, gpointer data);
|
||||
void edit_clicked (GtkWidget *widget, gpointer data);
|
||||
void add_new_mime_type (gchar *mime_type, gchar *ext);
|
||||
void write_user_mime (void);
|
||||
void write_initial_mime (void);
|
||||
void reread_list (void);
|
||||
void discard_mime_info (void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[Desktop Entry]
|
||||
Name=Files and Programs
|
||||
Name=File Types and Programs
|
||||
Comment=We need a good explanation here.
|
||||
Icon=gnome-ccmime.png
|
||||
Exec=nautilus-mime-type-capplet
|
||||
|
|
|
@ -1,6 +1,35 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
|
||||
|
||||
/* new-mime-window.c
|
||||
*
|
||||
* Copyright (C) 1998 Red Hat, Inc.
|
||||
* Copyright (C) 2000 Eazel, Inc.
|
||||
*
|
||||
* This library 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 library 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 library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* Authors: Jonathan Blandford <jbr@redhat.com>
|
||||
* Gene Z. Ragan <gzr@eazel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "new-mime-window.h"
|
||||
#include "capplet-widget.h"
|
||||
#include <config.h>
|
||||
|
||||
|
||||
static GtkWidget *add_dialog = NULL;
|
||||
extern GtkWidget *capplet;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue