Yasumichi Akahoshi
yasum****@users*****
2005年 9月 26日 (月) 14:26:52 JST
Index: cxplorer/src/cxp-right-pane.c diff -u cxplorer/src/cxp-right-pane.c:1.72 cxplorer/src/cxp-right-pane.c:1.73 --- cxplorer/src/cxp-right-pane.c:1.72 Fri Sep 23 02:05:09 2005 +++ cxplorer/src/cxp-right-pane.c Mon Sep 26 14:26:52 2005 @@ -133,6 +133,8 @@ GtkTreePath * path, GtkTreeIter * iter, gpointer userdata); +void cxp_right_pane_drag_data_get(GtkWidget *widget, GdkDragContext *dc, GtkSelectionData *selection_data, guint info, guint t, gpointer data); +void cxp_right_pane_drag_data_delete (GtkWidget *widget, GdkDragContext *dc, gpointer data); GType cxp_right_pane_get_type (void) { @@ -218,6 +220,7 @@ priv->file_list = cxp_right_pane_file_list_new (self); gtk_container_add (GTK_CONTAINER (scrolled_window), priv->file_list); gtk_widget_show (priv->file_list); + gtk_drag_source_set(priv->file_list, GDK_BUTTON1_MASK, cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); priv->expander = gtk_expander_new (_("<b>Preview</b>")); gtk_expander_set_use_markup (GTK_EXPANDER (priv->expander), TRUE); @@ -246,6 +249,10 @@ G_CALLBACK (cxp_right_pane_on_cursor_changed), self); g_signal_connect (priv->file_list, "row_activated", G_CALLBACK (cxp_right_pane_on_row_activated), self); + g_signal_connect (priv->file_list, "drag_data_get", + G_CALLBACK (cxp_right_pane_drag_data_get), self); + g_signal_connect (priv->file_list, "drag_data_delete", + G_CALLBACK (cxp_right_pane_drag_data_delete), self); g_signal_connect (priv->file_list, "key-press-event", G_CALLBACK (cxp_right_pane_on_key_pressed), self); g_signal_connect (priv->expander, "notify::expanded", @@ -1359,3 +1366,56 @@ G_CALLBACK (cxp_right_pane_popup_handler), priv->popup_menu); } + +void cxp_right_pane_drag_data_get(GtkWidget *widget, GdkDragContext *dc, GtkSelectionData *selection_data, guint info, guint t, gpointer data) +{ + CxpRightPanePrivate *priv = CXP_RIGHT_PANE_GET_PRIVATE (data); + GList *list, *cur; + GtkTreeIter iter; + GtkTreeModel *model; + GtkTreeSelection *selection; + GString *move_files; + gchar *fullpath; + GtkClipboard *clipboard; + + selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->file_list)); + + list = gtk_tree_selection_get_selected_rows (selection, &model); + + g_return_if_fail (list != NULL); + + clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + + cur = list; + move_files = g_string_new (""); + while (cur != NULL) + { + gtk_tree_model_get_iter (model, &iter, cur->data); + gtk_tree_model_get (model, &iter, FILE_LIST_COL_FULLPATH, + &fullpath, -1); + g_string_append (move_files, fullpath); + g_string_append_c (move_files, '\n'); + g_free (fullpath); + cur = g_list_next (cur); + } + g_list_foreach (list, gtk_tree_path_free, NULL); + g_list_free (list); + + gtk_selection_data_set (selection_data, GDK_TARGET_STRING, 8, move_files->str, move_files->len); + //gtk_clipboard_set_text (clipboard, copy_files->str, copy_files->len); + g_string_free (move_files, TRUE); +} + +void cxp_right_pane_drag_data_delete (GtkWidget *widget, GdkDragContext *dc, gpointer data) +{ + CxpRightPanePrivate *priv = CXP_RIGHT_PANE_GET_PRIVATE (data); + gchar *cur_dir; + + cur_dir = g_strdup (priv->cur_dir); + cxp_right_pane_change_directory (CXP_RIGHT_PANE(data), + cur_dir); + g_free (cur_dir); + + g_signal_stop_emission_by_name (priv->file_list, "drag_data_delete"); +}