mc/gnome/gcmd.c

669 lines
20 KiB
C
Raw Normal View History

/*
* Various Menu-invoked Command implementations specific to the GNOME port
*
* Copyright (C) 1998 the Free Software Foundation
*
* Author: Miguel de Icaza (miguel@kernel.org)
*/
1998-03-13 20:28:06 +03:00
#include <config.h>
#include "x.h"
#include <stdio.h>
#include <sys/stat.h>
#include "dir.h"
#include "panel.h"
#include "gscreen.h"
#include "main.h"
#include "gmain.h"
1998-03-13 20:28:06 +03:00
#include "cmd.h"
#include "boxes.h"
#include "profile.h"
#include "setup.h"
1998-03-13 20:28:06 +03:00
#include "panelize.h"
#include "gcmd.h"
#include "dialog.h"
#include "layout.h"
#include "../vfs/vfs.h"
1998-03-13 20:28:06 +03:00
enum {
SORT_NAME,
SORT_EXTENSION,
SORT_ACCESS,
SORT_MODIFY,
SORT_CHANGE,
SORT_SIZE
};
static char *panelize_section = "Panelize";
1998-03-13 20:28:06 +03:00
void
gnome_listing_cmd (GtkWidget *widget, WPanel *panel)
{
int view_type, use_msformat;
char *user, *status;
view_type = display_box (panel, &user, &status, &use_msformat, get_current_index ());
if (view_type == -1)
return;
configure_panel_listing (panel, view_type, use_msformat, user, status);
}
void
gnome_compare_panels (void)
{
if (get_other_panel () == NULL){
message (1, MSG_ERROR, _(" There is no other panel to compare contents to "));
1998-03-13 20:28:06 +03:00
return;
}
compare_dirs_cmd ();
}
void
gnome_open_terminal (void)
{
char *p;
if (!(p = gnome_is_program_in_path ("gnome-terminal")))
if (!(p = gnome_is_program_in_path ("dtterm")))
if (!(p = gnome_is_program_in_path ("nxterm")))
if (!(p = gnome_is_program_in_path ("color-xterm")))
if (!(p = gnome_is_program_in_path ("rxvt")))
p = gnome_is_program_in_path ("xterm");
if (p)
I improved the movement keys of the internal viewer a little bit. Now in wrap mode the End key and cursor up key behave much better (e.g. when viewing binary files with lots of wrapped lines). It's not perfekt but it's better than it used to be. Tue Apr 28 06:52:24 1998 Norbert Warmuth <k3190@fh-sw.de> * gnome/gcmd.c (gnome_open_terminal): Changed my_system(1,...) to my_system(EXECUTE_AS_SHELL,...) Tue Apr 28 06:06:03 1998 Norbert Warmuth <k3190@fh-sw.de> * vfs/extfs.c (extfs_open, extfs_close): Changed my_system(1,...) to my_system(EXECUTE_AS_SHELL,...), this fixes the broken copyin and copyout in 4.1.32. Tue Apr 28 06:11:08 1998 Norbert Warmuth <k3190@fh-sw.de> * view.c (toggle_wrap_mode, toggle_hex_mode): Force recalculation of bottom_first (we mustn't use an already calculated and cached value because it is invalid for the new mode and the End key would not move to the end of the file). * configure.in: Renamed the option `--with-our-slang' to `--with-included-slang' (this one looks better because we also have an `--with-included-gettext'). Make the option `--with-ext2undel' recognice a given path. * cmd.c (view_file_at_line): In plain view (F13) set the default magic flag to zero in order to view the file content unprocessed (esp. don't uncompress files if they are compressed). The view_simple_cmd got broken when the default magic flag in view.c was changed from 0 to 1. * view.c (do_view_init, goto_line): Set wrap mode temporary off to make goto line number work, i.e. `line number' now always means line number in file and not line number on screen (in wrap mode one long line wrapped once is displayed in two lines on the screen). That's important when the viewer is invoked from the find file dialog to display even in wrap mode approxiamtly the part of the file where we found the content we searched for. (move_forward2): In wrap mode lines were sometimes counted wrong causing cursor up to move more than one line. (move_backward2): Fixed the movement in wrap mode. (change_viewer): Always re-init viewer when we have a filename, i. e. if the viewer is invoked with simple_view_cmd then we can switch with the F8 key between unprocessed file content und uncompressed file content. (view_init): re-init view also when magic flag was altered
1998-04-28 18:19:48 +04:00
my_system (EXECUTE_AS_SHELL, shell, p);
else
message (1, MSG_ERROR, " Could not start a terminal ");
1998-03-13 20:28:06 +03:00
}
void
gnome_about_cmd (void)
{
GtkWidget *about;
const gchar *authors[] = {
1998-03-13 20:28:06 +03:00
"The Midnight Commander Team",
1998-09-18 22:21:47 +04:00
"http://www.gnome.org/mc/",
1998-03-13 20:28:06 +03:00
"bug reports: mc-bugs@nuclecu.unam.mx",
NULL
};
about = gnome_about_new (_("GNU Midnight Commander"), VERSION,
"(C) 1994-1998 the Free Software Fundation",
authors,
_("The GNOME edition of the Midnight Commander file manager."),
NULL);
gtk_widget_show (about);
}
void
gnome_quit_cmd (void)
{
int q = 0;
if (!confirm_exit)
q = 1;
else if (query_dialog (_(" The Midnight Commander "),
_(" Do you really want to quit the Midnight Commander? "),
0, 2, _("&Yes"), _("&No")) == 0)
q = 1;
if (q == 1)
gtk_main_quit ();
1998-03-13 20:28:06 +03:00
}
void
gnome_open_panel (GtkWidget *widget, WPanel *panel)
{
new_panel_at (panel->cwd);
}
Ok, most of the "Elliot Lee confidential bug report" has been dealt with with this commit. This also addresses a bunch of the comments from the status.shtml from DrMike. Miguel. 1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx> * screen.c (GT): Assign two spaces for the minimum size of the "type" field for the GNOME edition. This gives some extra space for the icon that gets displayed. * dlg.c (remove_widget): New function: used to remove a widget from an existing Dlg_head; (destroy_widget): Destroy a specific Widget. (add_widgetl): Extended to deal with the fact that a running Dlg_head can become empty. * panelize.c (l_call): Update the input line every time the user selects the entry with the mouse (pretty common in the gnome edition). * hotlist.c (add_new_group_input): Removed an extra field that was causing problems. * find.c (find_parameters): Tree button is gone for gnome until we get the tree function working on gnome. * cmd.c (save_setup_cmd): Per Elliot's suggestion, do not pop up a dialog box to inform the user about the saved setup. 1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx> * gcmd.c (gnome_close_panel): Implement the close-the-panel functionality. * gscreen.c (x_panel_destroy): Implement the gnome mode way of destroying the panel. * gview.c (view_status): Add cacheing of the information status, to avoid excessive flicker. It would be better if GtkLabel did not flicker though. (scrollbar_moved): Scroll correctly. We now use view_move_backward and view_move_forward to adjust the scrollbar contents. This displays the scrollbar correctly. * gwidget.c (x_listbox_select_nth): This may be invoked before the widget has been created, work around this problem. * gscreen.c (show_dir): Set the title bar for the window to the current directoy. Reported by both Mike and Elliot. * layout: Updated to the new hotlist dialog box.
1998-04-16 06:45:53 +04:00
int
gnome_close_panel (GtkWidget *widget, WPanel *panel)
{
Dlg_head *h = panel->widget.parent;
g_print ("closing the panel\n");
if (panel->timer_id){
gtk_timeout_remove (panel->timer_id);
panel->timer_id = -1;
}
Ok, most of the "Elliot Lee confidential bug report" has been dealt with with this commit. This also addresses a bunch of the comments from the status.shtml from DrMike. Miguel. 1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx> * screen.c (GT): Assign two spaces for the minimum size of the "type" field for the GNOME edition. This gives some extra space for the icon that gets displayed. * dlg.c (remove_widget): New function: used to remove a widget from an existing Dlg_head; (destroy_widget): Destroy a specific Widget. (add_widgetl): Extended to deal with the fact that a running Dlg_head can become empty. * panelize.c (l_call): Update the input line every time the user selects the entry with the mouse (pretty common in the gnome edition). * hotlist.c (add_new_group_input): Removed an extra field that was causing problems. * find.c (find_parameters): Tree button is gone for gnome until we get the tree function working on gnome. * cmd.c (save_setup_cmd): Per Elliot's suggestion, do not pop up a dialog box to inform the user about the saved setup. 1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx> * gcmd.c (gnome_close_panel): Implement the close-the-panel functionality. * gscreen.c (x_panel_destroy): Implement the gnome mode way of destroying the panel. * gview.c (view_status): Add cacheing of the information status, to avoid excessive flicker. It would be better if GtkLabel did not flicker though. (scrollbar_moved): Scroll correctly. We now use view_move_backward and view_move_forward to adjust the scrollbar contents. This displays the scrollbar correctly. * gwidget.c (x_listbox_select_nth): This may be invoked before the widget has been created, work around this problem. * gscreen.c (show_dir): Set the title bar for the window to the current directoy. Reported by both Mike and Elliot. * layout: Updated to the new hotlist dialog box.
1998-04-16 06:45:53 +04:00
/* Remove the widgets from the dialog head */
remove_widget (h, panel->current_dir);
remove_widget (h, panel->filter_w);
remove_widget (h, panel);
/* Kill them */
destroy_widget (panel->current_dir);
destroy_widget (panel->filter_w);
destroy_widget ((void *)panel);
layout_panel_gone (panel);
mc_chdir ("/");
Ok, most of the "Elliot Lee confidential bug report" has been dealt with with this commit. This also addresses a bunch of the comments from the status.shtml from DrMike. Miguel. 1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx> * screen.c (GT): Assign two spaces for the minimum size of the "type" field for the GNOME edition. This gives some extra space for the icon that gets displayed. * dlg.c (remove_widget): New function: used to remove a widget from an existing Dlg_head; (destroy_widget): Destroy a specific Widget. (add_widgetl): Extended to deal with the fact that a running Dlg_head can become empty. * panelize.c (l_call): Update the input line every time the user selects the entry with the mouse (pretty common in the gnome edition). * hotlist.c (add_new_group_input): Removed an extra field that was causing problems. * find.c (find_parameters): Tree button is gone for gnome until we get the tree function working on gnome. * cmd.c (save_setup_cmd): Per Elliot's suggestion, do not pop up a dialog box to inform the user about the saved setup. 1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx> * gcmd.c (gnome_close_panel): Implement the close-the-panel functionality. * gscreen.c (x_panel_destroy): Implement the gnome mode way of destroying the panel. * gview.c (view_status): Add cacheing of the information status, to avoid excessive flicker. It would be better if GtkLabel did not flicker though. (scrollbar_moved): Scroll correctly. We now use view_move_backward and view_move_forward to adjust the scrollbar contents. This displays the scrollbar correctly. * gwidget.c (x_listbox_select_nth): This may be invoked before the widget has been created, work around this problem. * gscreen.c (show_dir): Set the title bar for the window to the current directoy. Reported by both Mike and Elliot. * layout: Updated to the new hotlist dialog box.
1998-04-16 06:45:53 +04:00
return TRUE;
}
void
gnome_icon_view_cmd (GtkWidget *widget, WPanel *panel)
{
if (panel->list_type == list_icons)
return;
panel->list_type = list_icons;
set_panel_formats (panel);
paint_panel (panel);
do_refresh ();
}
void
gnome_partial_view_cmd (GtkWidget *widget, WPanel *panel)
{
if (panel->list_type == list_brief)
return;
panel->list_type = list_brief;
set_panel_formats (panel);
paint_panel (panel);
do_refresh ();
}
void
gnome_full_view_cmd (GtkWidget *widget, WPanel *panel)
{
if (panel->list_type == list_full)
return;
panel->list_type = list_full;
set_panel_formats (panel);
paint_panel (panel);
do_refresh ();
}
void
gnome_custom_view_cmd (GtkWidget *widget, WPanel *panel)
{
if (panel->list_type == list_user)
return;
panel->list_type = list_user;
set_panel_formats (panel);
paint_panel (panel);
do_refresh ();
}
static void
sort_callback (GtkWidget *menu_item, GtkWidget *cbox1)
{
if (gtk_object_get_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE") == SORT_NAME)
gtk_widget_set_sensitive (cbox1, TRUE);
else
gtk_widget_set_sensitive (cbox1, FALSE);
}
void
gnome_sort_cmd (GtkWidget *widget, WPanel *panel)
{
GtkWidget *sort_box;
GtkWidget *hbox;
GtkWidget *omenu;
GtkWidget *menu;
GtkWidget *menu_item;
GtkWidget *cbox1, *cbox2;
sortfn *sfn = NULL;
sort_box = gnome_dialog_new (_("Sort By"), GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL, NULL);
gmc_window_setup_from_panel (GNOME_DIALOG (sort_box), panel);
/* we define this up here so we can pass it in to our callback */
cbox1 = gtk_check_button_new_with_label (N_("Ignore case sensitivity."));
hbox = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (sort_box)->vbox), hbox, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new ("Sort files by "), FALSE, FALSE, 0);
omenu = gtk_option_menu_new ();
gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 0);
menu = gtk_menu_new ();
menu_item = gtk_menu_item_new_with_label ( _("Name"));
/* FIXME: we want to set the option menu to be the correct ordering. */
gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_NAME);
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (sort_callback), cbox1);
menu_item = gtk_menu_item_new_with_label ( _("File Type"));
gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_EXTENSION);
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (sort_callback), cbox1);
menu_item = gtk_menu_item_new_with_label ( _("Size"));
gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_SIZE);
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (sort_callback), cbox1);
menu_item = gtk_menu_item_new_with_label ( _("Time Last Accessed"));
gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_ACCESS);
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (sort_callback), cbox1);
menu_item = gtk_menu_item_new_with_label ( _("Time Last Modified"));
gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_MODIFY);
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (sort_callback), cbox1);
menu_item = gtk_menu_item_new_with_label ( _("Time Last Changed"));
gtk_menu_append (GTK_MENU (menu), menu_item);
gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_CHANGE);
gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
GTK_SIGNAL_FUNC (sort_callback), cbox1);
gtk_widget_show_all (menu);
gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (cbox1), panel->case_sensitive);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (sort_box)->vbox),
cbox1, FALSE, FALSE, 0);
cbox2 = gtk_check_button_new_with_label (N_("Reverse the order."));
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (cbox2), panel->reverse);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (sort_box)->vbox),
cbox2, FALSE, FALSE, 0);
/* off to the races */
gtk_widget_show_all (GNOME_DIALOG (sort_box)->vbox);
switch (gnome_dialog_run (GNOME_DIALOG (sort_box))) {
case 0:
switch( (gint) gtk_object_get_data (GTK_OBJECT
(GTK_OPTION_MENU
(omenu)->menu_item),
"SORT_ORDER_CODE") ) {
case SORT_NAME:
sfn = (sortfn *) sort_name;
break;
case SORT_EXTENSION:
sfn = (sortfn *) sort_ext;
break;
case SORT_ACCESS:
sfn = (sortfn *) sort_atime;
break;
case SORT_MODIFY:
sfn = (sortfn *) sort_time;
break;
case SORT_CHANGE:
sfn = (sortfn *) sort_ctime;
break;
case SORT_SIZE:
sfn = (sortfn *) sort_size;
break;
}
/* case sensitive */
panel->case_sensitive = GTK_TOGGLE_BUTTON (cbox1)->active;
/* Reverse order */
panel->reverse = GTK_TOGGLE_BUTTON (cbox2)->active;
panel_set_sort_order (panel, sfn);
break;
case 1:
default:
break;
}
gtk_widget_destroy (sort_box);
}
typedef struct ep_dlg_data {
GtkWidget *ep_dlg;
GtkWidget *clist;
GtkWidget *entry;
GtkWidget *add_button;
GtkWidget *remove_button;
gboolean setting_text;
gint selected; /* if this is -1 then nothing is selected, otherwise, it's the row selected */
} ep_dlg_data;
static gchar *
get_nickname (gchar *text)
{
GtkWidget *dlg;
GtkWidget *entry;
GtkWidget *label;
gchar *retval = NULL;
dlg = gnome_dialog_new (_("Enter name."), GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL, NULL);
gtk_window_set_position (GTK_WINDOW (dlg), GTK_WIN_POS_MOUSE);
entry = gtk_entry_new ();
if (text)
gtk_entry_set_text (GTK_ENTRY (entry), text);
label = gtk_label_new (_("Enter label for command:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dlg)->vbox),
label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dlg)->vbox),
entry, FALSE, FALSE, 0);
gtk_widget_show_all (GNOME_DIALOG (dlg)->vbox);
switch (gnome_dialog_run (GNOME_DIALOG (dlg))) {
case 0:
retval = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
break;
case 1:
default:
}
gtk_widget_destroy (dlg);
return retval;
}
static void
ep_add_callback (GtkWidget *widget, ep_dlg_data *data)
{
gint i;
gchar *insert_tab[1];
insert_tab[0] = get_nickname (NULL);
if (insert_tab[0] == NULL)
return;
i = gtk_clist_append (GTK_CLIST (data->clist), insert_tab);
gtk_clist_set_row_data (GTK_CLIST (data->clist), i,
g_strdup (gtk_entry_get_text (GTK_ENTRY (data->entry))));
g_free (insert_tab [0]);
data->selected = -1;
gtk_widget_set_sensitive (data->add_button, FALSE);
gtk_entry_set_text (GTK_ENTRY (data->entry), "");
}
static void
ep_remove_callback (GtkWidget *widget, ep_dlg_data *data)
{
if (data->selected > -1) {
g_free (gtk_clist_get_row_data (GTK_CLIST (data->clist), data->selected));
gtk_clist_remove (GTK_CLIST (data->clist), data->selected);
data->selected = -1;
gtk_entry_set_text (GTK_ENTRY (data->entry), "");
}
gtk_widget_set_sensitive (data->remove_button, FALSE);
}
static void
ep_select_callback (GtkWidget *widget,
gint row,
gint column,
GdkEventButton *event,
ep_dlg_data *data)
{
if (event && event->type == GDK_2BUTTON_PRESS) {
gchar *nick;
gtk_clist_get_text (GTK_CLIST (widget), row, 0, &nick);
/* ugly but correct... (: */
nick = get_nickname (nick);
gtk_clist_set_text (GTK_CLIST (data->clist), row, 0, nick);
gtk_clist_select_row (GTK_CLIST (data->clist), row, 0);
} else {
data->setting_text = TRUE;
gtk_entry_set_text (GTK_ENTRY (data->entry),
(gchar *) gtk_clist_get_row_data (GTK_CLIST (widget), row));
data->setting_text = FALSE;
data->selected = row;
gtk_widget_set_sensitive (data->remove_button, TRUE);
gtk_widget_set_sensitive (data->add_button, FALSE);
}
}
static void
ep_text_changed_callback (GtkWidget *widget, ep_dlg_data *data)
{
if (data->setting_text)
/* we don't want to deselect text if we just clicked on something */
return;
if (data->selected > -1) {
gtk_clist_unselect_row (GTK_CLIST (data->clist), data->selected, 0);
data->selected = -1;
}
gtk_widget_set_sensitive (data->remove_button, FALSE);
gtk_widget_set_sensitive (data->add_button, TRUE);
}
static void
load_settings (GtkCList *clist)
{
gchar *insert_tab[1];
void *profile_keys;
gchar *key, *value;
gint i = 0;
profile_keys = profile_init_iterator (panelize_section, profile_name);
if (!profile_keys){
insert_tab[0] = _("Find all core files");
i = gtk_clist_insert (clist, i, insert_tab);
gtk_clist_set_row_data (clist, i, g_strdup ("find / -name core"));
insert_tab[0] = _("Find rejects after patching");
i = gtk_clist_insert (clist, i, insert_tab);
gtk_clist_set_row_data (clist, i, g_strdup ("find . -name \\*.rej -print"));
} else {
while (profile_keys) {
profile_keys = profile_iterator_next (profile_keys, &key, &value);
insert_tab[0] = key;
i = gtk_clist_insert (clist, i, insert_tab);
gtk_clist_set_row_data (clist, i, g_strdup (value));
}
}
}
static void
save_settings (GtkCList *clist)
{
gint i;
gchar *text;
profile_clean_section (panelize_section, profile_name);
for (i = 0; i < GTK_CLIST (clist)->rows; i++) {
gtk_clist_get_text (GTK_CLIST (clist), i, 0, &text);
WritePrivateProfileString (panelize_section,
text,
(gchar *) gtk_clist_get_row_data (GTK_CLIST (clist), i),
profile_name);
}
sync_profiles ();
}
void
gnome_external_panelize (GtkWidget *widget, WPanel *panel)
{
ep_dlg_data *data;
GtkWidget *frame;
GtkWidget *sw;
GtkWidget *vbox;
GtkWidget *hbox;
gint i;
gchar *row_data;
data = g_new0 (ep_dlg_data, 1);
data->setting_text = FALSE;
data->selected = -1;
data->ep_dlg = gnome_dialog_new (_("Run Command"), GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL, NULL);
gtk_window_set_position (GTK_WINDOW (data->ep_dlg), GTK_WIN_POS_MOUSE);
/* Frame 1 */
frame = gtk_frame_new (_("Preset Commands"));
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (data->ep_dlg)->vbox),
frame, FALSE, FALSE, 0);
data->clist = gtk_clist_new (1);
load_settings (GTK_CLIST (data->clist));
gtk_signal_connect (GTK_OBJECT (data->clist), "select_row", GTK_SIGNAL_FUNC (ep_select_callback), (gpointer) data);
vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
gtk_clist_columns_autosize (GTK_CLIST (data->clist));
gtk_clist_set_auto_sort (GTK_CLIST (data->clist), TRUE);
gtk_container_set_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL);
sw = gtk_scrolled_window_new (GTK_CLIST (data->clist)->hadjustment, GTK_CLIST (data->clist)->vadjustment);
gtk_widget_set_usize (sw, 300, 100);
gtk_container_add (GTK_CONTAINER (sw), data->clist);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (frame), vbox);
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
data->add_button = gtk_button_new_with_label (_("Add"));
gtk_signal_connect (GTK_OBJECT (data->add_button), "clicked", GTK_SIGNAL_FUNC (ep_add_callback), (gpointer) data);
gtk_widget_set_usize (data->add_button, 75, 25);
gtk_box_pack_end (GTK_BOX (hbox), data->add_button, FALSE, FALSE, 0);
data->remove_button = gtk_button_new_with_label (_("Remove"));
gtk_widget_set_sensitive (data->remove_button, FALSE);
gtk_signal_connect (GTK_OBJECT (data->remove_button), "clicked", GTK_SIGNAL_FUNC (ep_remove_callback), (gpointer) data);
gtk_widget_set_usize (data->remove_button, 75, 25);
gtk_box_pack_end (GTK_BOX (hbox), data->remove_button, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
/* Frame 2 */
frame = gtk_frame_new (_("Run this Command"));
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (data->ep_dlg)->vbox),
frame, FALSE, FALSE, 0);
data->entry = gtk_entry_new ();
gtk_signal_connect (GTK_OBJECT (data->entry), "changed", GTK_SIGNAL_FUNC (ep_text_changed_callback), (gpointer) data);
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Command: ")), FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), data->entry, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (frame), hbox);
gtk_widget_show_all (GNOME_DIALOG (data->ep_dlg)->vbox);
switch (gnome_dialog_run (GNOME_DIALOG (data->ep_dlg))) {
case 0:
gtk_widget_hide (data->ep_dlg);
while (gtk_events_pending () )
gtk_main_iteration ();
do_external_panelize (gtk_entry_get_text (GTK_ENTRY (data->entry)));
save_settings (GTK_CLIST (data->clist));
break;
case 1:
default:
}
for (i = 0; i < GTK_CLIST (data->clist)->rows; i++) {
row_data = gtk_clist_get_row_data (GTK_CLIST (data->clist), i);
if (row_data)
g_free (row_data);
}
gtk_widget_destroy (GTK_WIDGET (data->ep_dlg));
g_free (data);
}
void
gnome_select_all_cmd (GtkWidget *widget, WPanel *panel)
{
gint i;
for (i = 0; i < panel->count; i++){
if (!strcmp (panel->dir.list [i].fname, ".."))
continue;
do_file_mark (panel, i, 1);
}
paint_panel (panel);
do_refresh ();
}
void
gnome_filter_cmd (GtkWidget *widget, WPanel *panel)
{
GtkWidget *filter_dlg;
GtkWidget *entry;
GtkWidget *label;
gchar *text1, *text2, *text3;
filter_dlg = gnome_dialog_new (_("Set Filter"), GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL, NULL);
gtk_window_set_position (GTK_WINDOW (filter_dlg), GTK_WIN_POS_MOUSE);
if (easy_patterns) {
text1 = "mc_filter_globs";
text3 = _("Show all files");
if (panel->filter && (strcmp (panel->filter, "*")))
text2 = panel->filter;
else
text2 = NULL;
} else {
text1 = ("mc_filter_regexps");
text3 = _(".");
if (!panel->filter)
text2 = NULL;
else
text2 = panel->filter;
}
entry = gnome_entry_new (text1);
gnome_entry_load_history (GNOME_ENTRY (entry));
if (text2) {
gtk_entry_set_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry))), text2);
gnome_entry_prepend_history (GNOME_ENTRY (entry), FALSE, text3);
} else
gtk_entry_set_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry))), text3);
if (easy_patterns)
label = gtk_label_new (_("Enter a filter here for files in the panel view.\n\nFor example:\n*.gif will show just gif images"));
else
label = gtk_label_new (_("Enter a Regular Expression to filter files in the panel view."));
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (filter_dlg)->vbox), label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (filter_dlg)->vbox), entry, FALSE, FALSE, 0);
gtk_widget_show_all (GNOME_DIALOG (filter_dlg)->vbox);
switch (gnome_dialog_run (GNOME_DIALOG (filter_dlg))) {
case 0:
gtk_widget_hide (filter_dlg);
if (panel->filter) {
g_free (panel->filter);
panel->filter = NULL;
}
panel->filter = g_strdup (gtk_entry_get_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry)))));
if (!strcmp (_("Show all files"), panel->filter)) {
g_free (panel->filter);
panel->filter = NULL;
gtk_entry_set_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry))),
"");
gtk_label_set_text (GTK_LABEL (panel->status), _("Show all files"));
} else if (!strcmp ("*", panel->filter)) {
g_free (panel->filter);
panel->filter = NULL;
gtk_label_set_text (GTK_LABEL (panel->status), _("Show all files"));
} else
gtk_label_set_text (GTK_LABEL (panel->status), panel->filter);
gnome_entry_save_history (GNOME_ENTRY (entry));
reread_cmd ();
x_filter_changed (panel);
break;
}
gtk_widget_destroy (filter_dlg);
}
void
gnome_open_files (GtkWidget *widget, WPanel *panel)
{
GList *later = NULL;
#if 0
GList *now;
#endif
gint i;
/* FIXME: this is the easy way to do things. We want the
* hard way sometime. */
for (i = 0; i < panel->count; i++) {
if (panel->dir.list [i].f.marked)
if (!do_enter_on_file_entry ((panel->dir.list) + i))
later = g_list_prepend (later, panel->dir.list + i);
}
#if 0
/* This is sorta ugly. Should we just skip these? There should be a better way. */
for (now = later; now; now = now->next) {
gchar *command;
command = input_expand_dialog (_(" Open with..."),
_("Enter extra arguments:"), (WPanel *) now->data);
if (!command)
/* we break out. */
break;
execute (command);
g_free (command);
}
#endif
g_list_free (later);
}
void
gnome_run_new (GtkWidget *widget, GnomeDesktopEntry *gde)
{
gnome_desktop_entry_launch (gde);
}
void
gnome_mkdir_cmd (GtkWidget *widget, WPanel *panel)
{
mkdir_cmd (panel);
}