diff options
author | Ettore Perazzoli <ettore@src.gnome.org> | 2001-03-08 20:55:05 +0800 |
---|---|---|
committer | Ettore Perazzoli <ettore@src.gnome.org> | 2001-03-08 20:55:05 +0800 |
commit | 9618cd2cb63840bd9138519bc52a3afad07590fa (patch) | |
tree | 259fda93de990254e0c3a108be88e584b2646b7f /shell | |
parent | 698fc6235d8b59e89369c5220ad6b15cc0c74b81 (diff) | |
download | gsoc2013-evolution-9618cd2cb63840bd9138519bc52a3afad07590fa.tar.gz gsoc2013-evolution-9618cd2cb63840bd9138519bc52a3afad07590fa.tar.zst gsoc2013-evolution-9618cd2cb63840bd9138519bc52a3afad07590fa.zip |
Added a ShellComponent method to retrieve the selection for drag and
drop and support for it in the shell. Untested.
svn path=/trunk/; revision=8594
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ChangeLog | 39 | ||||
-rw-r--r-- | shell/Evolution-ShellComponent.idl | 10 | ||||
-rw-r--r-- | shell/e-storage-set-view.c | 120 | ||||
-rw-r--r-- | shell/evolution-shell-component-client.c | 50 | ||||
-rw-r--r-- | shell/evolution-shell-component-client.h | 8 | ||||
-rw-r--r-- | shell/evolution-shell-component.c | 67 | ||||
-rw-r--r-- | shell/evolution-shell-component.h | 43 |
7 files changed, 276 insertions, 61 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog index 36a54a7c1b..78eaf1c244 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,42 @@ +2001-03-08 Ettore Perazzoli <ettore@ximian.com> + + * e-storage-set-view.c (get_folder_at_row): New helper function. + (create_target_list_for_row): Use it. + (table_drag_data_get): Get the selection from the shell component + using `evolution_shell_component_client_get_dnd_selection()'. + (set_e_shortcut_selection): Turn a `g_return_if_fail()' into a + `g_assert()'. + + * evolution-shell-component.c: New member `get_dnd_selection_fn' + in `EvolutionShellComponentPrivate'. + (evolution_shell_component_construct): New arg + @get_dnd_selection_fn. + (evolution_shell_component_new): Likewise. + (impl_ShellComponent_getDndSelection): New, implementation for + `ShellComponent::getDndSelection'. + (class_init): Install it. + + * evolution-shell-component-client.c + (evolution_shell_component_client_get_dnd_selection): New, wrapper + for `ShellComponent::getDndSelection'. + + * evolution-shell-component.h: Renamed + `EvolutionShellComponentPopulateFolderContextMenu' into + `EvolutionShellComponentPopulateFolderContextMenuFn'. New + function pointer typedef `EvolutionShellComponentGetDndSelectionFn'. + + * Evolution-ShellComponent.idl: New method + `ShellComponent::getDndSelection'. + + * e-storage-set-view.c (create_target_entries_from_dnd_type_list): + Always add an `E_SHORTCUT_TYPE' type at least. + (create_target_list_for_row): Don't return NULL if the list of + exported DND types is NULL. Don't create an unused target list. + Actually return the created target list. + (table_drag_data_get): If the @info is zero, set the e-shortcut + selection. + (set_uri_list_selection): Temporarily disabled. + 2001-03-07 Ettore Perazzoli <ettore@ximian.com> * e-component-registry.c (register_type): New args diff --git a/shell/Evolution-ShellComponent.idl b/shell/Evolution-ShellComponent.idl index 174f7fafdb..1e1b32eeeb 100644 --- a/shell/Evolution-ShellComponent.idl +++ b/shell/Evolution-ShellComponent.idl @@ -23,7 +23,7 @@ module Evolution { }; typedef sequence<FolderType> FolderTypeList; - + interface ShellComponentListener; interface ShellComponent : Bonobo::Unknown { @@ -69,6 +69,14 @@ module Evolution { void populateFolderContextMenu (in Bonobo::UIContainer uih, in string physical_uri, in string type); + + typedef sequence<octet> Selection; + exception NoSelection {}; + + void getDndSelection (in string physical_uri, in short type, + out short format, + out Selection selection) + raises (NoSelection); }; interface ShellComponentListener { diff --git a/shell/e-storage-set-view.c b/shell/e-storage-set-view.c index dc299cb787..ccab7502f2 100644 --- a/shell/e-storage-set-view.c +++ b/shell/e-storage-set-view.c @@ -233,6 +233,30 @@ get_pixbuf_for_folder (EStorageSetView *storage_set_view, return scaled_pixbuf; } +static EFolder * +get_folder_at_row (EStorageSetView *storage_set_view, + int row) +{ + EStorageSetViewPrivate *priv; + ETreePath *folder_node_path; + const char *folder_path; + EFolder *folder; + + priv = storage_set_view->priv; + + folder_node_path = e_tree_model_node_at_row (priv->etree_model, row); + if (folder_node_path == NULL) + return NULL; + + folder_path = e_tree_model_node_get_data (priv->etree_model, folder_node_path); + g_assert (folder_path != NULL); + + folder = e_storage_set_get_folder (priv->storage_set, folder_path); + g_assert (folder != NULL); + + return folder; +} + /* Custom marshalling function. */ @@ -274,15 +298,25 @@ create_target_entries_from_dnd_type_list (GList *dnd_types, int i; if (dnd_types == NULL) - return NULL; + num_entries = 0; + else + num_entries = g_list_length (dnd_types); - num_entries = g_list_length (dnd_types); - if (num_entries == 0) - return NULL; + /* We always add an entry for an Evolution URI type. This will let us + do drag & drop within Evolution at least. */ + num_entries ++; entries = g_new (GtkTargetEntry, num_entries); - for (p = dnd_types, i = 0; p != NULL; p = p->next, i++) { + i = 0; + + /* The Evolution URI will always come first. */ + entries[i].target = E_SHORTCUT_TYPE; + entries[i].flags = 0; + entries[i].info = 0; + i ++; + + for (p = dnd_types; p != NULL; p = p->next, i++) { const char *dnd_type; g_assert (i < num_entries); @@ -314,35 +348,21 @@ create_target_list_for_row (EStorageSetView *storage_set_view, EStorageSetViewPrivate *priv; GtkTargetList *target_list; EFolderTypeRegistry *folder_type_registry; - ETreePath *folder_node_path; - EFolder *folder; - const char *folder_path; - const char *folder_type; GList *exported_dnd_types; GtkTargetEntry *target_entries; + EFolder *folder; + const char *folder_type; int num_target_entries; priv = storage_set_view->priv; - target_list = gtk_target_list_new (NULL, 0); - folder_type_registry = e_storage_set_get_folder_type_registry (priv->storage_set); - folder_node_path = e_tree_model_node_at_row (priv->etree_model, row); - g_assert (folder_node_path != NULL); - - folder_path = e_tree_model_node_get_data (priv->etree_model, folder_node_path); - g_assert (folder_path != NULL); - - folder = e_storage_set_get_folder (priv->storage_set, folder_path); - g_assert (folder != NULL); - + folder = get_folder_at_row (storage_set_view, row); folder_type = e_folder_get_type_string (folder); exported_dnd_types = e_folder_type_registry_get_exported_dnd_types_for_type (folder_type_registry, folder_type); - if (exported_dnd_types == NULL) - return NULL; target_entries = create_target_entries_from_dnd_type_list (exported_dnd_types, &num_target_entries); @@ -352,9 +372,10 @@ create_target_list_for_row (EStorageSetView *storage_set_view, free_target_entries (target_entries); - return NULL; + return target_list; } +#if 0 static void set_uri_list_selection (EStorageSetView *storage_set_view, GtkSelectionData *selection_data) @@ -370,6 +391,7 @@ set_uri_list_selection (EStorageSetView *storage_set_view, 8, (guchar *) uri_list, strlen (uri_list)); g_free (uri_list); } +#endif static void set_e_shortcut_selection (EStorageSetView *storage_set_view, @@ -381,7 +403,7 @@ set_e_shortcut_selection (EStorageSetView *storage_set_view, const char *trailing_slash; const char *name; - g_return_if_fail(storage_set_view != NULL); + g_assert (storage_set_view != NULL); priv = storage_set_view->priv; @@ -565,8 +587,6 @@ button_press_event (GtkWidget *widget, e_table_get_cell_at (table, event->x, event->y, &row, &column); - g_print ("e-storage-set-view.c::button_press_event() -- row %d column %d\n", row, column); - priv->drag_x = event->x; priv->drag_y = event->y; priv->drag_column = column; @@ -587,6 +607,8 @@ motion_notify_event (GtkWidget *widget, GdkDragAction actions; GdkDragContext *context; + puts (__FUNCTION__); + storage_set_view = E_STORAGE_SET_VIEW (widget); priv = storage_set_view->priv; @@ -649,19 +671,45 @@ table_drag_data_get (ETable *etable, guint32 time) { EStorageSetView *storage_set_view; + EStorageSetViewPrivate *priv; + EFolder *folder; + EFolderTypeRegistry *folder_type_registry; + EvolutionShellComponentClient *component_client; + char *selection; + int selection_length; + int format; storage_set_view = E_STORAGE_SET_VIEW (etable); + priv = storage_set_view->priv; - switch (info) { - case DND_TARGET_TYPE_URI_LIST: - set_uri_list_selection (storage_set_view, selection_data); - break; - case DND_TARGET_TYPE_E_SHORTCUT: + if (info == 0) { set_e_shortcut_selection (storage_set_view, selection_data); - break; - default: - g_assert_not_reached (); + return; } + + g_assert (info > 0); + + folder = get_folder_at_row (storage_set_view, drag_row); + g_assert (folder != NULL); + + folder_type_registry = e_storage_set_get_folder_type_registry (priv->storage_set); + g_assert (folder_type_registry != NULL); + + component_client = e_folder_type_registry_get_handler_for_type (folder_type_registry, + e_folder_get_type_string (folder)); + g_assert (component_client != NULL); + + evolution_shell_component_client_get_dnd_selection (component_client, + e_folder_get_physical_uri (folder), + info, + &format, &selection, &selection_length); + if (selection == NULL) + return; + + gtk_selection_data_set (selection_data, selection_data->target, + format, selection, selection_length); + + g_free (selection); } static gboolean @@ -988,8 +1036,8 @@ new_folder_cb (EStorageSet *storage_set, parent_path = g_strndup (path, last_separator - path); parent_node = g_hash_table_lookup (priv->path_to_etree_node, parent_path); if (parent_node == NULL) { - g_print ("EStorageSetView: EStorageSet reported new subfolder for non-existing folder -- %s\n", - parent_path); + g_warning ("EStorageSetView: EStorageSet reported new subfolder for non-existing folder -- %s\n", + parent_path); g_free (parent_path); return; } diff --git a/shell/evolution-shell-component-client.c b/shell/evolution-shell-component-client.c index 4717c5f23d..2a35c0c56b 100644 --- a/shell/evolution-shell-component-client.c +++ b/shell/evolution-shell-component-client.c @@ -533,5 +533,55 @@ evolution_shell_component_client_populate_folder_context_menu (EvolutionShellCom } +void +evolution_shell_component_client_get_dnd_selection (EvolutionShellComponentClient *shell_component_client, + const char *physical_uri, + int type, + int *format_return, + char **selection_return, + int *selection_length_return) +{ + EvolutionShellComponentClientPrivate *priv; + GNOME_Evolution_ShellComponent corba_shell_component; + CORBA_Environment ev; + GNOME_Evolution_ShellComponent_Selection *corba_selection; + CORBA_short format; + + g_return_if_fail (shell_component_client != NULL); + g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client)); + g_return_if_fail (physical_uri != NULL); + + priv = shell_component_client->priv; + + CORBA_exception_init (&ev); + + corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client)); + + GNOME_Evolution_ShellComponent_getDndSelection (corba_shell_component, + physical_uri, type, + &format, &corba_selection, + &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + *format_return = 0; + *selection_return = NULL; + *selection_length_return = 0; + return; + } + + CORBA_exception_free (&ev); + + *format_return = format; + + /* We have to re-allocate the CORBA data using GLib because we cannot + mix g_ memory management with CORBA_ memory management. Yes, this + does suck. */ + *selection_return = g_malloc (corba_selection->_length); + memcpy (*selection_return, corba_selection->_buffer, corba_selection->_length); + *selection_length_return = corba_selection->_length; + + CORBA_free (corba_selection); +} + + E_MAKE_TYPE (evolution_shell_component_client, "EvolutionShellComponentClient", EvolutionShellComponentClient, class_init, init, PARENT_TYPE) diff --git a/shell/evolution-shell-component-client.h b/shell/evolution-shell-component-client.h index 319902198f..03a76a7d31 100644 --- a/shell/evolution-shell-component-client.h +++ b/shell/evolution-shell-component-client.h @@ -94,6 +94,14 @@ void evolution_shell_component_client_populate_folder_context_menu (EvolutionS const char *physical_uri, const char *type); +/* DND stuff. */ +void evolution_shell_component_client_get_dnd_selection (EvolutionShellComponentClient *shell_component_client, + const char *physical_uri, + int type, + int *format_return, + char **selection_return, + int *selection_length_return); + #ifdef cplusplus } #endif /* cplusplus */ diff --git a/shell/evolution-shell-component.c b/shell/evolution-shell-component.c index 0e28981ef6..f076daf431 100644 --- a/shell/evolution-shell-component.c +++ b/shell/evolution-shell-component.c @@ -41,11 +41,12 @@ static GtkObjectClass *parent_class = NULL; struct _EvolutionShellComponentPrivate { GList *folder_types; /* EvolutionShellComponentFolderType */ - EvolutionShellComponentCreateViewFn create_view_fn; - EvolutionShellComponentCreateFolderFn create_folder_fn; - EvolutionShellComponentRemoveFolderFn remove_folder_fn; - EvolutionShellComponentCopyFolderFn copy_folder_fn; - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn; + EvolutionShellComponentCreateViewFn create_view_fn; + EvolutionShellComponentCreateFolderFn create_folder_fn; + EvolutionShellComponentRemoveFolderFn remove_folder_fn; + EvolutionShellComponentCopyFolderFn copy_folder_fn; + EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn; + EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn; EvolutionShellClient *owner_client; @@ -366,6 +367,53 @@ impl_ShellComponent_populate_folder_context_menu (PortableServer_Servant servant bonobo_object_unref (BONOBO_OBJECT (uic)); } +static void +impl_ShellComponent_getDndSelection (PortableServer_Servant servant, + const CORBA_char *physical_uri, + const CORBA_short type, + CORBA_short *format_return, + GNOME_Evolution_ShellComponent_Selection **selection_return, + CORBA_Environment *ev) +{ + BonoboObject *bonobo_object; + EvolutionShellComponent *shell_component; + EvolutionShellComponentPrivate *priv; + const char *selection; + int selection_length; + int format; + + bonobo_object = bonobo_object_from_servant (servant); + shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); + priv = shell_component->priv; + + if (priv->get_dnd_selection_fn == NULL) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_GNOME_Evolution_ShellComponent_NoSelection, NULL); + return; + } + + (* priv->get_dnd_selection_fn) (shell_component, physical_uri, type, + &format, &selection, &selection_length, + priv->closure); + + if (selection == NULL) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_GNOME_Evolution_ShellComponent_NoSelection, NULL); + } else { + *format_return = format; + + *selection_return = GNOME_Evolution_ShellComponent_Selection__alloc (); + + (* selection_return)->_buffer = CORBA_octet_allocbuf (selection_length); + memcpy ((* selection_return)->_buffer, selection, selection_length); + + (* selection_return)->_length = selection_length; + (* selection_return)->_maximum = selection_length; + + CORBA_sequence_set_release (*selection_return, TRUE); + } +} + /* GtkObject methods. */ @@ -447,6 +495,7 @@ class_init (EvolutionShellComponentClass *klass) epv->createFolderAsync = impl_ShellComponent_async_create_folder; epv->removeFolderAsync = impl_ShellComponent_async_remove_folder; epv->populateFolderContextMenu = impl_ShellComponent_populate_folder_context_menu; + epv->getDndSelection = impl_ShellComponent_getDndSelection; } static void @@ -477,7 +526,8 @@ evolution_shell_component_construct (EvolutionShellComponent *shell_component, EvolutionShellComponentCreateFolderFn create_folder_fn, EvolutionShellComponentRemoveFolderFn remove_folder_fn, EvolutionShellComponentCopyFolderFn copy_folder_fn, - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn, + EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn, + EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn, void *closure) { EvolutionShellComponentPrivate *priv; @@ -492,6 +542,7 @@ evolution_shell_component_construct (EvolutionShellComponent *shell_component, priv->remove_folder_fn = remove_folder_fn; priv->copy_folder_fn = copy_folder_fn; priv->populate_folder_context_menu_fn = populate_folder_context_menu_fn; + priv->get_dnd_selection_fn = get_dnd_selection_fn; priv->closure = closure; @@ -522,7 +573,8 @@ evolution_shell_component_new (const EvolutionShellComponentFolderType folder_ty EvolutionShellComponentCreateFolderFn create_folder_fn, EvolutionShellComponentRemoveFolderFn remove_folder_fn, EvolutionShellComponentCopyFolderFn copy_folder_fn, - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn, + EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn, + EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn, void *closure) { EvolutionShellComponent *new; @@ -536,6 +588,7 @@ evolution_shell_component_new (const EvolutionShellComponentFolderType folder_ty remove_folder_fn, copy_folder_fn, populate_folder_context_menu_fn, + get_dnd_selection_fn, closure); return new; diff --git a/shell/evolution-shell-component.h b/shell/evolution-shell-component.h index b64f3ae524..6f7a77a194 100644 --- a/shell/evolution-shell-component.h +++ b/shell/evolution-shell-component.h @@ -89,11 +89,18 @@ typedef void (* EvolutionShellComponentCopyFolderFn) (EvolutionShellComponent gboolean remove_source, const GNOME_Evolution_ShellComponentListener listener, void *closure); -typedef void (* EvolutionShellComponentPopulateFolderContextMenu) (EvolutionShellComponent *shell_component, +typedef void (* EvolutionShellComponentPopulateFolderContextMenuFn) (EvolutionShellComponent *shell_component, BonoboUIComponent *uic, const char *physical_uri, const char *type, void *closure); +typedef char * (* EvolutionShellComponentGetDndSelectionFn) (EvolutionShellComponent *shell_component, + const char *physical_uri, + int type, + int *format_return, + const char **selection_return, + int *selection_length_return, + void *closure); struct _EvolutionShellComponentFolderType { char *name; @@ -126,22 +133,24 @@ struct _EvolutionShellComponentClass { GtkType evolution_shell_component_get_type (void); -void evolution_shell_component_construct (EvolutionShellComponent *shell_component, - const EvolutionShellComponentFolderType folder_types[], - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_folder_fn, - EvolutionShellComponentCopyFolderFn copy_folder_fn, - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn, - void *closure); -EvolutionShellComponent *evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[], - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_folder_fn, - EvolutionShellComponentCopyFolderFn copy_folder_fn, - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn, - void *closure); -EvolutionShellClient *evolution_shell_component_get_owner (EvolutionShellComponent *shell_component); +void evolution_shell_component_construct (EvolutionShellComponent *shell_component, + const EvolutionShellComponentFolderType folder_types[], + EvolutionShellComponentCreateViewFn create_view_fn, + EvolutionShellComponentCreateFolderFn create_folder_fn, + EvolutionShellComponentRemoveFolderFn remove_folder_fn, + EvolutionShellComponentCopyFolderFn copy_folder_fn, + EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn, + EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn, + void *closure); +EvolutionShellComponent *evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[], + EvolutionShellComponentCreateViewFn create_view_fn, + EvolutionShellComponentCreateFolderFn create_folder_fn, + EvolutionShellComponentRemoveFolderFn remove_folder_fn, + EvolutionShellComponentCopyFolderFn copy_folder_fn, + EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn, + EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn, + void *closure); +EvolutionShellClient *evolution_shell_component_get_owner (EvolutionShellComponent *shell_component); #ifdef cplusplus } |