Add support for the folder right-click ("context") menu. No component
uses this yet, though. svn path=/trunk/; revision=4252
This commit is contained in:
@ -1,4 +1,22 @@
|
||||
2000-07-20 Ettore Perazzoli <ettore@helixcode.com>
|
||||
2000-07-21 Ettore Perazzoli <ettore@helixcode.com>
|
||||
|
||||
* e-storage-set-view.c (popup_folder_menu): New. Create a
|
||||
BonoboUIHandler-managed pop-up menu, let the component fill it in
|
||||
with `::populate_folder_context_menu', and display it. Then
|
||||
destroy it with the associated BonoboUIHandler.
|
||||
(handle_right_button_selection): New.
|
||||
(handle_left_button_selection): New. This pops up the right-click
|
||||
menu.
|
||||
(button_release_event): Use them.
|
||||
(init): Set the `GTK_BUTTON_SELECTS' flag for button #3's actions.
|
||||
|
||||
* evolution-shell-component-client.c
|
||||
(evolution_shell_component_client_populate_folder_context_menu):
|
||||
New.
|
||||
(evolution_shell_component_client_async_create_folder): Added
|
||||
preconditions.
|
||||
|
||||
* e-shell-view.c (e_shell_view_save_settings): Add missing cast.
|
||||
|
||||
* evolution-shell-component.c: New member
|
||||
`populate_folder_context_menu' in
|
||||
|
||||
@ -1013,7 +1013,7 @@ e_shell_view_save_settings (EShellView *shell_view,
|
||||
SET (int, "FolderBarMode", e_shell_view_get_folder_bar_mode (shell_view))
|
||||
SET (int, "ShortcutBarMode", e_shell_view_get_shortcut_bar_mode (shell_view));
|
||||
SET (int, "HPanedPosition", e_paned_get_position (E_PANED (priv->hpaned)));
|
||||
SET (int, "ViewHPanedPosition", e_paned_get_position (priv->view_hpaned));
|
||||
SET (int, "ViewHPanedPosition", e_paned_get_position (E_PANED (priv->view_hpaned)));
|
||||
|
||||
uri = e_shell_view_get_current_uri (shell_view);
|
||||
if (uri != NULL) {
|
||||
|
||||
@ -210,6 +210,82 @@ get_pixmap_and_mask_for_folder (EStorageSetView *storage_set_view,
|
||||
gdk_pixbuf_unref (scaled_pixbuf);
|
||||
}
|
||||
|
||||
|
||||
/* Folder context menu. */
|
||||
/* FIXME: This should be moved somewhere else, so that also the sortcut code
|
||||
can share it. */
|
||||
|
||||
static void
|
||||
folder_context_menu_activate_cb (BonoboUIHandler *uih,
|
||||
void *data,
|
||||
const char *path)
|
||||
{
|
||||
EStorageSetView *storage_set_view;
|
||||
EStorageSetViewPrivate *priv;
|
||||
|
||||
storage_set_view = E_STORAGE_SET_VIEW (data);
|
||||
priv = storage_set_view->priv;
|
||||
|
||||
gtk_signal_emit (GTK_OBJECT (storage_set_view), signals[FOLDER_SELECTED],
|
||||
priv->selected_row_path);
|
||||
|
||||
/* Make sure we don't restore the previously selected row after the
|
||||
menu is popped down. */
|
||||
priv->selected_row_path_before_click = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
populate_folder_context_menu_with_common_items (EStorageSetView *storage_set_view,
|
||||
BonoboUIHandler *uih)
|
||||
{
|
||||
bonobo_ui_handler_menu_new_item (uih, "/Activate",
|
||||
_("_View"), _("View the selected folder"),
|
||||
0, BONOBO_UI_HANDLER_PIXMAP_NONE,
|
||||
NULL, 0, 0,
|
||||
folder_context_menu_activate_cb,
|
||||
storage_set_view);
|
||||
}
|
||||
|
||||
static void
|
||||
popup_folder_menu (EStorageSetView *storage_set_view,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
EvolutionShellComponentClient *handler;
|
||||
EStorageSetViewPrivate *priv;
|
||||
EFolderTypeRegistry *folder_type_registry;
|
||||
BonoboUIHandler *uih;
|
||||
EFolder *folder;
|
||||
|
||||
priv = storage_set_view->priv;
|
||||
|
||||
uih = bonobo_ui_handler_new ();
|
||||
bonobo_ui_handler_create_popup_menu (uih);
|
||||
|
||||
folder = e_storage_set_get_folder (priv->storage_set, priv->selected_row_path);
|
||||
if (folder == NULL) {
|
||||
/* Uh!? */
|
||||
return;
|
||||
}
|
||||
|
||||
folder_type_registry = e_storage_set_get_folder_type_registry (priv->storage_set);
|
||||
g_assert (folder_type_registry != NULL);
|
||||
|
||||
handler = e_folder_type_registry_get_handler_for_type (folder_type_registry,
|
||||
e_folder_get_type_string (folder));
|
||||
g_assert (handler != NULL);
|
||||
|
||||
evolution_shell_component_client_populate_folder_context_menu (handler,
|
||||
uih,
|
||||
e_folder_get_physical_uri (folder),
|
||||
e_folder_get_type_string (folder));
|
||||
|
||||
populate_folder_context_menu_with_common_items (storage_set_view, uih);
|
||||
|
||||
bonobo_ui_handler_do_popup_menu (uih);
|
||||
|
||||
bonobo_object_unref (BONOBO_OBJECT (uih));
|
||||
}
|
||||
|
||||
|
||||
/* GtkObject methods. */
|
||||
|
||||
@ -313,6 +389,36 @@ motion_notify_event (GtkWidget *widget,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
handle_left_button_selection (EStorageSetView *storage_set_view,
|
||||
GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
EStorageSetViewPrivate *priv;
|
||||
|
||||
priv = storage_set_view->priv;
|
||||
|
||||
gtk_signal_emit (GTK_OBJECT (widget), signals[FOLDER_SELECTED],
|
||||
priv->selected_row_path);
|
||||
priv->selected_row_path = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
handle_right_button_selection (EStorageSetView *storage_set_view,
|
||||
GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
EStorageSetViewPrivate *priv;
|
||||
|
||||
priv = storage_set_view->priv;
|
||||
|
||||
popup_folder_menu (storage_set_view, event);
|
||||
|
||||
if (priv->selected_row_path_before_click != NULL)
|
||||
e_storage_set_view_set_current_folder (storage_set_view,
|
||||
priv->selected_row_path_before_click);
|
||||
}
|
||||
|
||||
static int
|
||||
button_release_event (GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
@ -332,9 +438,10 @@ button_release_event (GtkWidget *widget,
|
||||
gdk_flush ();
|
||||
|
||||
if (priv->selected_row_path != NULL) {
|
||||
gtk_signal_emit (GTK_OBJECT (widget), signals[FOLDER_SELECTED],
|
||||
priv->selected_row_path);
|
||||
priv->selected_row_path = NULL;
|
||||
if (priv->drag_button == 1)
|
||||
handle_left_button_selection (storage_set_view, widget, event);
|
||||
else
|
||||
handle_right_button_selection (storage_set_view, widget, event);
|
||||
}
|
||||
}
|
||||
|
||||
@ -643,6 +750,7 @@ static void
|
||||
init (EStorageSetView *storage_set_view)
|
||||
{
|
||||
EStorageSetViewPrivate *priv;
|
||||
GtkCList *clist;
|
||||
|
||||
/* Avoid GtkCTree's broken focusing behavior. FIXME: Other ways? */
|
||||
GTK_WIDGET_UNSET_FLAGS (storage_set_view, GTK_CAN_FOCUS);
|
||||
@ -660,6 +768,10 @@ init (EStorageSetView *storage_set_view)
|
||||
priv->button_y = 0;
|
||||
|
||||
storage_set_view->priv = priv;
|
||||
|
||||
/* Set up the right mouse button so that it also selects. */
|
||||
clist = GTK_CLIST (storage_set_view);
|
||||
clist->button_actions[2] |= GTK_BUTTON_SELECTS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -477,6 +477,12 @@ evolution_shell_component_client_async_create_folder (EvolutionShellComponentCli
|
||||
Evolution_ShellComponent corba_shell_component;
|
||||
CORBA_Environment ev;
|
||||
|
||||
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);
|
||||
g_return_if_fail (type != NULL);
|
||||
g_return_if_fail (callback != NULL);
|
||||
|
||||
priv = shell_component_client->priv;
|
||||
|
||||
if (priv->callback != NULL) {
|
||||
@ -507,6 +513,39 @@ evolution_shell_component_client_async_remove_folder (EvolutionShellComponentCli
|
||||
EvolutionShellComponentClientCallback callback,
|
||||
void *data)
|
||||
{
|
||||
/* FIXME to do. */
|
||||
}
|
||||
|
||||
void
|
||||
evolution_shell_component_client_populate_folder_context_menu (EvolutionShellComponentClient *shell_component_client,
|
||||
BonoboUIHandler *uih,
|
||||
const char *physical_uri,
|
||||
const char *type)
|
||||
{
|
||||
Bonobo_UIHandler corba_uih;
|
||||
EvolutionShellComponentClientPrivate *priv;
|
||||
Evolution_ShellComponent corba_shell_component;
|
||||
CORBA_Environment ev;
|
||||
|
||||
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);
|
||||
g_return_if_fail (type != NULL);
|
||||
|
||||
priv = shell_component_client->priv;
|
||||
|
||||
CORBA_exception_init (&ev);
|
||||
|
||||
corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client));
|
||||
corba_uih = bonobo_object_corba_objref (BONOBO_OBJECT (uih));
|
||||
|
||||
Evolution_ShellComponent_populate_folder_context_menu (corba_shell_component,
|
||||
corba_uih,
|
||||
physical_uri,
|
||||
type,
|
||||
&ev);
|
||||
|
||||
CORBA_exception_free (&ev);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -88,6 +88,11 @@ void evolution_shell_component_client_async_remove_folder (EvolutionShellCompo
|
||||
EvolutionShellComponentClientCallback callback,
|
||||
void *data);
|
||||
|
||||
void evolution_shell_component_client_populate_folder_context_menu (EvolutionShellComponentClient *shell_component_client,
|
||||
BonoboUIHandler *uih,
|
||||
const char *physical_uri,
|
||||
const char *type);
|
||||
|
||||
#ifdef cplusplus
|
||||
}
|
||||
#endif /* cplusplus */
|
||||
|
||||
Reference in New Issue
Block a user