--- /home/yurik81/Desktop/src/gnome-commander/origin/gnome-cmd-file-selector.cc 2010-02-13 22:39:25.000000000 +0200 +++ /var/cache/apt-build/build/gnome-commander-1.2.8.5/src/gnome-cmd-file-selector.cc 2010-06-21 20:22:41.129423263 +0300 @@ -50,11 +50,18 @@ struct GnomeCmdFileSelectorClass { - GtkVBoxClass parent_class; + GtkNotebookClass parent_class; void (* changed_dir) (GnomeCmdFileSelector *fs, GnomeCmdDir *dir); }; +struct _GnomeCmdFileSelectorClass +{ + GtkVBoxClass parent_class; + + void (* changed_dir) (_GnomeCmdFileSelector *fs, GnomeCmdDir *dir); +}; + #define FS_PBAR_MAX 50 @@ -64,7 +71,8 @@ { TARGET_URL_TYPE, 0, TARGET_URL } }; -static GtkVBoxClass *parent_class = NULL; +static GtkNotebookClass *parent_class = NULL; +static GtkVBoxClass *_parent_class = NULL; class GnomeCmdFileSelector::Private { @@ -122,6 +130,7 @@ { } +//////////////// enum {CHANGED_DIR, LAST_SIGNAL}; @@ -232,10 +241,10 @@ { g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); - fs->file_list()->invalidate_tree_size(); + fs->list->invalidate_tree_size(); - for (GList *files = fs->file_list()->get_visible_files(); files; files = files->next) - fs->file_list()->show_dir_tree_size((GnomeCmdFile *) files->data); + for (GList *files = fs->list->get_visible_files(); files; files = files->next) + fs->list->show_dir_tree_size((GnomeCmdFile *) files->data); fs->update_selected_files_label(); } @@ -247,20 +256,20 @@ if (!con_change_needed) { - fs->file_list()->con = con; + fs->list->con = con; fs->priv->dir_history = gnome_cmd_con_get_dir_history (con); - if (fs->file_list()->lwd) + if (fs->list->lwd) { - gnome_cmd_dir_cancel_monitoring (fs->file_list()->lwd); - gnome_cmd_dir_unref (fs->file_list()->lwd); - fs->file_list()->lwd = NULL; + gnome_cmd_dir_cancel_monitoring (fs->list->lwd); + gnome_cmd_dir_unref (fs->list->lwd); + fs->list->lwd = NULL; } - if (fs->file_list()->cwd) + if (fs->list->cwd) { - gnome_cmd_dir_cancel_monitoring (fs->file_list()->cwd); - gnome_cmd_dir_unref (fs->file_list()->cwd); - fs->file_list()->cwd = NULL; + gnome_cmd_dir_cancel_monitoring (fs->list->cwd); + gnome_cmd_dir_unref (fs->list->cwd); + fs->list->cwd = NULL; } } @@ -306,11 +315,11 @@ { g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); - GnomeCmdFile *f = fs->file_list()->get_selected_file(); + GnomeCmdFile *f = fs->list->get_selected_file(); if (GNOME_CMD_IS_FILE (f)) { - GtkWidget *dialog = gnome_cmd_make_copy_dialog_new (f, fs->file_list()->cwd); + GtkWidget *dialog = gnome_cmd_make_copy_dialog_new (f, fs->list->cwd); gtk_widget_ref (dialog); gtk_widget_show (dialog); @@ -324,7 +333,7 @@ inline void restore_drag_indicator (GnomeCmdFileSelector *fs) { - gnome_cmd_clist_set_drag_row (GNOME_CMD_CLIST (fs->file_list()), -1); + gnome_cmd_clist_set_drag_row (GNOME_CMD_CLIST (fs->list), -1); } @@ -346,7 +355,7 @@ guint32 time, GnomeCmdFileSelector *fs) { - GtkCList *clist = GTK_CLIST (fs->file_list()); + GtkCList *clist = GTK_CLIST (fs->list); GnomeCmdFile *f; GnomeCmdDir *to, *cwd; GList *uri_list = NULL; @@ -378,7 +387,7 @@ y -= (clist->column_title_area.height - GTK_CONTAINER (clist)->border_width); if (y < 0) return; - int row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->file_list()), x, y); + int row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->list), x, y); // Transform the drag data to a list with uris uri_list = strings_to_uris ((gchar *) selection_data->data); @@ -389,7 +398,7 @@ to_fn = gnome_vfs_unescape_string (gnome_vfs_uri_extract_short_name (uri), 0); } - f = fs->file_list()->get_file_at_row(row); + f = fs->list->get_file_at_row(row); cwd = fs->get_directory(); if (f && f->info->type == GNOME_VFS_FILE_TYPE_DIRECTORY) @@ -452,8 +461,8 @@ GnomeCmdDir *dir = fs->get_directory(); g_return_if_fail (GNOME_CMD_IS_DIR (dir)); - GList *files = fs->file_list()->get_selected_files(); - fs->file_list()->remove_files(files); + GList *files = fs->list->get_selected_files(); + fs->list->remove_files(files); g_list_free (files); } @@ -465,16 +474,16 @@ gint row_count; guint offset; gint row_height; - GtkCList *clist = GTK_CLIST (fs->file_list()); + GtkCList *clist = GTK_CLIST (fs->list); gdk_window_get_size (GTK_WIDGET (clist)->window, &w, &h); offset = (0-clist->voffset); row_height = gnome_cmd_data.list_row_height; row_count = clist->rows; - focus_row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->file_list()), 1, fs->priv->autoscroll_y); - top_row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->file_list()), 1, 0); - bottom_row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->file_list()), 1, h); + focus_row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->list), 1, fs->priv->autoscroll_y); + top_row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->list), 1, 0); + bottom_row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->list), 1, h); if (!fs->priv->autoscroll_dir) { @@ -499,7 +508,7 @@ { if (y < 0) return; - GtkCList *clist = GTK_CLIST (fs->file_list()); + GtkCList *clist = GTK_CLIST (fs->list); // guint offset = (0-clist->voffset); gint w, h; @@ -538,15 +547,15 @@ { gdk_drag_status (context, context->suggested_action, time); - GtkCList *clist = GTK_CLIST (fs->file_list()); + GtkCList *clist = GTK_CLIST (fs->list); y -= (clist->column_title_area.height - GTK_CONTAINER (clist)->border_width); - gint row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->file_list()), x, y); + gint row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (fs->list), x, y); if (row > -1) { - GnomeCmdFile *f = fs->file_list()->get_file_at_row(row); + GnomeCmdFile *f = fs->list->get_file_at_row(row); if (f->info->type != GNOME_VFS_FILE_TYPE_DIRECTORY) row = -1; @@ -565,20 +574,20 @@ g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); // Set up drag source - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "drag-begin", GTK_SIGNAL_FUNC (drag_begin), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "drag-end", GTK_SIGNAL_FUNC (drag_end), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "drag-leave", GTK_SIGNAL_FUNC (drag_leave), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "drag-data-delete", GTK_SIGNAL_FUNC (drag_data_delete), fs); + gtk_signal_connect (GTK_OBJECT (fs->list), "drag-begin", GTK_SIGNAL_FUNC (drag_begin), fs); + gtk_signal_connect (GTK_OBJECT (fs->list), "drag-end", GTK_SIGNAL_FUNC (drag_end), fs); + gtk_signal_connect (GTK_OBJECT (fs->list), "drag-leave", GTK_SIGNAL_FUNC (drag_leave), fs); + gtk_signal_connect (GTK_OBJECT (fs->list), "drag-data-delete", GTK_SIGNAL_FUNC (drag_data_delete), fs); // Set up drag destination - gtk_drag_dest_set (GTK_WIDGET (fs->file_list()), + gtk_drag_dest_set (GTK_WIDGET (fs->list), GTK_DEST_DEFAULT_DROP, drop_types, G_N_ELEMENTS (drop_types), (GdkDragAction) (GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK)); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "drag-motion", GTK_SIGNAL_FUNC (drag_motion), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "drag-leave", GTK_SIGNAL_FUNC (drag_leave), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "drag-data-received", GTK_SIGNAL_FUNC (drag_data_received), fs); + gtk_signal_connect (GTK_OBJECT (fs->list), "drag-motion", GTK_SIGNAL_FUNC (drag_motion), fs); + gtk_signal_connect (GTK_OBJECT (fs->list), "drag-leave", GTK_SIGNAL_FUNC (drag_leave), fs); + gtk_signal_connect (GTK_OBJECT (fs->list), "drag-data-received", GTK_SIGNAL_FUNC (drag_data_received), fs); } @@ -619,7 +628,7 @@ if (gnome_cmd_con_can_show_free_space (fs->get_connection())) { GnomeVFSFileSize free_space; - GnomeVFSURI *uri = gnome_cmd_file_get_uri (GNOME_CMD_FILE (fs->file_list()->cwd)); + GnomeVFSURI *uri = gnome_cmd_file_get_uri (GNOME_CMD_FILE (fs->list->cwd)); GnomeVFSResult res = gnome_vfs_get_volume_free_space (uri, &free_space); gnome_vfs_uri_unref (uri); @@ -640,9 +649,55 @@ g_free (s); } - void GnomeCmdFileSelector::goto_directory(const gchar *in_dir) -{ +{ + // initialize all tabs + if (initialized == FALSE) { + initialized == TRUE; + + gint page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(this)); + + // position stored along with tab paths + GnomeCmdFileSelector* left_fs = gnome_cmd_main_win_get_fs(main_win, LEFT); + if (left_fs == this) + position = LEFT; + else + position = RIGHT; + + gchar comb_path[] = "/options/start_dir_left_00"; + + // restore tab count + sprintf(comb_path, "/options/tab_count_%s", position == LEFT ? "left" : "right"); + gchar* num_str = gnome_cmd_data_get_string(comb_path, "1"); + guint tab_count; + sscanf(num_str, "%u", &tab_count); + + + // initialize each tab + for(uint i = 0; i < tab_count; i++) { + //_change_state(i); + + // restore saved paths for each directory + sprintf(comb_path, "/options/start_dir_%s_%u", position == LEFT ? "left" : "right", i); + const gchar* dir = gnome_cmd_data_get_string(comb_path, in_dir); + if (i == 0) + _goto_directory(dir); + else + new_tab(dir); + } + + //select previously active tabs + sprintf(comb_path, "/options/cur_tab_num_%s", position == LEFT ? "left" : "right"); + gchar* cur_tab_num_str = gnome_cmd_data_get_string(comb_path, "-1"); // -1 == only one tab + gint cur_tab_num; + sscanf(cur_tab_num_str, "%i", &cur_tab_num); + gtk_notebook_set_current_page(GTK_NOTEBOOK(this), cur_tab_num); + + } else _goto_directory(in_dir); +} + +void GnomeCmdFileSelector::_goto_directory(const gchar *in_dir) +{ g_return_if_fail (in_dir != NULL); GnomeCmdDir *cur_dir = get_directory(); @@ -693,9 +748,13 @@ file_list()->focus_file(focus_dir, FALSE); g_free (dir); + + // my + _update_cur_tab_title(); } + static void do_file_specific_action (GnomeCmdFileSelector *fs, GnomeCmdFile *f) { g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); @@ -704,13 +763,16 @@ if (f->info->type == GNOME_VFS_FILE_TYPE_DIRECTORY) { - fs->file_list()->invalidate_tree_size(); + fs->list->invalidate_tree_size(); if (f->is_dotdot) fs->goto_directory(".."); else fs->set_directory(GNOME_CMD_DIR (f)); } + + // my + fs->_update_cur_tab_title(); } @@ -718,7 +780,7 @@ { g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); - GnomeCmdFile *f = fs->file_list()->get_selected_file(); + GnomeCmdFile *f = fs->list->get_selected_file(); if (f && gnome_cmd_data.cmdline_visibility) { @@ -738,7 +800,7 @@ if (gnome_cmd_data.cmdline_visibility) { - gchar *dpath = gnome_cmd_file_get_real_path (GNOME_CMD_FILE (fs->file_list()->cwd)); + gchar *dpath = gnome_cmd_file_get_real_path (GNOME_CMD_FILE (fs->list->cwd)); gnome_cmd_cmdline_append_text (gnome_cmd_main_win_get_cmdline (main_win), dpath); g_free (dpath); @@ -763,7 +825,7 @@ g_return_if_fail (GNOME_CMD_IS_FILE (f)); g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); - if (fs->file_list()->insert_file(f)) + if (fs->list->insert_file(f)) fs->update_selected_files_label(); } @@ -774,8 +836,8 @@ g_return_if_fail (GNOME_CMD_IS_FILE (f)); g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); - if (fs->file_list()->cwd == dir) - if (fs->file_list()->remove_file(f)) + if (fs->list->cwd == dir) + if (fs->list->remove_file(f)) fs->update_selected_files_label(); } @@ -785,9 +847,9 @@ g_return_if_fail (GNOME_CMD_IS_FILE (f)); g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); - if (fs->file_list()->has_file(f)) + if (fs->list->has_file(f)) { - fs->file_list()->update_file(f); + fs->list->update_file(f); fs->update_selected_files_label(); } } @@ -798,15 +860,15 @@ g_return_if_fail (GNOME_CMD_IS_FILE (f)); g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); - if (fs->file_list()->has_file(f)) + if (fs->list->has_file(f)) { // gnome_cmd_file_invalidate_metadata (f, TAG_FILE); // FIXME: should be handled in GnomeCmdDir, not here - fs->file_list()->update_file(f); + fs->list->update_file(f); - GnomeCmdFileList::ColumnID sort_col = GNOME_CMD_FILE_LIST (fs->file_list())->get_sort_column(); + GnomeCmdFileList::ColumnID sort_col = GNOME_CMD_FILE_LIST (fs->list)->get_sort_column(); if (sort_col==GnomeCmdFileList::COLUMN_NAME || sort_col==GnomeCmdFileList::COLUMN_EXT) - fs->file_list()->sort(); + fs->list->sort(); } } @@ -911,6 +973,23 @@ static void on_realize (GnomeCmdFileSelector *fs, gpointer user_data) { + // 'restore active tab' won't work if below will be uncomented + //if (user_data != NULL) { + //_GnomeCmdFileSelector *_fs = _GNOME_CMD_FILE_SELECTOR (user_data); + + //fs->con_btns_hbox = _fs->con_btns_hbox; + //fs->con_hbox = _fs->con_hbox; + //fs->dir_indicator = _fs->dir_indicator; + //fs->dir_label = _fs->dir_label; + //fs->scrolledwindow = _fs->scrolledwindow; + //fs->info_label = _fs->info_label; + //fs->list_widget = _fs->list_widget; + //fs->con_combo = _fs->con_combo; + //fs->vol_label = _fs->vol_label; + //fs->list = _fs->list; + //fs->priv = _fs->priv; + //} + g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); fs->priv->realized = TRUE; @@ -919,7 +998,6 @@ fs->update_connections(); } - static void on_list_file_clicked (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButton *event, GnomeCmdFileSelector *fs) { if (event->type == GDK_2BUTTON_PRESS && event->button == 1 && gnome_cmd_data.left_mouse_button_mode == GnomeCmdData::LEFT_BUTTON_OPENS_WITH_DOUBLE_CLICK) @@ -977,24 +1055,24 @@ { gtk_widget_set_sensitive (*fs, TRUE); set_cursor_default_for_widget (*fs); - gtk_widget_grab_focus (GTK_WIDGET (fs->file_list())); + gtk_widget_grab_focus (GTK_WIDGET (fs->list)); } - if (fs->file_list()->connected_dir != dir) + if (fs->list->connected_dir != dir) { - if (fs->file_list()->connected_dir != NULL) + if (fs->list->connected_dir != NULL) { - gtk_signal_disconnect_by_func (GTK_OBJECT (fs->file_list()->connected_dir), GTK_SIGNAL_FUNC (on_dir_file_created), fs); - gtk_signal_disconnect_by_func (GTK_OBJECT (fs->file_list()->connected_dir), GTK_SIGNAL_FUNC (on_dir_file_deleted), fs); - gtk_signal_disconnect_by_func (GTK_OBJECT (fs->file_list()->connected_dir), GTK_SIGNAL_FUNC (on_dir_file_changed), fs); - gtk_signal_disconnect_by_func (GTK_OBJECT (fs->file_list()->connected_dir), GTK_SIGNAL_FUNC (on_dir_file_renamed), fs); + gtk_signal_disconnect_by_func (GTK_OBJECT (fs->list->connected_dir), GTK_SIGNAL_FUNC (on_dir_file_created), fs); + gtk_signal_disconnect_by_func (GTK_OBJECT (fs->list->connected_dir), GTK_SIGNAL_FUNC (on_dir_file_deleted), fs); + gtk_signal_disconnect_by_func (GTK_OBJECT (fs->list->connected_dir), GTK_SIGNAL_FUNC (on_dir_file_changed), fs); + gtk_signal_disconnect_by_func (GTK_OBJECT (fs->list->connected_dir), GTK_SIGNAL_FUNC (on_dir_file_renamed), fs); } gtk_signal_connect (GTK_OBJECT (dir), "file-created", GTK_SIGNAL_FUNC (on_dir_file_created), fs); gtk_signal_connect (GTK_OBJECT (dir), "file-deleted", GTK_SIGNAL_FUNC (on_dir_file_deleted), fs); gtk_signal_connect (GTK_OBJECT (dir), "file-changed", GTK_SIGNAL_FUNC (on_dir_file_changed), fs); gtk_signal_connect (GTK_OBJECT (dir), "file-renamed", GTK_SIGNAL_FUNC (on_dir_file_renamed), fs); - fs->file_list()->connected_dir = dir; + fs->list->connected_dir = dir; } gnome_cmd_con_set_cwd (fs->get_connection(), dir); @@ -1012,7 +1090,7 @@ fs->update_direntry(); update_vol_label (fs); - if (fs->file_list()->cwd != dir) return; + if (fs->list->cwd != dir) return; fs->priv->sel_first_file = FALSE; fs->update_files(); @@ -1020,12 +1098,12 @@ if (!fs->priv->active) { - GTK_CLIST (fs->file_list())->focus_row = -1; - gtk_clist_unselect_all (GTK_CLIST (fs->file_list())); + GTK_CLIST (fs->list)->focus_row = -1; + gtk_clist_unselect_all (GTK_CLIST (fs->list)); } if (fs->priv->sel_first_file && fs->priv->active) - gtk_clist_select_row (GTK_CLIST (fs->file_list()), 0, 0); + gtk_clist_select_row (GTK_CLIST (fs->list), 0, 0); fs->update_selected_files_label(); @@ -1053,18 +1131,18 @@ g_free (msg); } - gtk_signal_disconnect_by_data (GTK_OBJECT (fs->file_list()->cwd), fs); - fs->file_list()->connected_dir = NULL; - gnome_cmd_dir_unref (fs->file_list()->cwd); + gtk_signal_disconnect_by_data (GTK_OBJECT (fs->list->cwd), fs); + fs->list->connected_dir = NULL; + gnome_cmd_dir_unref (fs->list->cwd); set_cursor_default_for_widget (GTK_WIDGET (fs)); gtk_widget_set_sensitive (*fs, TRUE); - if (fs->file_list()->lwd && fs->get_connection() == gnome_cmd_dir_get_connection (fs->file_list()->lwd)) + if (fs->list->lwd && fs->get_connection() == gnome_cmd_dir_get_connection (fs->list->lwd)) { - fs->file_list()->cwd = fs->file_list()->lwd; - gtk_signal_connect (GTK_OBJECT (fs->file_list()->cwd), "list-ok", GTK_SIGNAL_FUNC (on_dir_list_ok), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()->cwd), "list-failed", GTK_SIGNAL_FUNC (on_dir_list_failed), fs); - fs->file_list()->lwd = NULL; + fs->list->cwd = fs->list->lwd; + gtk_signal_connect (GTK_OBJECT (fs->list->cwd), "list-ok", GTK_SIGNAL_FUNC (on_dir_list_ok), fs); + gtk_signal_connect (GTK_OBJECT (fs->list->cwd), "list-failed", GTK_SIGNAL_FUNC (on_dir_list_failed), fs); + fs->list->lwd = NULL; } else g_timeout_add (1, (GtkFunction) set_home_connection, fs); @@ -1076,13 +1154,13 @@ { gboolean ret = FALSE; - if (fs->file_list()->key_pressed(event)) + if (fs->list->key_pressed(event)) ret = TRUE; else if (fs->key_pressed(event)) ret = TRUE; else if (gnome_cmd_main_win_keypressed (main_win, event)) ret = TRUE; - else if (gcmd_user_actions.handle_key_event(main_win, fs->file_list(), event)) + else if (gcmd_user_actions.handle_key_event(main_win, fs->list, event)) ret = TRUE; if (ret) @@ -1103,7 +1181,7 @@ static gchar text[2]; if (!gnome_cmd_data.cmdline_visibility) - gnome_cmd_file_list_show_quicksearch (fs->file_list(), (gchar) event->keyval); + gnome_cmd_file_list_show_quicksearch (fs->list, (gchar) event->keyval); else { text[0] = event->keyval; @@ -1133,6 +1211,16 @@ (*GTK_OBJECT_CLASS (parent_class)->destroy) (object); } +static void _destroy (GtkObject *object) +{ + _GnomeCmdFileSelector *fs = _GNOME_CMD_FILE_SELECTOR (object); + + delete fs->priv; + + if (GTK_OBJECT_CLASS (_parent_class)->destroy) + (*GTK_OBJECT_CLASS (_parent_class)->destroy) (object); +} + static void map (GtkWidget *widget) { @@ -1140,13 +1228,18 @@ GTK_WIDGET_CLASS (parent_class)->map (widget); } +static void _map (GtkWidget *widget) +{ + if (GTK_WIDGET_CLASS (_parent_class)->map != NULL) + GTK_WIDGET_CLASS (_parent_class)->map (widget); +} static void class_init (GnomeCmdFileSelectorClass *klass) { GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);; GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - parent_class = (GtkVBoxClass *) gtk_type_class (gtk_vbox_get_type ()); + parent_class = (GtkNotebookClass *) gtk_type_class (gtk_notebook_get_type ()); file_selector_signals[CHANGED_DIR] = gtk_signal_new ("changed-dir", @@ -1162,14 +1255,37 @@ klass->changed_dir = NULL; } - -static void init (GnomeCmdFileSelector *fs) +static void _class_init (_GnomeCmdFileSelectorClass *klass) { - GtkWidget *padding; + GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);; + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - fs->priv = new GnomeCmdFileSelector::Private; + _parent_class = (GtkVBoxClass *) gtk_type_class (gtk_vbox_get_type ()); + + file_selector_signals[CHANGED_DIR] = + gtk_signal_new ("changed-dir", + GTK_RUN_LAST, + G_OBJECT_CLASS_TYPE (object_class), + GTK_SIGNAL_OFFSET (_GnomeCmdFileSelectorClass, changed_dir), + gtk_marshal_NONE__POINTER, + GTK_TYPE_NONE, + 1, GTK_TYPE_POINTER); - GtkVBox *vbox = GTK_VBOX (fs); + object_class->destroy = _destroy; + widget_class->map = ::_map; + klass->changed_dir = NULL; +} + +static void _new_empty_tab(GnomeCmdFileSelector* fs, gchar* tab_title = "") { + GtkWidget *padding; + + // tab content + _GnomeCmdFileSelector *_fs = (_GnomeCmdFileSelector *) gtk_type_new (_gnome_cmd_file_selector_get_type ()); + + fs->priv = new GnomeCmdFileSelector::Private; + fs->vbox = GTK_VBOX(_fs); + gtk_notebook_append_page(GTK_NOTEBOOK(fs), GTK_WIDGET(fs->vbox), gtk_label_new(tab_title)); + gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(fs),GTK_WIDGET(fs->vbox),TRUE); // create the box used for packing the dir_combo and buttons fs->update_conbuttons_visibility(); @@ -1178,16 +1294,19 @@ fs->con_hbox = create_hbox (*fs, FALSE, 2); // create the list - fs->file_list() = new GnomeCmdFileList; // FIXME: file_list() = ... - fs->list_widget = GTK_WIDGET (fs->file_list()); + fs->list = new GnomeCmdFileList; // FIXME: file_list() = ... + GnomeCmdFileList* list = fs->list; // test + GtkWidget* list_widget = (GtkWidget *)fs->list; // test + + fs->list_widget = GTK_WIDGET(list); gtk_widget_ref (fs->list_widget); - gtk_object_set_data_full (GTK_OBJECT (fs), "list_widget", fs->list_widget, (GtkDestroyNotify) gtk_widget_unref); - fs->file_list()->show_column(GnomeCmdFileList::COLUMN_DIR, FALSE); + gtk_object_set_data_full (GTK_OBJECT (_fs), "list_widget", fs->list_widget, (GtkDestroyNotify) gtk_widget_unref); + fs->list->show_column(GnomeCmdFileList::COLUMN_DIR, FALSE); // create the connection combo fs->con_combo = gnome_cmd_combo_new (2, 1, NULL); gtk_widget_ref (fs->con_combo); - gtk_object_set_data_full (GTK_OBJECT (fs), "con_combo", fs->con_combo, (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data_full (GTK_OBJECT (_fs), "con_combo", fs->con_combo, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_set_size_request (fs->con_combo, 150, -1); gtk_clist_set_row_height (GTK_CLIST (GNOME_CMD_COMBO (fs->con_combo)->list), 20); gtk_entry_set_editable (GTK_ENTRY (GNOME_CMD_COMBO (fs->con_combo)->entry), FALSE); @@ -1198,20 +1317,20 @@ // create the free space on volume label fs->vol_label = gtk_label_new (""); gtk_widget_ref (fs->vol_label); - gtk_object_set_data_full (GTK_OBJECT (fs), "vol_label", fs->vol_label, (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data_full (GTK_OBJECT (_fs), "vol_label", fs->vol_label, (GtkDestroyNotify) gtk_widget_unref); gtk_misc_set_alignment (GTK_MISC (fs->vol_label), 1, 0.5); // create the directory indicator fs->dir_indicator = gnome_cmd_dir_indicator_new (fs); gtk_widget_ref (fs->dir_indicator); - gtk_object_set_data_full (GTK_OBJECT (fs), + gtk_object_set_data_full (GTK_OBJECT (_fs), "dir_indicator", fs->dir_indicator, (GtkDestroyNotify) gtk_widget_unref); // create the scrollwindow that we'll place the list in fs->scrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (fs->scrolledwindow); - gtk_object_set_data_full (GTK_OBJECT (fs), + gtk_object_set_data_full (GTK_OBJECT (_fs), "scrolledwindow", fs->scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (fs->scrolledwindow), @@ -1220,17 +1339,17 @@ // create the info label fs->info_label = gtk_label_new ("not initialized"); gtk_widget_ref (fs->info_label); - gtk_object_set_data_full (GTK_OBJECT (fs), "infolabel", fs->info_label, + gtk_object_set_data_full (GTK_OBJECT (_fs), "infolabel", fs->info_label, (GtkDestroyNotify) gtk_widget_unref); gtk_misc_set_alignment (GTK_MISC (fs->info_label), 0.0f, 0.5f); // pack the widgets - gtk_box_pack_start (GTK_BOX (fs), fs->con_hbox, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), fs->dir_indicator, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (fs->vbox), fs->con_hbox, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (fs->vbox), fs->dir_indicator, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER (fs->scrolledwindow), fs->list_widget); - gtk_box_pack_start (GTK_BOX (vbox), fs->scrolledwindow, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (fs->vbox), fs->scrolledwindow, TRUE, TRUE, 0); padding = create_hbox (*fs, FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), padding, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (fs->vbox), padding, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (padding), fs->info_label, FALSE, TRUE, 6); gtk_box_pack_start (GTK_BOX (fs->con_hbox), fs->con_combo, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (fs->con_hbox), fs->vol_label, TRUE, TRUE, 6); @@ -1239,24 +1358,26 @@ init_dnd (fs); // connect signals - gtk_signal_connect (GTK_OBJECT (fs), "realize", GTK_SIGNAL_FUNC (on_realize), fs); + //gtk_signal_connect (GTK_OBJECT (_fs), "realize", GTK_SIGNAL_FUNC (_on_realize), fs); + gtk_signal_connect (GTK_OBJECT (fs), "realize", GTK_SIGNAL_FUNC (on_realize), _fs); gtk_signal_connect (GTK_OBJECT (fs->con_combo), "item-selected", GTK_SIGNAL_FUNC (on_con_combo_item_selected), fs); gtk_signal_connect (GTK_OBJECT (fs->con_combo), "popwin-hidden", GTK_SIGNAL_FUNC (on_combo_popwin_hidden), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "file-clicked", GTK_SIGNAL_FUNC (on_list_file_clicked), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "file-released", GTK_SIGNAL_FUNC (on_list_file_released), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "list-clicked", GTK_SIGNAL_FUNC (on_list_list_clicked), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "empty-space-clicked", GTK_SIGNAL_FUNC (on_list_empty_space_clicked), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "files-changed", GTK_SIGNAL_FUNC (on_list_files_changed), fs); + gtk_signal_connect (GTK_OBJECT (fs->list_widget), "file-clicked", GTK_SIGNAL_FUNC (on_list_file_clicked), fs); + gtk_signal_connect (GTK_OBJECT (fs->list_widget), "file-released", GTK_SIGNAL_FUNC (on_list_file_released), fs); + gtk_signal_connect (GTK_OBJECT (fs->list_widget), "list-clicked", GTK_SIGNAL_FUNC (on_list_list_clicked), fs); + gtk_signal_connect (GTK_OBJECT (fs->list_widget), "empty-space-clicked", GTK_SIGNAL_FUNC (on_list_empty_space_clicked), fs); + gtk_signal_connect (GTK_OBJECT (fs->list_widget), "files-changed", GTK_SIGNAL_FUNC (on_list_files_changed), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "key-press-event", GTK_SIGNAL_FUNC (on_list_key_pressed), fs); - gtk_signal_connect (GTK_OBJECT (fs->file_list()), "key-press-event", GTK_SIGNAL_FUNC (on_list_key_pressed_private), fs); + gtk_signal_connect (GTK_OBJECT (fs->list_widget), "key-press-event", GTK_SIGNAL_FUNC (on_list_key_pressed), fs); + gtk_signal_connect (GTK_OBJECT (fs->list_widget), "key-press-event", GTK_SIGNAL_FUNC (on_list_key_pressed_private), fs); gtk_signal_connect (GTK_OBJECT (gnome_cmd_con_list_get ()), "list-changed", GTK_SIGNAL_FUNC (on_con_list_list_changed), fs); + // show the widgets - gtk_widget_show (GTK_WIDGET (vbox)); + gtk_widget_show (GTK_WIDGET (fs->vbox)); fs->update_concombo_visibility(); gtk_widget_show (fs->con_combo); gtk_widget_show (fs->vol_label); @@ -1265,10 +1386,217 @@ gtk_widget_show (fs->list_widget); gtk_widget_show (fs->info_label); - fs->update_style(); + fs->update_style(); + + // copy values to intenal clone + _fs->priv = fs->priv; + _fs->con_btns_hbox = fs->con_btns_hbox; + _fs->con_hbox = fs->con_hbox; + _fs->dir_indicator = fs->dir_indicator; + _fs->dir_label = fs->dir_label; + _fs->scrolledwindow = fs->scrolledwindow; + _fs->info_label = fs->info_label; + _fs->list_widget = fs->list_widget; + _fs->con_combo = fs->con_combo; + _fs->vol_label = fs->vol_label; + _fs->list = fs->list; + + // increase all ref as we have two clones of one object + gtk_widget_ref (fs->con_btns_hbox); + gtk_widget_ref (fs->con_hbox); + gtk_widget_ref (fs->dir_label); + + gtk_widget_ref (fs->list_widget); + gtk_widget_ref (fs->con_combo); + gtk_widget_ref (fs->vol_label); + gtk_widget_ref (fs->dir_indicator); + gtk_widget_ref (fs->scrolledwindow); + gtk_widget_ref (fs->info_label); + + // set last page as active (needed for proper initialization) + gint page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(fs)); + gtk_notebook_set_current_page(GTK_NOTEBOOK(fs), page_count - 1); +} + +void GnomeCmdFileSelector::new_tab(const gchar *in_dir = NULL) { + // get current directory + GnomeCmdCon* con; + GnomeCmdDir* dir; + con = get_connection(); + dir = get_directory(); + + // TODO: dublicated code from _update_cur_tab_title + // combine current tab title + gchar* full_path = gnome_cmd_file_get_path(GNOME_CMD_FILE(get_directory())); + gchar* dir_name = g_path_get_basename(full_path); + guint max_dir_name = 12; // limit max title length + gchar new_dir_name[max_dir_name]; // buffer for dir name + if (g_utf8_strlen(dir_name, -1) >= max_dir_name) { // strings may be not only in english + // copy to buffer and cut string if too long + g_utf8_strncpy(new_dir_name, dir_name, max_dir_name - 3); + // if string too short add spaces to end + g_strlcat(new_dir_name, "...", max_dir_name); + } else { + // copy to buffer and cut string if too long + g_utf8_strncpy(new_dir_name, dir_name, sizeof(new_dir_name)); + // if string too short add spaces to end + g_strlcat(new_dir_name, " ", sizeof(new_dir_name)); + } + + // create tab + _new_empty_tab(this, new_dir_name); + + // TODO: dublicated code from on_realize, realize event won't work + // initialize with default values + g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (this)); + priv->realized = TRUE; + create_con_buttons (this); + update_connections(); // initialize connections dropdown box + + if (in_dir == NULL) // if null - create clone of current tab + set_connection(con, dir); // initialize all other widgets + else { + set_connection(get_home_con()); + goto_directory(in_dir); + } + + g_free(full_path); + g_free(dir_name); +} + +void GnomeCmdFileSelector::_update_cur_tab_title() { + // set current tab label + gchar* full_path = gnome_cmd_file_get_path(GNOME_CMD_FILE(get_directory())); + gchar* dir_name = g_path_get_basename(full_path); + guint max_dir_name = 12; // limit max dir length in bytes + gchar new_dir_name[max_dir_name]; // buffer for dir name + if (g_utf8_strlen(dir_name, -1) >= max_dir_name) { // strings may be not only in english + // copy to buffer and cut string if too long + g_utf8_strncpy(new_dir_name, dir_name, max_dir_name - 3); + // if string too short add spaces to end + g_strlcat(new_dir_name, "...", max_dir_name); + } else { + // copy to buffer and cut string if too long + g_utf8_strncpy(new_dir_name, dir_name, sizeof(new_dir_name)); + // if string too short add spaces to end + g_strlcat(new_dir_name, " ", sizeof(new_dir_name)); + } + + GtkWidget* cur_tab = gtk_notebook_get_nth_page(GTK_NOTEBOOK(this), cur_page_num); + gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(this), cur_tab, new_dir_name); + g_free(full_path); + g_free(dir_name); +} + +// same as switching tab +void GnomeCmdFileSelector::_change_state(guint page_num) +{ + GnomeCmdFileSelector* fs = this; + _GnomeCmdFileSelector* _fs = _GNOME_CMD_FILE_SELECTOR( + gtk_notebook_get_nth_page(GTK_NOTEBOOK(fs), page_num)); + + // copy values from internal clone + fs->priv = _fs->priv; + fs->con_btns_hbox = _fs->con_btns_hbox; + fs->con_hbox = _fs->con_hbox; + fs->dir_indicator = _fs->dir_indicator; + fs->dir_label = _fs->dir_label; + fs->scrolledwindow = _fs->scrolledwindow; + fs->info_label = _fs->info_label; + fs->list_widget = _fs->list_widget; + fs->con_combo = _fs->con_combo; + fs->vol_label = _fs->vol_label; + fs->list = _fs->list; +} + + +static void on_gnome_cmd_file_selector_page_switch(GtkNotebook* notebook, GtkNotebookPage *page, + guint page_num, gpointer user_data) +{ + GnomeCmdFileSelector* fs = GNOME_CMD_FILE_SELECTOR(notebook); + fs->_change_state(page_num); + //gnome_cmd_main_win_switch_fs(main_win, fs); // move to the on click event + fs->set_active(TRUE); // show selection only on one side in same time + + fs->cur_page_num = page_num; + } +static gboolean on_gnome_cmd_file_selector_key_press(GtkWidget *fs, GdkEventKey *event, + gpointer user_data) +{ + if (state_is_ctrl(event->state)) + { + switch (event->keyval) + { + case GDK_T: + case GDK_t: + GNOME_CMD_FILE_SELECTOR(fs)->new_tab(); + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(fs), TRUE); + return TRUE; + case GDK_W: + case GDK_w: + gint page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(fs)); + gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(fs)); + if (page_count > 1) + gtk_notebook_remove_page(GTK_NOTEBOOK(fs), page_num); + if (page_count == 2) + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(fs), FALSE); + return TRUE; + } + } + return FALSE; +} + +static void on_gnome_cmd_file_selector_destroy(GtkWidget* window, gpointer user_data) { + // save paths of each tab + + GnomeCmdFileSelector* fs = GNOME_CMD_FILE_SELECTOR(user_data); + + gint tab_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(user_data)); + gchar comb_path[] = "/options/start_dir_left_or_right"; // any string longer enough + gchar num_str[] = "99"; + + // save tab count + sprintf(comb_path, "/options/tab_count_%s", fs->position == LEFT ? "left" : "right"); + sprintf(num_str, "%u", tab_count); + gnome_cmd_data_set_string(comb_path, num_str); + + // save each tab path + for(uint i = 0; i < tab_count; i++) { + fs->_change_state(i); + + sprintf(comb_path, "/options/start_dir_%s_%u", fs->position == LEFT ? "left" : "right", i); + gnome_cmd_data_set_string (comb_path, gnome_cmd_file_get_path(GNOME_CMD_FILE (fs->get_directory()))); + } + + // save num of active tab + gint cur_tab_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(fs)); + sprintf(comb_path, "/options/cur_tab_num_%s", fs->position == LEFT ? "left" : "right"); + sprintf(num_str, "%i", cur_tab_num); + gnome_cmd_data_set_string (comb_path, num_str); +} + +static void init (GnomeCmdFileSelector *fs) +{ + fs->initialized = FALSE; + fs->cur_page_num = 0; + + _new_empty_tab(fs); + + gtk_signal_connect (GTK_OBJECT (fs), "switch-page", GTK_SIGNAL_FUNC (on_gnome_cmd_file_selector_page_switch), fs); + gtk_signal_connect (GTK_OBJECT (fs), "key-press-event", GTK_SIGNAL_FUNC (on_gnome_cmd_file_selector_key_press), fs); + gtk_signal_connect (GTK_OBJECT (main_win), "destroy", GTK_SIGNAL_FUNC (on_gnome_cmd_file_selector_destroy), fs); + + g_object_set(fs, "scrollable" , TRUE); + //g_object_set(fs, "homogeneous", TRUE, "scrollable" , TRUE); +} + +static void _init (_GnomeCmdFileSelector *fs) +{ + fs->priv = new GnomeCmdFileSelector::Private; +} /*********************************** * Public functions @@ -1292,6 +1620,29 @@ (GtkClassInitFunc) NULL }; + fs_type = gtk_type_unique (gtk_notebook_get_type (), &fs_info); + } + return fs_type; +} + +GtkType _gnome_cmd_file_selector_get_type () +{ + static GtkType fs_type = 0; + + if (fs_type == 0) + { + GtkTypeInfo fs_info = + { + "_GnomeCmdFileSelector", + sizeof (_GnomeCmdFileSelector), + sizeof (_GnomeCmdFileSelectorClass), + (GtkClassInitFunc) _class_init, + (GtkObjectInitFunc) _init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL + }; + fs_type = gtk_type_unique (gtk_vbox_get_type (), &fs_info); } return fs_type; @@ -1320,14 +1671,14 @@ void gnome_cmd_file_selector_start_editor (GnomeCmdFileSelector *fs) { g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs)); - g_return_if_fail (GNOME_CMD_IS_DIR (fs->file_list()->cwd)); + g_return_if_fail (GNOME_CMD_IS_DIR (fs->list->cwd)); if (!fs->is_local()) return; // create a command with an empty argument to the editor gchar *cmd = g_strdup_printf (gnome_cmd_data.get_editor(), ""); - gchar *dpath = gnome_cmd_file_get_real_path (GNOME_CMD_FILE (fs->file_list()->cwd)); + gchar *dpath = gnome_cmd_file_get_real_path (GNOME_CMD_FILE (fs->list->cwd)); run_command_indir (cmd, dpath, FALSE); @@ -1575,79 +1926,110 @@ fs->set_active(fs_is_active); } - void GnomeCmdFileSelector::update_connections() { - if (!priv->realized) - return; - - gboolean found_my_con = FALSE; - - gnome_cmd_combo_clear (GNOME_CMD_COMBO (con_combo)); - GNOME_CMD_COMBO (con_combo)->highest_pixmap = 20; - GNOME_CMD_COMBO (con_combo)->widest_pixmap = 20; - gtk_clist_set_row_height (GTK_CLIST (GNOME_CMD_COMBO (con_combo)->list), 20); - gtk_clist_set_column_width (GTK_CLIST (GNOME_CMD_COMBO (con_combo)->list), 0, 20); - - for (GList *l=gnome_cmd_con_list_get_all (gnome_cmd_con_list_get ()); l; l = l->next) - { - gchar *text[3]; - GnomeCmdCon *con = (GnomeCmdCon *) l->data; - - if (!gnome_cmd_con_is_open (con) && !GNOME_CMD_IS_CON_DEVICE (con) - && !GNOME_CMD_IS_CON_SMB (con)) continue; - - if (con == get_connection()) - found_my_con = TRUE; - - text[0] = NULL; - text[1] = (gchar *) gnome_cmd_con_get_alias (con); - text[2] = NULL; - - GnomeCmdPixmap *pixmap = gnome_cmd_con_get_go_pixmap (con); - - if (pixmap) - { - gint row = gnome_cmd_combo_append (GNOME_CMD_COMBO (con_combo), text, con); - - gnome_cmd_combo_set_pixmap (GNOME_CMD_COMBO (con_combo), row, 0, pixmap); - } - } - - // If the connection is no longer available use the home connection - if (!found_my_con) - set_connection(get_home_con ()); - else - gnome_cmd_combo_select_data (GNOME_CMD_COMBO (con_combo), get_connection()); - - create_con_buttons (this); -} - - -void GnomeCmdFileSelector::set_connection (GnomeCmdCon *con, GnomeCmdDir *start_dir) -{ - g_return_if_fail (GNOME_CMD_IS_CON (con)); + if (!priv->realized) + return; - if (get_connection() == con) - { - if (!gnome_cmd_con_should_remember_dir (con)) - set_directory (gnome_cmd_con_get_default_dir (con)); - return; - } - - if (!gnome_cmd_con_is_open (con)) - { - gtk_signal_connect (GTK_OBJECT (con), "open-done", GTK_SIGNAL_FUNC (on_con_open_done), this); - gtk_signal_connect (GTK_OBJECT (con), "open-failed", GTK_SIGNAL_FUNC (on_con_open_failed), this); - priv->con_opening = con; - - create_con_open_progress_dialog (this); - g_timeout_add (gnome_cmd_data.gui_update_rate, (GSourceFunc) update_con_open_progress, this); - - gnome_cmd_con_open (con); - } - else - ::set_connection (this, con, start_dir); + // init all tabs + if (initialized == FALSE) { + initialized = TRUE; // initialization is done + gint page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(this)); + + for(uint i = 0; i < page_count; i++) { + _change_state(i); + _update_connections(); + } + + } else _update_connections(); +} + +void GnomeCmdFileSelector::_update_connections() { + + gboolean found_my_con = FALSE; + + gnome_cmd_combo_clear (GNOME_CMD_COMBO (con_combo)); + GNOME_CMD_COMBO (con_combo)->highest_pixmap = 20; + GNOME_CMD_COMBO (con_combo)->widest_pixmap = 20; + gtk_clist_set_row_height (GTK_CLIST (GNOME_CMD_COMBO (con_combo)->list), 20); + gtk_clist_set_column_width (GTK_CLIST (GNOME_CMD_COMBO (con_combo)->list), 0, 20); + + for (GList *l=gnome_cmd_con_list_get_all (gnome_cmd_con_list_get ()); l; l = l->next) + { + gchar *text[3]; + GnomeCmdCon *con = (GnomeCmdCon *) l->data; + + if (!gnome_cmd_con_is_open (con) && !GNOME_CMD_IS_CON_DEVICE (con) + && !GNOME_CMD_IS_CON_SMB (con)) continue; + + if (con == get_connection()) + found_my_con = TRUE; + + text[0] = NULL; + text[1] = (gchar *) gnome_cmd_con_get_alias (con); + text[2] = NULL; + + GnomeCmdPixmap *pixmap = gnome_cmd_con_get_go_pixmap (con); + + if (pixmap) + { + gint row = gnome_cmd_combo_append (GNOME_CMD_COMBO (con_combo), text, con); + + gnome_cmd_combo_set_pixmap (GNOME_CMD_COMBO (con_combo), row, 0, pixmap); + } + } + + // If the connection is no longer available use the home connection + if (!found_my_con) + ;//set_connection(get_home_con ()); // HACK: don't set dir in this step + else + gnome_cmd_combo_select_data (GNOME_CMD_COMBO (con_combo), get_connection()); + + create_con_buttons (this); +} + + + +void GnomeCmdFileSelector::set_connection(GnomeCmdCon *con, GnomeCmdDir *start_dir) +{ + // initialize all tabs + if (initialized == FALSE) { + gint page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(this)); + + // initialize each tab + for(uint i = 0; i < page_count; i++) { + _change_state(i); + _set_connection(con, start_dir); + } + + } else _set_connection(con, start_dir); +} + + +void GnomeCmdFileSelector::_set_connection (GnomeCmdCon *con, GnomeCmdDir *start_dir) +{ + g_return_if_fail (GNOME_CMD_IS_CON (con)); + + if (get_connection() == con) + { + if (!gnome_cmd_con_should_remember_dir (con)) + set_directory (gnome_cmd_con_get_default_dir (con)); + return; + } + + if (!gnome_cmd_con_is_open (con)) + { + gtk_signal_connect (GTK_OBJECT (con), "open-done", GTK_SIGNAL_FUNC (on_con_open_done), this); + gtk_signal_connect (GTK_OBJECT (con), "open-failed", GTK_SIGNAL_FUNC (on_con_open_failed), this); + priv->con_opening = con; + + create_con_open_progress_dialog (this); + g_timeout_add (gnome_cmd_data.gui_update_rate, (GSourceFunc) update_con_open_progress, this); + + gnome_cmd_con_open (con); + } + else + ::set_connection (this, con, start_dir); } @@ -1718,13 +2100,13 @@ return FALSE; } - GnomeVFSURI *uri = gnome_cmd_dir_get_child_uri (fs->file_list()->cwd, name); + GnomeVFSURI *uri = gnome_cmd_dir_get_child_uri (fs->list->cwd, name); GnomeVFSResult result = gnome_vfs_create_symbolic_link (uri, gnome_cmd_file_get_uri_str (fs->priv->sym_file)); if (result == GNOME_VFS_OK) { gchar *uri_str = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE); - gnome_cmd_dir_file_created (fs->file_list()->cwd, uri_str); + gnome_cmd_dir_file_created (fs->list->cwd, uri_str); g_free (uri_str); gnome_vfs_uri_unref (uri); return TRUE; @@ -1930,7 +2312,7 @@ gchar *fname = get_utf8 (gnome_cmd_file_get_name (f)); gchar *symlink_name = g_strdup_printf (gnome_cmd_data_get_symlink_prefix (), fname); - GnomeVFSURI *uri = gnome_cmd_dir_get_child_uri (fs->file_list()->cwd, symlink_name); + GnomeVFSURI *uri = gnome_cmd_dir_get_child_uri (fs->list->cwd, symlink_name); g_free (fname); g_free (symlink_name); @@ -1944,7 +2326,7 @@ if (result == GNOME_VFS_OK) { gchar *uri_str = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE); - gnome_cmd_dir_file_created (fs->file_list()->cwd, uri_str); + gnome_cmd_dir_file_created (fs->list->cwd, uri_str); g_free (uri_str); } else @@ -2031,7 +2413,7 @@ gtk_box_pack_start (GTK_BOX (priv->filter_box), entry, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (priv->filter_box), close_btn, FALSE, TRUE, 0); - gtk_box_pack_start (*this, priv->filter_box, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX(this->vbox), priv->filter_box, FALSE, TRUE, 0); gtk_widget_grab_focus (entry); }