Yasumichi Akahoshi
yasum****@users*****
2005年 10月 15日 (土) 00:07:42 JST
Index: cxplorer/src/cxp-right-pane.c diff -u cxplorer/src/cxp-right-pane.c:1.94.2.1 cxplorer/src/cxp-right-pane.c:1.94.2.2 --- cxplorer/src/cxp-right-pane.c:1.94.2.1 Fri Oct 14 17:11:46 2005 +++ cxplorer/src/cxp-right-pane.c Sat Oct 15 00:07:42 2005 @@ -101,6 +101,10 @@ GtkCellRenderer * cell, GtkTreeModel * tree_model, GtkTreeIter * iter, gpointer data); +static void cxp_right_pane_draw_place (GtkTreeViewColumn * tree_column, + GtkCellRenderer * cell, + GtkTreeModel * tree_model, + GtkTreeIter * iter, gpointer data); static void cxp_right_pane_draw_filetype (GtkTreeViewColumn * tree_column, GtkCellRenderer * cell, GtkTreeModel * tree_model, @@ -375,6 +379,8 @@ column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Filename")); gtk_tree_view_column_set_resizable (column, TRUE); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (column, 150); gtk_tree_view_append_column (GTK_TREE_VIEW (file_list), column); renderer = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_start (column, renderer, FALSE); @@ -394,6 +400,20 @@ G_CALLBACK (cxp_right_pane_cell_edited), self); /* 2nd column */ + column = gtk_tree_view_column_new (); + gtk_tree_view_column_set_title (column, _("Place")); + gtk_tree_view_column_set_resizable (column, TRUE); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (column, 150); + gtk_tree_view_append_column (GTK_TREE_VIEW (file_list), column); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer, + cxp_right_pane_draw_place, + self, NULL); + gtk_tree_view_column_set_visible (column, FALSE); + + /* 3rd column */ renderer = gtk_cell_renderer_text_new (); g_object_set (renderer, "xalign", 1.0, NULL); column = gtk_tree_view_column_new_with_attributes (_("Size"), renderer, @@ -404,7 +424,7 @@ gtk_tree_view_column_set_sort_column_id (column, SORT_ID_SIZE); gtk_tree_view_append_column (GTK_TREE_VIEW (file_list), column); - /* 3rd column */ + /* 4th column */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Type"), renderer, NULL); @@ -417,7 +437,7 @@ gtk_tree_view_column_set_sort_column_id (column, SORT_ID_TYPE); gtk_tree_view_append_column (GTK_TREE_VIEW (file_list), column); - /* 4th column */ + /* 5th column */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Update Time"), renderer, NULL); @@ -612,6 +632,26 @@ g_free (fullpath); } +static void cxp_right_pane_draw_place (GtkTreeViewColumn * tree_column, + GtkCellRenderer * cell, + GtkTreeModel * tree_model, + GtkTreeIter * iter, gpointer data) +{ + gchar *fullpath; + gchar *place; + + gtk_tree_model_get (tree_model, iter, FILE_LIST_COL_FULLPATH, &fullpath, + -1); + if ((place = cxp_path_get_dirname_of_utf8 (fullpath)) == NULL) + { + place = g_strdup (_("(Invalid filename)")); + } + + g_object_set (cell, "text", place, NULL); + + g_free (fullpath); +} + static void cxp_right_pane_draw_filetype (GtkTreeViewColumn * tree_column, GtkCellRenderer * cell, GtkTreeModel * tree_model, @@ -1075,10 +1115,13 @@ gchar *fullpath; GDir *dir; GtkTreeView *file_list; + GtkTreeViewColumn *column; GtkTreeModel *model; GtkTextBuffer *text_buffer; gboolean show_dot_file; + column = gtk_tree_view_get_column (GTK_TREE_VIEW(priv->file_list), 1); + gtk_tree_view_column_set_visible (column, FALSE); cur_dir = g_strdup (dirname); show_dot_file = gconf_client_get_bool (priv->client, @@ -1653,3 +1696,56 @@ return result; } + +void cxp_right_pane_search_file (CxpRightPane *right_pane, const gchar *cmd) +{ + CxpRightPanePrivate *priv = CXP_RIGHT_PANE_GET_PRIVATE (right_pane); + GIOChannel *channel; + GPid pid; + GtkTreeModel *model; + GtkTreeViewColumn *column; + GtkTreeIter iter; + gchar **args; + gchar *line; + gint sout; + GError *error = NULL; + + column = gtk_tree_view_get_column (GTK_TREE_VIEW(priv->file_list), 1); + gtk_tree_view_column_set_visible (column, TRUE); + + model = gtk_tree_view_get_model (GTK_TREE_VIEW(priv->file_list)); + g_object_ref (model); + gtk_tree_view_set_model (GTK_TREE_VIEW(priv->file_list), NULL); + cxp_file_list_store_clear (CXP_FILE_LIST_STORE (model)); + gtk_tree_view_set_model (GTK_TREE_VIEW(priv->file_list), model); + g_object_unref (model); + + if (g_shell_parse_argv (cmd, NULL, &args, NULL)) + { + if (g_spawn_async_with_pipes (NULL, args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, NULL, &sout, NULL, &error)) + { + channel = g_io_channel_unix_new (sout); + g_io_channel_set_encoding (channel, NULL, NULL); + + while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL) == G_IO_STATUS_NORMAL) + { + g_strchomp (line); + cxp_file_list_store_append_file (CXP_FILE_LIST_STORE(model), line, &iter); + if (GTK_WIDGET_VISIBLE(priv->file_list) && GTK_WIDGET_DRAWABLE(priv->file_list)) + gdk_window_process_updates(priv->file_list->window, FALSE); + g_free (line); + } + g_io_channel_shutdown (channel, FALSE, NULL); + g_io_channel_unref (channel); + g_spawn_close_pid (pid); + } + else + { + g_warning ("%s\n", error->message); + } + } + else + { + g_warning ("%s\n", error->message); + } +} Index: cxplorer/src/cxp-right-pane.h diff -u cxplorer/src/cxp-right-pane.h:1.18 cxplorer/src/cxp-right-pane.h:1.18.2.1 --- cxplorer/src/cxp-right-pane.h:1.18 Sun Oct 2 02:50:01 2005 +++ cxplorer/src/cxp-right-pane.h Sat Oct 15 00:07:42 2005 @@ -60,5 +60,6 @@ void cxp_right_pane_send_file_to_command (CxpRightPane *right_pane, const gchar *cmd); void cxp_right_pane_set_cmd_request (CxpRightPane *right_pane); void cxp_right_pane_set_popup_menu (CxpRightPane *right_pane, GtkWidget *popup_menu); +void cxp_right_pane_search_file (CxpRightPane *right_pane, const gchar *cmd); #endif /* CXP_RIGHT_PANE_H */ Index: cxplorer/src/cxplorer-window.c diff -u cxplorer/src/cxplorer-window.c:1.67.2.1 cxplorer/src/cxplorer-window.c:1.67.2.2 --- cxplorer/src/cxplorer-window.c:1.67.2.1 Fri Oct 14 17:11:46 2005 +++ cxplorer/src/cxplorer-window.c Sat Oct 15 00:07:42 2005 @@ -93,6 +93,7 @@ static void cxplorer_window_dispose (GObject * obj); static void cxplorer_window_finalize (GObject * obj); static void cxplorer_window_entry_activate (GtkWidget *widget, gpointer user_data); +static void cxplorer_window_search_entry_activate (GtkWidget *widget, gpointer user_data); static void cxplorer_window_on_directory_changed (CxpDirView * dirview, gpointer user_data); static void cxplorer_window_on_dir_double_clicked (CxpRightPane * right_pane, @@ -257,7 +258,10 @@ gtk_box_pack_start (GTK_BOX (hbox), private->scombo, FALSE, FALSE, 0); gtk_combo_box_append_text (GTK_COMBO_BOX(private->scombo), "find"); gtk_combo_box_append_text (GTK_COMBO_BOX(private->scombo), "locate"); + /* gtk_combo_box_append_text (GTK_COMBO_BOX(private->scombo), "namazu"); + */ + gtk_combo_box_set_active (GTK_COMBO_BOX(private->scombo), 0); gtk_widget_show (private->scombo); private->sentry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (hbox), private->sentry, FALSE, FALSE, 0); @@ -315,6 +319,9 @@ g_signal_connect (entry, "activate", G_CALLBACK (cxplorer_window_entry_activate), self); + g_signal_connect (private->sentry, "activate", + G_CALLBACK (cxplorer_window_search_entry_activate), + self); g_signal_connect (dirview, "directory_changed", G_CALLBACK (cxplorer_window_on_directory_changed), self); @@ -547,6 +554,41 @@ return window; } +static void cxplorer_window_search_entry_activate (GtkWidget *widget, gpointer user_data) +{ + CxplorerWindowPrivate *private = CXPLORER_WINDOW_GET_PRIVATE (user_data); + const gchar *pattern; + gchar *pat_locale; + gchar *cmd; + gchar *cur_dir; + gint index; + + pattern = gtk_entry_get_text (GTK_ENTRY(private->sentry)); + pat_locale = g_locale_from_utf8 (pattern, -1, NULL, NULL, NULL); + index = gtk_combo_box_get_active (GTK_COMBO_BOX(private->scombo)); + switch (index) + { + case 0: + cur_dir = cxp_dir_view_get_current_directory (CXP_DIR_VIEW(private->dirview)); + cmd = g_strdup_printf("find '%s' -iname '%s'", cur_dir, pat_locale); + g_free (cur_dir); + break; + case 1: + cmd = g_strdup_printf("locate '%s'", pat_locale); + break; + /* + case 2: + cmd = g_strdup_printf("namazu --list '%s'", pat_locale); + break; + */ + default: + return; + } + cxp_right_pane_search_file (CXP_RIGHT_PANE(private->right_pane), cmd); + g_free (cmd); + g_free (pat_locale); +} + /** * This function is called back when value of TextEntry is changed by user. * @param gwCaller [in] GtkWidget which call this function.