diff options
Diffstat (limited to 'shell')
67 files changed, 0 insertions, 17614 deletions
diff --git a/shell/.cvsignore b/shell/.cvsignore deleted file mode 100644 index 417b3c6bcf..0000000000 --- a/shell/.cvsignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.libs -.pure -evolution -evolution.pure -Makefile.in -Makefile -Evolution-stubs.c -Evolution-skels.c -Evolution-common.c -Evolution.h diff --git a/shell/ChangeLog b/shell/ChangeLog deleted file mode 100644 index a05041c9c9..0000000000 --- a/shell/ChangeLog +++ /dev/null @@ -1,2040 +0,0 @@ -2000-08-20 arik devens <arik@helixcode.com> - - * Makefile.am (evolution_LDADD): Added UNICODE_LIBS to link in the - new e-text stuff. - -2000-08-19 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-folder-title-bar.c: Fixed a warning. - -2000-08-19 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view.c: Fixed a warning. - -2000-08-18 Larry Ewing <lewing@helixcode.com> - - * e-shell-folder-title-bar.c (style_set_cb): update the pixmap - define E_USE_STYLES to disable the current darkening behavior - (destroy): free the icon. - (e_shell_folder_title_bar_construct): style_set_cb does everything - important now. - (e_shell_folder_title_bar_set_icon): actually store the pixbuf - when we set it so that we still have it if the style changes and - take care of refcounting them properly. - -2000-08-17 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view-menu.c (menu_create_file): Make capitalization of - menu items consistent. - (menu_create_view): Likewise. - (menu_create_help): Likewise. - (e_shell_view_menu_setup): Create a component menu placeholder so - that components can add their own component-specific menus there. - (menu_create_actions): Removed. - (e_shell_view_menu_setup): Don't call it. - (menu_create_tools): Removed. - (e_shell_view_menu_setup): Don't call it. - (menu_create_settings): New. - (e_shell_view_menu_setup): Call it. - -2000-08-13 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (delete_event): New. Make the parent shell quit. - -2000-08-13 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (shell_view_interface_set_message_cb): Removed - debugging message. - (shell_view_interface_unset_message_cb): Likewise. - -2000-08-13 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c: New members `progress_bar_timeout_id', - `progress_bar_value' in `EShellViewPrivate'. - (init): Init them. - (destroy): If the timeout id is not zero, remove the associated - timeout. - (progress_bar_timeout_cb): New. - (start_progress_bar): New. - (stop_progress_bar): New. - (shell_view_interface_set_message_cb): If busy, start the progress - bar. Otherwise, stop it. - (shell_view_interface_unset_message_cb): Stop the progress bar. - - * e-shell-view.c (setup_widgets): Enable the progress bar in the - appbar. - - * e-shell-view.c (shell_view_interface_unset_message_cb): New - function, callback for the `EvolutionShellView::unset_message' - signal. - (shell_view_interface_set_message_cb): New function, callback for - the `EvolutionShellView::set_message' signal. - (setup_evolution_shell_view_interface): Connect these signals to a - newly created EvolutionShellView object, add ::add_interface this - object to the control's frame. - - * evolution-shell-view.c: New. - * evolution-shell-view.h: New. - - * Evolution-ShellView.idl: New interface. - -2000-08-10 Dan Winship <danw@helixcode.com> - - * Evolution-ShellComponent.idl: add "in string evolution_homedir" - to ShellComponent::set_owner's arguments. - - * e-shell.c (e_shell_get_local_directory): Expose local_directory. - - * e-component-registry.c (register_component): Pass the shell's - "local_directory" to the component as its evolution_homedir. - - * evolution-shell-component.c (impl_ShellComponent_set_owner): - Update to include evolution_homedir. - (class_init): Update signal prototype. - - * evolution-shell-component-client.c - (evolution_shell_component_client_set_owner): Update to include - evolution_homedir. - - * e-init.c: Remove. This wasn't being used. - -2000-08-10 Peter Williams <peterw@helixcode.com> - - * e-shell-view-menu.c (command_about_box): Add lil' ol' - me to the about box. - -2000-08-09 Christopher James Lahey <clahey@helixcode.com> - - * e-setup.c, e-shell.c: Fixed some warnings. - -2000-08-09 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view.c: Fixed a warning. - -2000-08-09 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view-menu.c (menu_create_file_new): Create a placeholder - for the print items. - -2000-08-08 Dan Winship <danw@helixcode.com> - - * e-setup.c (e_setup): Check for ~/evolution/shortcuts.xml in - addition to ~/evolution, to make sure it's really the directory - we're expecting it to be. Also, convert from old-style config file - to new-style config directory. - -2000-08-04 Michael Meeks <michael@helixcode.com> - - * evolution-shell-component.c (impl_ShellComponent_populate_folder_context_menu): - unref. - - * e-shell.c (e_shell_construct): Remove erroneous refs on - folder_type_registry, storage_set. - - * e-shortcuts-view.c (destroy): unref the shortcuts, causing a - massive ripple chain ref-count reaction. - -2000-08-03 JP Rosevear <jpr@helixcode.com> - - * e-shell.h: Remove gconf references - - * e-shell-view.h: Remove gconf references - - * main.c (idle_cb): Remove gconf references - - * Makefile.am: Remove gconf cflags and libs - - * e-shell-view.c (e_shell_view_load_settings): Change to use - gnome-config - (e_shell_view_save_settings): ditto - - * e-shell.c (e_shell_restore_from_settings): Change to - use gnome_config - (save_settings_for_views): ditto - -2000-08-03 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (destroy): unref the UI handler. - -2000-08-03 Jeffrey Stedfast <fejj@helixcode.com> - - * e-shell-folder-selection-dialog.c (set_default_folder): Make - sure default_uri isn't NULL!! - -2000-08-03 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view-menu.c (command_goto_folder): Just use the current - URI as the @default_uri parameter for - `e_shell_folder_selection_dialog_new()'. - - * evolution-session.c (class_init): Call `corba_class_init()'. - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_new): @default_path renamed to - @default_uri. - (e_shell_folder_selection_dialog_construct): Likewise. If the - @default_uri is an `evolution:' one, use it as a path; if it is - different, assume it is a physical URI and consequently look for - the folder that has that physical URI and make it the default. - (set_default_folder): New helper function. - (e_shell_folder_selection_dialog_construct): Use it. - - * e-storage-set.c (e_storage_set_get_path_for_physical_uri): New. - - * e-storage.c (e_storage_get_path_for_physical_uri): New. - -2000-07-27 Dan Winship <danw@helixcode.com> - - * main.c (idle_cb): work with either gconf 0.5 or newer - -2000-07-26 Peter Williams <peterw@helixcode.com> - - * e-storage.c (e_storage_new_folder): Fix tiny mem leak. - -2000-07-26 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (disconnect_popup_signals): Disconnect the "map" - signal handler too. - -2000-07-25 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-folder-creation-dialog.c (add_folder_types): Work around - GtkOptionMenu utter brokenness by destroying the associated - Glade-built GtkMenu and creating a new one from scratch. - -2000-07-24 Dan Winship <danw@helixcode.com> - - * e-shell.c, main.c: Remove GOAD support. - - * evolution-shell-component-client.c: Remove GOAD support. - (evolution_shell_component_client_new): Give the "maybe - OAF_INFO_PATH" message if no oafinfo file was found, and give a - "consult previous error messages" message if the component was - found but not activated. Abort in either case. - -2000-07-23 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view-menu.c: Converted to use `bonobo_ui_handler_*()' - stuff directly, instead of converting from GnomeUIInfo. - (command_quit): Update arg types for BonoboUIHandler. - (command_run_bugbuddy): Likewise. - (command_about_box): Likewise. - (command_new_task): Removed. - (command_new_journal_entry): Removed. - (menu_create_file_new): New. - (menu_create_file): New. - (menu_create_edit): New. - (menu_create_view): New. - (menu_create_tools): New. - (menu_create_actions): New. - (e_shell_view_menu_setup): Create menus using them instead of - converting from GnomeUIInfo. - -2000-07-22 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (e_shell_construct): Don't unref NULL shortcuts, you - idiot. - -2000-07-22 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (e_shell_view_set_folder_bar_mode): Make the - title bar non-clickable when the folder tree is visible. - - * e-shell-folder-title-bar.c: New members `button_arrow' and - `clickable' in `EShellFolderTitleBarPrivate'. Renamed `label' - into `button_label'. Added `label'. - (init): Init them. - (e_shell_folder_title_bar_construct): Pass a pointer to the title - bar as the user data for the "realize" signal. Create `label'. - (title_button_box_realize_cb): Use the `button_arrow' member - instead of using `gtk_object_{set,get}_data()'. - (setup_style): Set the style for `label' too. - (e_shell_folder_title_bar_set_clickable): New. - (e_shell_folder_title_bar_set_title): Set both `label' and - `button_label'. - -2000-07-21 Peter Williams <peterw@helixcode.com> - - * evolution-shell-client.c (user_select_folder): Don't use - g_main_loop to block the caller; this will break when - threads are enabled and GDK_THREADS_ENTER deadlocks. Use - gtk_main / gtk_main_exit to enter and exit the main loop, - which handles the recursive case correctly. - (impl_FolderSelectionListener_selected): Same. - (impl_FolderSelectionListener_cancel): Same. - (struct _FolderSelectionListenerServant): No more main_loop member. - -2000-07-21 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (storage_set_view_box_button_release_event_cb): - Set the toggle state to FALSE on the title bar. - - * e-shell-folder-title-bar.c: Signal "title_clicked" replaced by - "title_toggled". - (setup_style): Change the style for the button too. - (e_shell_folder_title_bar_construct): Use a GtkToggleButton, not a - GtkButton. - (e_shell_folder_title_bar_set_toggle_state): New. - -2000-07-21 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-folder-title-bar.c (create_icon_pixmap): New. Create a - small arrow-shaped GtkPixmap. - (title_button_box_realize_cb): New. Callback for the "realize" - signal of the button's inner box. - - * e-shell-view.c (title_bar_clicked_cb): New function, callback - for the "title_clicked" signal of the title bar. - (setup_widgets): Connect it. - - * e-shell-view.c: New member `storage_set_title_bar' in - `EShellViewPrivate'. - (setup_storage_set_subwindow): Set it. - - * e-shell-folder-title-bar.c: Use a GtkLabel instead of an - EClippedLabel for the title. - (title_button_clicked_cb): New. - (e_shell_folder_title_bar_construct): Put the label into a button. - Connect the button's "clicked" signal to - `title_button_clicked_cb'. - -2000-07-21 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-component.c - (impl_ShellComponent_populate_folder_context_menu): If the pointer - to the function to populate the folder context menu is NULL, don't - do anything. - -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 - `EvolutionShellComponentPrivate'. - (impl_ShellComponent_populate_folder_context_menu): New, - implementation for - `Evolution::ShellComponent::populate_folder_context_menu'. - (corba_class_init): Install it. - (evolution_shell_component_new): New arg - @populate_folder_context_menu. - (evolution_shell_component_construct): Likewise. - - * Evolution-ShellComponent.idl: New method - `::populate_folder_context_menu'. - -2000-07-20 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (e_shell_view_save_settings): Save the paned - positions. - (e_shell_view_load_settings): Restore them. - -2000-07-20 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (save_settings_for_views): New. Code moved out of - `e_shell_save_settings'. - (e_shell_save_settings): Use it. - (save_settings_for_component): New. - (save_settings_for_components): New. - (e_shell_save_settings): Use it, so that we make all the - components save settings too. - - * e-component-registry.c - (e_component_registry_get_id_list): New. - (e_component_registry_get_component_by_id): New. - - * Makefile.am (libeshell_a_SOURCES): Add - `evolution-shell-component-client' and `evolution-session'. - - * evolution-session.c: New. - * evolution-session.h: New. - - * Makefile.am (evolution_SOURCES): Removed files that were already - in `libeshell.a'. - - * Evolution.idl: #include <Evolution-Session.idl>. - - * Evolution-Session.idl: New. - -2000-07-20 Ettore Perazzoli <ettore@helixcode.com> - - * main.c (no_views_left_cb): Call `e_shell_quit()' on the shell - before getting out of the GTK+ main loop. - (view_delete_event_cb): Removed. - (idle_cb): Don't call it. - - * e-shell-view-menu.c (command_new_view): New, implementation of - the "New view" command. - -2000-07-16 Damon Chaplin <damon@helixcode.com> - - * e-shortcuts-view.c (e_shortcuts_view_construct): created a model - for the EShortcutBar. This will probably have to be moved to support - multiple views. - (class_init): #if'd out overriding the class functions. They don't - exist any more (they are in the model instead). - -2000-07-12 Christopher James Lahey <clahey@helixcode.com> - - * main.c: Fixed to match gconf API change. - -2000-07-10 Dan Winship <danw@helixcode.com> - - * main.c (development_warning): Update the message. - -2000-07-10 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-folder-title-bar.c (title_button_clicked_cb): - Temporarily `#if 0'ed out. - -2000-07-10 Dan Winship <danw@helixcode.com> - - * e-shell.c (impl_Shell_user_select_folder): Translate a - default_folder of "" into NULL (which can't be passed over CORBA). - -2000-07-10 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage.c (e_storage_new_folder): Removed debugging message. - - * e-storage-set.c (storage_new_folder_cb): Removed debugging - message. - -2000-07-10 Federico Mena Quintero <federico@helixcode.com> - - * e-shell-view.c (unrealize): As a quasi-hack, do a gdk_flush() - when the shell view is unrealized so that the DeleteEvent gets - sent to the remote plugs as soon as possible before we start - making other CORBA calls. The problem is that our CORBA pipe is - synchronous while our X pipe is asynch. We have to ensure - ordering for certain operations. This is NOT the correct and - complete fix, which should go in Bonobo. - -2000-07-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (e_shell_view_display_uri): Don't update the - current URI if there are problems creating a view for it. - (show_error): Remove. Not used anymore. - -2000-07-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view-menu.c: Cleanup some unused menu items and added - "FIXMEs" for the ones we plan to add in the short term but are not - implemented yet. - (command_create_folder): Get rid of an unused variable. - -2000-07-07 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-client.c (user_select_folder): Fix small warning - by adding proper cast when filling in the CORBA sequence struct. - -2000-07-07 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (setup_corba_storages): Ref the CORBA storage - registry. - -2000-07-06 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage.c: Removed `corba_storage_registry' member - from `EvolutionStoragePrivate'. - (destroy): Don't unref/release it. Call - `StorageListener::destroy' to notify that we are dead. - (evolution_storage_register): Don't ref and store the registry. - -2000-07-05 Dan Winship <danw@helixcode.com> - - * e-shell.c (e_shell_save_settings): Use the correct gconf path - (/apps, not /app), and call gconf_client_suggest_sync at the end. - (e_shell_restore_from_settings): Use the correct gconf path. - -2000-07-05 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view-menu.c (command_goto_folder): Set the folder - selection dialog as transient for the shell view. - (command_create_folder): New, bound to the "Create folder" - command in the "File" menu. - -2000-07-01 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (impl_Shell_user_select_folder): New arg - @allowed_types. Pass it to the EShellFolderSelectionDialog. - Connect to the "cancelled" and "folder_selected" signals instead - of "clicked". - (corba_listener_destroy_notify): New callback. - (impl_Shell_user_select_folder): Associate it to the DestroyNotify - for the "corba_listener" GtkObject data, so we don't leak it. - (folder_selection_dialog_clicked_cb): Don't release the listener - interface here. - (folder_selection_dialog_cancelled_cb): New callback for the - "cancelled" signal. - (folder_selection_dialog_folder_selected_cb): New callback for the - "folder_selected" signal. - - * e-shell-view-menu.c (command_goto_folder): Don't connect to - "clicked". Connect to "cancelled" and "folder_selected" instead. - (folder_selection_dialog_cancelled_cb): New, callback for the - "cancelled" signal. - (folder_selection_dialog_folder_selected_cb): New, callback for - the "folder_selected" signal. - - * e-shell-folder-selection-dialog.c New members `allowed_types', - `storage_set' in `EShellFolderSelectionDialogPrivate'. - (class_init): Install signals "folder_selected", "cancelled". - (init): Init to NULL. - (impl_destroy): Free/unref them. - (e_shell_folder_selection_dialog_new): New arg @allowed_types. - (e_shell_folder_selection_dialog_construct): New arg - @allowed_types. Initialize `priv->allowed_types' from it. - (check_folder_type): New function. Check if the selected folder - is of the appropriate type and, if not, return FALSE and pop up an - error dialog. Otherwise, return TRUE. - (impl_clicked): Use `check_folder_type()' to check if the folder - type is OK. If it is not, stop emission of the "clicked" signal. - - * e-shell-folder-selection-dialog.h: New signals - "folder_selected", "cancelled". - - * evolution-shell-client.c - (evolution_shell_client_user_select_folder): New arg - @allowed_types. - (user_select_folder): New arg @allowed_types. Pass this to the - ::user_select_folder method. - - * Evolution-Shell.idl: New arg @required_types in - ::user_select_folder. - -2000-07-01 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (setup_components): Don't ref the component registry. - -2000-06-30 Dan Winship <danw@helixcode.com> - - * Evolution-Shell.idl: add "cancel" to FolderSelectionListener. - - * evolution-shell-client.c (impl_FolderSelectionListener_cancel): - Implement cancel (set *uri and *physical_uri to NULL). - (evolution_shell_client_user_select_folder): document %NULL uri - and physical_uri return values. - - * e-shell.c (folder_selection_dialog_clicked_cb): If the user - clicked "Cancel" or used the wm to close the dialog, call _cancel - instead of _selected. - -2000-06-30 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-component.c (impl_ShellComponent_set_owner): - Duplicate the object before storing it, you doofus. - -2000-06-30 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-component.c (impl_ShellComponent_unset_owner): - NULL the owner_client. - -2000-06-30 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-client.h - (evolution_shell_client_user_select_folder): Add prototype. - -2000-06-29 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-component.c: New member `owner_client'. Removed - member `corba_owner'. All the code updated to use it. - (evolution_shell_component_get_owner): Changed so that it returns - an EvolutionShellClient instead of the raw CORBA object. - - * evolution-shell-component.h: Change signal "owner_set" to get an - EvolutionShellClient wrapper instead of a CORBA interface. - - * evolution-shell-client.c: New. - * evolution-shell-client.h: New. - -2000-06-29 Dan Winship <danw@helixcode.com> - - * evolution-shell-component-client.c - (evolution_shell_component_client_new): Update warning message to - not say "CRASHING", since it won't if you have current bonobo. - -2000-06-29 Peter Williams <peter@beta.newton.cx> - - * e-shell.c (e_shell_restore_from_settings): Check for the - insanely invalid NumberOfViews = 0 case. - -2000-06-29 Peter Williams <peter@helixcode.com> - - * e-shell.c (e_shell_construct): Ref the various E-things that - we create to go with our unrefs in the destructor. - -2000-06-29 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (e_shell_view_construct): Don't ref the shell. - (destroy): Don't unref the shell. - -2000-06-29 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts.c (e_shortcuts_construct): Fix typo: @shortcuts - should unset `GTK_FLOATING', not @storage_set. - - * e-shell-view.c (get_storage_set_path_from_uri): If @uri is NULL, - return NULL. - - * main.c (idle_cb): Restore the shell from the settings. If this - fails, just create a new view. - - * e-shell.c (e_shell_save_settings): New. - (e_shell_quit): Save settings before exiting. - (e_shell_restore_from_settings): New. - - * e-shell-view.c (e_shell_view_save_settings): New. - (e_shell_view_load_settings): New. - - * main.c (idle_cb): Initialize Gconf, create the GConfClient and - pass it to `e_shell_new()'. - - * e-shell.c: New member `gconf_client' in `EShellPrivate'. - (destroy): Unref it if not NULL. - (init): Init to NULL. - (e_shell_new): New param @gconf_client. - (e_shell_construct): Likewise. - - * Makefile.am (INCLUDES): Add `GCONF_CFLAGS'. - -2000-06-27 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct): - Enable the title bar button. - -2000-06-27 Michael Zucchi <zucchi@zedzone.mmc.com.au> - - * e-shell.c (folder_selection_dialog_clicked_cb): Close the dialog - when done. Dont do anything if 'new' was pressed, and always - return empty strings if 'cancel' was pressed. - -2000-06-27 Michael Zucchi <zucchi@zedzone.mmc.com.au> - - * e-shell.c (impl_Shell_user_select_folder): Set the listener as - the corba_listener data, not the shell. - -2000-06-26 Christopher James Lahey <clahey@helixcode.com> - - * glade/Makefile.am: Added EXTRA_DIST for make distcheck. - -2000-06-19 Ettore Perazzoli <ettore@helixcode.com> - - * e-local-storage.c: Don't #define POSIX_SOURCE at all; this is - not needed anymore as we no longer use `readdir_r'. - -2000-06-19 Chris Toshok <toshok@helixcode.com> - - * e-local-storage.c: #undef _POSIX_SOURCE after including - dirent.h. this breaks the build on freebsd if we leave it - #defined. go figure. - -2000-06-19 Dan Winship <danw@helixcode.com> - - * evolution-shell-component-client.c - (evolution_shell_component_client_new): Add a warning before - crashing due to a known bug when it can't activate a component, so - people don't have to waste any time trying to figure out what's - up. - -2000-06-13 Ettore Perazzoli <ettore@helixcode.com> - - * Makefile.am: Compile the CORBA-built files, - evolution-shell-component.c and evolution-storage.c into a - separate `libeshell.a' library. Link the `evolution' executable - to it. Also cleaned up a bit and got rid of the `CPP_FLAGS' - assignment. - -2000-06-12 Michael Meeks <michael@helixcode.com> - - * e-shell-folder-selection-dialog.c: include gnome-dialog.h - (PARENT_TYPE): GNOME_TYPE_DIALOG replaced with gnome_dialog_get_type. - -2000-06-10 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (impl_Shell_user_select_folder): New, implementation - for `Shell:user_select_folder'. - (corba_class_init): Install it. - (folder_selection_dialog_clicked_cb): Callback for the folder - selection dialog. - - * Evolution-Shell.idl: New method `Shell::user_select_folder'. - New interface `FolderSelectionListener'. - - * glade/e-shell-folder-creation-dialog.glade: Make it larger. - - * e-shell-folder-creation-dialog.h: Fix typo: #include - <gtk/gtkwindow.h>, not <gtk/gtkwidget.h>. - - * e-shell-view-menu.c: Added "Go to folder..." command. - (commmand_goto_folder): Implementation for it. - - * e-shell-folder-selection-dialog.c: New. - * e-shell-folder-selection-dialog.h: New. - -2000-06-10 Ettore Perazzoli <ettore@helixcode.com> - - * e-local-folder.c (save_metadata): Don't set the description in - the XML file if null. Compute the physical path correctly. - - * e-folder.c (e_folder_construct): Allow NULL description. - - * evolution-shell-component-client.c (init): Initalize - `listener_interface' to `CORBA_OBJECT_NIL' and `listener_servant' - to NULL. - (create_listener_interface): Return void and set the `servant' and - `listener_servant' fields directly. - (evolution_shell_component_client_async_create_folder): Updated - accordingly. - - * e-shell-folder-creation-dialog.c: New struct `DialogData' to be - passed to the dialog's callbacks. - (dialog_data_destroy): New. - (e_shell_show_folder_creation_dialog): Set up a `DialogData' - object and pass it as the data for the signals. - (shell_destroy_cb): New handler for the "destroy" signal on the - shell. - (e_shell_show_folder_creation_dialog): Connect it. - (dialog_destroy_cb): New handler for the "destroy" signal on the - dialog; it frees the associated `DialogData'. - (e_shell_show_folder_creation_dialog): Connect it. - (async_create_cb): New function, callback for the async folder - creation function. - (entry_name_is_valid): New function to check if the entered folder - name is valid. - (dialog_clicked_cb): Check if the specified folder name is valid - and, if so, asynchronously create the new folder. - (add_folder_types): Set "type_name" data on each menu item. - - * e-storage-set-view.c (e_storage_set_view_get_current_folder): - New function. - - * e-storage-set.c (get_storage_for_path): New helper function. - (e_storage_set_get_folder): Use it. - - * e-storage.c (e_storage_async_create_folder): Renamed from - `e_storage_create_folder'. - (e_storage_remove_folder): Renamed from `e_storage_remove_folder'. - (impl_create_create_folder): Renamed from `impl_create_folder'. - (impl_create_remove_folder): Renamed from `impl_remove_folder'. - (class_init): Updated accordingly. - (e_storage_result_to_string): New function. - - * e-storage.h: `::create_folder' renamed to - `::async_create_folder'. `::remove_folder' renamed to - `::async_remove_folder'. - - * evolution-shell-component.h: Return type of - `EvolutionShellComponentCreateFolderFn' and - `EvolutionShellComponentRemoveFolderFn' changed to `void'. - - * e-local-storage.c: `EComponentRegistry component_registry' - replaced with `EFolderTypeRegistry folder_type_registry' in - `ELocalStoragePrivate' - (component_async_create_folder_callback): New function, to handle - the callback from EvolutionShellComponent. - (construct): Likewise. - (e_local_storage_open): Replaced @component_registry with - @folder_type_registry. - (impl_create_folder): Implemented. - - * e-local-folder.c (e_local_folder_new): New. - (e_local_folder_construct): New. - (e_local_folder_save): Precondition: physical URI is not NULL. - (save_metadata): Unlink the metadata file if `xmlSaveFile()' - fails. - - * e-storage.c (e_storage_create_folder): Precondition: @path is - absolute. - (e_storage_remove_folder): Likewise. - -2000-06-09 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view-menu.c: Removed folder menu and "save as..." command. - - * main.c (main): Call `glade_gnome_init()'. - - * e-shell-view-menu.c (command_new_folder): Implemented. - - * e-shell-folder-creation-dialog.c: New. - * e-shell-folder-creation-dialog.h: New. - - * glade/Makefile.am: New. - * glade/e-shell-folder-creation-dialog.glade: New. - - * e-shell-view.c (e_shell_view_get_current_uri): New. - - * e-folder-type-registry.c - (e_folder_type_registry_get_type_names): New. - - * e-shell-view.c (get_control_for_uri): Updated to use - `EvolutionShellComponentClient'. - - * e-folder-type-registry.c: Use `EvolutionShellComponentClient's - instead of `BonoboObjectClient's. - - * e-component-registry.c: Use `EvolutionShellComponentClient' - instead of `BonoboObjectClient' in `Component'. - (component_new): Updated accordingly. - (register_component): Likewise. - - * evolution-shell-component-client.h: New. - * evolution-shell-component-client.c: New. - - * evolution-shell-component.c - (impl_ShellComponent_async_create_folder): New, implementation of - `::async_create_folder'. - (impl_ShellComponent_async_remove_folder): New, implementation of - `::async_remove_folder'. - (corba_class_init): Install them. - (evolution_shell_component_new): New args `create_folder_fn' and - `remove_folder_fn' for setting the handlers for these new methods. - (evolution_shell_component_construct): Likewise. - - * Evolution-ShellComponent.idl - (ShellComponent::async_create_folder): New. - (ShellComponent::async_remove_folder): New. - (ShellComponentListener): New. - - * evolution-shell-component.c (impl_ShellComponent_create_view): - New param @type. Use the new `EvolutionShellComponentCreateViewFn'. - - * evolution-shell-component.h: New enum `EvolutionShellComponentResult'. - Changed `EvolutionShellComponentCreateViewFn' to return an - `EvolutionShellComponentResult'. - - * e-shell-view.c (get_control_for_uri): Pass the folder type to - `ShellComponent::create_view'. - - * Evolution-ShellComponent.idl: New param @type for - `ShellComponent::create_view'. - -2000-06-08 Miguel de Icaza <miguel@helixcode.com> - - * main.c (development_warning): Use version here. Add padding to - the message. - Only destroy object if its window was not closed. - -2000-06-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (setup_bonobo_ui_handler): Oops. Don't create - the toolbar. This was not supposed to be committed. - -2000-06-07 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage.c (folder_destroy): Don't destroy the subfolders. - (remove_folder): New helper function. - (free_private): Use it. - (e_storage_removed_folder): Use it here too. - (folder_destroy): Don't unref the EFolder if NULL. - - * e-storage-set-view.c (e_storage_set_view_construct): Use - `gtk_signal_connect_while_alive()' instead of just - `gtk_signal_connect()' so that the signal handler is automatically - removed when we are destroyed. - - * e-storage-set.c (e_storage_set_remove_all_storages): New - function. - - * e-shell-view.c (e_shell_view_construct): Use `bonobo_object_ref' - on the shell instead of `gtk_object_ref'. - (destroy): Unref the shell. - - * e-local-storage.h: #include "e-component-registry.h". - - * e-shell.c (setup_local_storage): Renamed from `setup_storages'. - Only set up the local storage, not the CORBA one, and don't create - the storage set. - (e_shell_construct): Create the storage set here instead. Call - `setup_local_storage' after setting up the components. - - * e-local-storage.c: New member `component_registry' in - `ELocalStoragePrivate'. - (init): Init to NULL. - (destroy): If not null, unref it. - (e_local_storage_open): New arg @component_registry. - (construct): New arg @component_registry. Init - `priv->component_registry' from it. - - * e-local-storage.c (impl_get_name): Renamed from `get_name'. - (impl_create_folder): New function, implementing - `EStorage::create_folder'. Just a stub for now. - (impl_remove_folder): New function, implementing - `EStorage::remove_folder'. Just a stub for now. - (class_init): Install these stub implementations. - - * e-storage.c (e_storage_remove_folder): New function. - (e_storage_create_folder): New function. - (impl_create_folder): New function, default implementation for - `::create_folder'. - (impl_remove_folder): New function, default implementation for - `::remove_folder'. - (class_init): Install the implementations. - - * e-storage.c (impl_get_name): Renamed from `get_name'. - (impl_get_folder): Renamed from `get_folder'. - (impl_list_folders): Renamed from `list_folders'. - - * e-storage.h: New virtual methods `remove_folder', - `create_folder'. - - * e-storage.c (e_storage_removed_folder): Renamed from - `e_storage_remove_folder'. - * e-corba-storage.c (impl_StorageListener_removed_folder): Updated - accordingly. - -2000-06-02 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (setup_bonobo_ui_handler): Create the default toolbar. - -2000-06-02 Jeffrey Stedfast <fejj@helixcode.com> - - * e-shell-view-menu.c: Changed "Using the Shell" to "Getting Started" - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view.c: Free the uri variable. - - * e-shell.c: Free the local_directory variable. - -2000-06-02 Ettore Perazzoli <ettore@helixcode.com> - - * main.c (view_delete_event_cb): New callback for the - "delete_event" on the view. - (idle_cb): Connect it. - -2000-06-01 Christopher James Lahey <clahey@helixcode.com> - - * e-storage-set-view.c (set_e_shortcut_selection): Added a - g_return_if_fail check. - -2000-06-01 Dan Winship <danw@helixcode.com> - - * e-shell-view-menu.c (command_help): New menu callback to launch - the help browser. - (menu_help): add pointers to the users' guide. - (e_shell_view_menu_setup): Add the help menu stuff to the uih. - - * main.c (main): Set up gettext. (Problem noted by Héctor García - Alvarez) - -2000-06-01 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (DEFAULT_WIDTH): Add more 5 pixels. - -2000-06-01 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (DEFAULT_WIDTH): Made the default window a bit - narrower. - (DEFAULT_HEIGHT): And shorter. - (setup_widgets): Set the border width of the vbox that holds the - title bar to 2 pixels, so that the view looks a bit nicer. - -2000-06-01 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (DEFAULT_TREE_WIDTH): Made the tree 150 pixel - wide [instead of 100]. - (setup_widgets): Use `DEFAULT_TREE_WIDTH' instead of - `DEFAULT_SHORTCUT_BAR_WIDTH' where appropriate. - (e_shell_view_construct): Hide the folder bar by default. - - * e-storage-set-view.c (e_storage_set_view_construct): Set - auto-resize mode for column one. - -2000-06-01 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view-menu.c (e_shell_view_menu_setup): Set the - statusbar. - - * e-shell-view.c: New member `appbar' for `EShellViewPrivate'. - (init): Initialize to NULL. - (setup_widgets): Install a status bar and set `appbar' to point to - it. - (setup_bonobo_ui_handler): Make the BonoboUIHandler use `appbar' - as its statusbar. - (e_shell_view_get_appbar): New function. - (e_shell_view_construct): Set up the BonoboUIHandler after setting - up the widgets. - - * e-shortcuts.c (class_init): Add new signals "new_shortcut", - "removed_shortcut", "new_group", "removed_group". - (e_shortcuts_remove_shortcut): Emit "remove_shortcut". - (e_shortcuts_add_shortcut): Emit "new_shortcut". - (e_shortcuts_remove_group): Emit "remove_group". - (e_shortcuts_add_group): Emit "new_group". - (unload_shortcuts): Emit "remove_group" for all the groups. - - * e-shortcuts.h: New signals "new_shortcut", "removed_shortcut", - "new_group", "removed_group". - - * e-shortcuts-view.c (pop_up_right_click_menu): New function to - pop up the right-click menu for the shortcut bar. - (pop_up_right_click_menu_for_shortcut): New function. - (selected_item): Pop up right click menu when appropriate. Don't - activate the shortcut when right-clicking. - -2000-05-31 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage.h: #include 'Evolution.h". - -2000-05-31 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (show_error): Use `set_current_notebook_page()' - instead of `gtk_notebook_set_page()'; this will also deactivate - the current control properly. - - * e-shell-view-menu.c (e_shell_view_menu_setup): Initialize the - state of the shortcut/folder toggle menu items using - `e_shell_view_get_shortcut_bar_mode()' and - `e_shell_view_get_folder_bar_mode()'. - (command_toggle_shortcut_bar): Removed debugging message. - (command_toggle_folder_bar): Likewise. - - * e-shell-view.c (e_shell_view_get_shortcut_bar_mode): New - function. - (e_shell_view_get_folder_bar_mode): New function. - -2000-05-31 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage-set-view.c: New constant `DRAG_RESISTANCE'. New - members `button_x', `button_y' in `EStorageSetViewPrivate'. - (init): Initialize to zero. - (button_press_event): Set. - (motion_notify_event): Don't start drag unless the current x/y - position is farther than `DRAG_RESISTANCE', in any of the two - directions, from the original position of the button click. - (button_release_event): Always ungrab the pointer, even if - `selected_row_path' is NULL. - -2000-05-31 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-component.c (class_init): Eeek! - s/owner_set/owner_unset/. - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct): - Increase the size of the border of the hbox slightly to make the - title bar a bit nicer. - -2000-05-31 Ettore Perazzoli <ettore@helixcode.com> - - * e-component-registry.c (component_free): Invoke `::unset_owner' - on the component before releasing it. - - * evolution-shell-component.c (class_init): Install the - "owner_set" signal. - (impl_ShellComponent_unset_owner): New function, implementation of - `ShellComponent::unset_owner'. - (corba_class_init): Install it. - - * evolution-shell-component.h: New signal "owner_unset". - - * Evolution-ShellComponent.idl: New method `ShellComponent:: - unset_owner'. - - * e-shell.c (e_shell_quit): Destroy all the views explicitly. - - * e-shell-view-menu.c: Changed `Show shortcut bar' and `Show - folder tree' items into toggle items. - (shortcut_bar_mode_changed_cb): New callback to update the status - of the "show shortcut bar" toggle item when the shortcut bar is - hidden/shown in the view. - (folder_bar_mode_changed_cb): Likewise for the folder bar. - (e_shell_view_menu_setup): Connect these to the corresponding - signals on the shell. - - * e-shell-view.c: New members `shortcut_bar_mode' and - `folder_bar_mode' in `EShellViewPrivate'. - (init): Initialize `shortcut_bar_mode' and `folder_bar_mode' to - `E_SHELL_VIEW_SUBWINDOW_HIDDEN'. - (class_init): Add the new signals. - (e_shell_view_set_shortcut_bar_mode): Renamed from - `e_shell_view_show_shortcuts'. Emit "shortcut_bar_mode_changed" - and update the `shortcut_bar_mode' member. - (e_shell_view_set_folder_bar_mode): Renamed from - `e_shell_view_show_folders'. Emit "folder_bar_mode_changed" and - update the `folder_bar_mode' member. - - * e-shell-view.h: New signals "shortcut_bar_mode_changed", - "folder_bar_mode_changed". - - * e-shell-view.c (setup_menus): Removed. - (e_shell_view_construct): Use `e_shell_view_menu_setup' instead. - (e_shell_view_get_bonobo_ui_handler): New function. - - * e-shell-view-menu.c (e_shell_view_menu_setup): New. - - * e-shell.c (impl_Shell_get_component_for_type): New function, - implementation of `Evolution::Shell::get_component_for_type'. - (corba_class_init): Install it into the EPV. - - * Evolution-Shell.idl: Added method `get_component_for_type'. - -2000-05-30 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts.c: New members `dirty', `save_idle_id' in - `EShortcutsPrivate'. - (init): Initialize. - (destroy): If the idle ID is nonzero, remove the idle. If `dirty' - is true, save. - (idle_cb): New. - (schedule_idle): New. - (make_dirty): New. - (e_shortcuts_remove_shortcut): Call it. - (e_shortcuts_add_shortcut): Likewise. - (e_shortcuts_remove_group): Likewise. - (e_shortcuts_add_group): Likewise. - - * e-shell.c (e_shell_construct): Updated to match the `EShortcuts' - API changes. - - * e-shortcuts.c: New member `file_name' in `EShortcutsPrivate'. - (init): Init to NULL. - (destroy): Free it. - (e_shortcuts_load): Removed. - (e_shortcuts_save): Removed. - (e_shortcuts_new): New arg @file_name. Load from the specified - file name. - - * e-shortcuts-view.c (added_item): New method implementation. - (removed_item): New method implementation. - (added_group): New method implementation. - (removed_group): New method implementation. - (class_init): Install these. - - * e-shortcuts.c (e_shortcuts_remove_shortcut): New function. - (e_shortcuts_add_shortcut): New function. - (e_shortcuts_remove_group): New function. - (e_shortcuts_add_group): New function. - - * e-shell-view.c: New member `view_title_bar' in - `EShellViewPrivate'. - (setup_widgets): Put an EShellFolderTitleBar on top of the tree - view and the content view. - (update_window_icon): Renamed from `set_icon'. - (update_folder_title_bar): New. - (popup_tree): New function to pop up the tree view when the title - button in the title bar is clicked. - (folder_title_clicked_cb): New callback for the "clicked" signal - of EShellFolderTitleBar. - (setup_widgets): Don't add a title bar to the shortcut bar. - (create_storage_set_subwindow): New helper function. - (setup_widgets): Use it. - (show_error): Use an EClippedLabel instead of a GtkLabel. - - * e-shell-view.c: Replaced all the occurences of `gpointer' with - `void *' for consistency. - - * e-shell-folder-title-bar.c: New file. - * e-shell-folder-title-bar.h: New file. - - * e-storage-set-view.c (e_storage_set_view_construct): Ooops. Fix - inverted key/value pair in the call to `g_hash_table_insert()'. - -2000-05-28 Dan Winship <danw@helixcode.com> - - * main.c (main): Remove extra free of evolution_directory. - -2000-05-28 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage.c (evolution_storage_register): Use the - storage's name when registering. - -2000-05-26 Matt Loper <matt@helixcode.com> - - * e-shell-view-menu.c (command_about_box): Make authorlist more - alphabetical. - (command_show_treeview): New function; shows the treeview, when it - has been hidden. - (command_show_shortcut_bar): New function; shows the shortcut bar, - when it's been hidden. - -2000-05-26 Ettore Perazzoli <ettore@helixcode.com> - - * e-corba-storage.c (impl_StorageListener_new_folder): Set the - physical URI on the folder using `e_folder_set_physical_uri()'. - - * e-local-folder.c (get_physical_uri): Removed. - (construct_loading_metadata): Use EFolder's `physical_uri' field - instead of ours, which is gone. - (save_metadata): Likewise. - (destroy): Don't free. - - * e-local-folder.h: Removed `physical_uri' from `ELocalFolder'. - - * e-folder.c: New member `physical_uri' in `EFolderPrivate'. - (init): Initialize to NULL. - (destroy): Free it. - (get_physical_uri): Removed. - (e_folder_set_physical_uri): New function. - - * e-storage-set.c (e_storage_set_get_folder): Fix off-by-one error - in extracting the base name. - - * e-storage.c: New member `path' in `Folder'. - (folder_destroy): Free it. - (folder_new): New arg. Initialize `path' from it. - (e_storage_construct): Updated accordingly. - (e_storage_new_folder): Likewise. - (e_storage_remove_folder): Remove the folder from the hash. - - * e-storage-set-view.c (remove_node): New function. - (removed_storage_cb): Use it. - (new_folder_cb): New function, callback for the "new_folder" - signal on the EStorageSet. - (removed_folder_cb): New function, callback for the - "removed_folder" signal on the EStorageSet. - (e_storage_set_view_construct): Connect these signal handlers to - the respective signals on our model storage. - - * e-storage-set.c (storage_new_folder_cb): New function, callback - for the "new_folder" signal on the storages. - (storage_removed_folder_cb): New function, callback for the - "removed_folder" signal on the storages. - (e_storage_set_add_storage): Connect them to the signals of the - storage being added. - - * e-corba-storage-registry.c - (impl_StorageRegistry_register_storage): Throw an exception if - `e_storage_set_add_storage()' returns false. - - * e-shell.c (setup_storages): Unref the local storage after adding - to the storage set. - - * e-corba-storage-registry.c - (impl_StorageRegistry_register_storage): Unref the storage after - adding to the storage set. - - * e-storage-set.c: New hash table `name_to_named_storage' in - `EStorageSetPrivate'. - (named_storage_new): New helper function. - (named_storage_destroy): New helper function. - (e_storage_set_add_storage): Use the hash table. Return value - changed to `gboolean'. Return FALSE if there is a storage with - that name already. Also, ref the storage. - (e_storage_set_remove_storage): Likewise [but of course don't ref - the storage]. - (e_storage_set_get_storage): Use the `name_to_named_storage' hash - table. - (destroy): Destroy the `name_to_named_storage' hash. - - * e-storage-set.h: New signals "new_folder", "removed_folder". - - * e-storage.c (e_storage_get_watcher_for_path): Removed. - (get_watcher_for_path): Removed. - (class_init): Install signals "new_folder" and "removed_folder". - (e_storage_remove_folder): Emit "removed_folder". - (e_storage_new_folder): Emit "new_folder". - - * e-storage.h: Removed method `get_watcher_for_path'. New signals - "new_folder", "removed_folder". - - * e-storage-watcher.c: Removed. - * e-storage-watcher.h: Removed. - - * e-corba-storage-registry.c (corba_class_init): Set the - Bonobo_Unknown evp parts. - - * evolution-storage.c: New. - * evolution-storage.h: New. - - * evolution-shell-component.c - (evolution_shell_component_get_owner): New. - - * e-storage-set-view.c (new_storage_cb): New function. - (e_storage_set_view_construct): Connect to the "new_storage" - signal on the EStorageSet. - (removed_storage_cb): New function. - (e_storage_set_view_construct): Connect to the "removed_storage" - signal on the EStorageSet. - - * e-storage-set-view.c (e_storage_set_view_construct): Make this - always look pretty, with Helix GNOME or without. - -2000-05-25 Christopher James Lahey <clahey@helixcode.com> - - * e-storage-set-view.c: Make this always look pretty, with Helix - GNOME or without. - -2000-05-25 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage-set-view.c (e_storage_set_view_construct): Set the - dotted line type again. Dotted is less butt-ugly than continuous. - - * e-shell-view.c (show_error): Display page zero in the notebook. - - * main.c (idle_cb): Renamed from `new_view_idle_cb'. Create the - EShell object here, because now the shell depends on the GLib loop - to be running for correct operation. - (main): Don't create the EShell here. - - * e-storage-set-view.c (get_pixmap_and_mask_for_folder): If the - icon is not found, set the returned pixmap and mask to NULL. - - * e-shell.c (e_shell_construct): Added precondition: @corba_object - must be non-nil. - (e_shell_new): Added precondition: @local_direcory must be - non-null. - - * evolution-shell-component.c: New. - * evolution-shell-component.h: New. - - * e-shell.c: New member `component_registry' in `EShellPrivate'. - (init): Initialize to NULL. - (destroy): Unref it. - (setup_components): New function to set up the compnent registry - and initialize the mail, calendar and addressbook components. - (e_shell_construct): Call it. - - * e-storage-set.c: Updated to use EFolderTypeRegistry. - * e-storage-set.h: Likewise. - * e-shortcuts.c: Likewise. - * e-shortcuts.h: Likewise. - * e-shell.c: Likewise. - - * e-shell.h: Likewise. - * e-shell-view.c: Likewise. - * e-shortcuts-view.c: Likewise. - * e-storage-set-view.c: Likewise. - - * e-component-registry.c: New. - * e-component-registry.h: New. - - * e-folder-type-registry.c: New. - * e-folder-type-registry.h: New. - - * e-folder-type-repository.c: Removed. - * e-folder-type-repository.h: Removed. - - * Evolution-ShellComponent.idl: New struct `FolderType'; new type - `FolderTypeList'. New attribute `supported_types'. - (ShellComponent::set_owner): Renamed from `set_shell'. - (ShellComponent::create_view): New. - -2000-05-24 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view.c: Was using the wrong include here. - - * e-storage-set-view.c: Got rid of the lines in the tree view. - -2000-05-24 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Added libepaned.a. - - * e-shell-view.c: Switched from GtkPaned to EPaned. - -2000-05-23 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c: New member `corba_storage_registry' in - `EShellPrivate'. - (init): Initialize it to NULL. - (destroy): Unref it if not NULL. - (setup_corba_storages): New function to set up the CORBA storage - registry and `bonobo_object_add_interface()' it to the shell. - (setup_storages): Call it from here. - - * e-shell.h, e-shell.c: Derive EShell from BonoboObject instead of - GtkObject. - - * e-storage.c (e_storage_remove_folder): Return value changed into - `gboolean'; return false if an error occurs, true otherwise. - (e_storage_new_folder): Likewise. - - * e-corba-storage-registry.c: New. - * e-corba-storage-registry.h: New. - - * e-corba-storage.c: New. - * e-corba-storage.h: New. - - * Evolution.idl: Include the new IDLs, but no - `evolution-service-repository.idl' anymore. - - * Evolution-Shell.idl: New. - * Evolution-ShellComponent.idl: New. - * Evolution-Storage.idl: New. - - * evolution-service-repository.idl: Removed. - * evolution-service-repository.c: Removed. - * evolution-service-repository.h: Removed. - - * e-folder-type-repository.c (folder_type_new): Free `icon_path'. - -2000-05-18 Dan Winship <danw@helixcode.com> - - * main.c (new_view_idle_cb): add development_warning (moved from - mail component) - -2000-05-16 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage-set-view.c: Get rid of the `ICON_WIDTH' and - `ICON_HEIGHT' #defines. - (get_pixmap_and_mask_for_folder): Get the mini icon instead of the - big one. Use `E_SHELL_MINI_ICON_SIZE' instead of `ICON_WIDTH' and - `ICON_HEIGHT'. - - * e-folder-type-repository.c: New member `mini_icon_pixbuf' in - `FolderType'. - (folder_type_new): Initialize `mini_icon_pixbuf' by loading the - mini icon if possible. If the mini icon is not found, resort to - the big one. - (folder_type_free): Unref the mini icon. - (e_folder_type_repository_get_icon_for_type): New arg @mini. If - true, return the mini icon instead of the standard one. - - * e-shell-view.c (set_icon): Get the mini icon instead of the big - one by using `e_shell_get_icon_path's @try_mini arg. - - * e-shell-constants.h: New file. - - * e-shell-utils.c - (e_shell_get_icon_path): New arg @try_mini. If true, look for the - mini version [whose name ends in `-mini']. - - * e-folder-type-repository.c - (folder_type_new): Free string returned by - `e_shell_get_icon_path()'. - -2000-05-16 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c: New members `storage_set_view_box', - `shortcut_bar_box', `hpaned1_position', `hpaned2_position' in - `EShellViewPrivate'. - (init): Initialize them. - (setup_widgets): Add title bars to the tree and shortcut views. - (shortcuts_view_close_button_clicked_cb): New callback function. - (setup_widgets): Connect to the "close_button_clicked" signal of - the shortcut view's title bar. - (storage_set_view_close_button_clicked_cb): New callback function. - (setup_widgets): Connect to the "close_button_clicked" signal of - the storage set view's title bar. - (e_shell_view_show_shortcuts): New function. - (e_shell_view_show_folders): New function. - - * e-shell-view.c: New members `hpaned1', `hpaned2' in - `EShellViewPrivate'. - (init): Initialize both to NULL. - (setup_widgets): Invert the parenting order for the GtkHPaneds and - store them into the private `hpaned' and `hpaned2' members. - - * Makefile.am (evolution_LDADD): Link with `libemiscwidgets.a'. - -2000-05-15 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts.c - (load_shortcuts_into_view): Removed. - (e_shortcuts_new_view): Don't set up the shortcut bar manually - here anymore, and don't set the icon callback either. The - `EShortcutsView' object is now able to do this by itself. - - * e-shortcuts-view.c - (icon_callback): Moved here from `e-shortcuts.c'. - (load_group): New function. - (load_all_shortcuts): New function. - (e_shortcuts_view_construct): Call it to load the shortcuts from - the `EShortcuts' object. Also, set `icon_callback' as the icon - callback. - - * e-storage-set-view.c - (button_press_event): Add/remove grab with `gtk_grab_add' and - `gtk_grab_remove'. - (button_release_event): Call `gtk_grab_remove' when removing the - grab. - - * e-shortcuts.c: New member `title_to_group' in - `EShortcutsPrivate'. - (init): Initialize here. - (destroy): Destroy here. - (unload_shortcuts): Destroy and recreate here. - (load_shortcuts): Avoid inserting multiple groups with the same - title, and insert the groups into the `title_to_group' hash table. - Also, avoid leaking the return value from `xmlNodeListGetString'. - (e_shortcuts_get_group_titles): New function. - (e_shortcuts_get_shortcuts_in_group): New function. - (e_shortcuts_get_storage_set): New function. - - * e-storage-set-view.c - (e_storage_set_view_set_current_folder): Emit the - "folder_selected" signal. - - * e-local-folder.c - (get_string_value): Return a `char *' to be deallocated by the - caller instead of a `const char *' that does not need to be - deallocated. - (construct_loading_metadata): Free values returned from - `get_string_value'. - -2000-05-15 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage-set-view.c: New members `dragged_row_path', - `selected_row_path_before_click' in `EStorageSetViewPrivate'. - (init): Initialize them to NULL. - (motion_notify_event): Set `dragged_row_path' from - `selected_row_path'. - (button_press_event): Initialize `selected_row_path_before_click' - from `selected_row_path'. - (button_release_event): Set `selected_row_path_before_click' to - NULL. - (drag_end): Restore the current selection from - `selected_row_path_before_click'; then set both `dragged_row_path' - to NULL. - -2000-05-15 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage-set-view.c: New members `in_drag' and `drag_button' in - `EStorageSetViewPrivate'. New static variables `drag_types', - `num_drag_types', `target_list'. - (class_init): Create the `target_list'. - (init): Initialize the private `in_drag' member to false. - Initialize the private `drag_button' member to zero. - (button_release_event): Set it to false. - (motion_notify_event): New function, implementation of - `GtkWidget::motion_notify_event'. If `in_drag' is false, set it - to true and set ourselves up as a drag source. - (button_press_event): New function, implementation of - `GtkWidget::button_press_event'. Set `drag_button' to the event's - button number and then chain to the implementation in the parent - class. - (drag_end): New function, implementation of `GtkWidget::drag_end'. - (drag_data_get): New function, implementation of - `GtkWidget::drag_data_get'. - (set_e_shortcut_selection): New function, helper for `drag_data_get'. - (set_uri_list_selection): New function, helper for `drag_data_get'. - (class_init): Install these method implementations. - - * e-storage-set-view.c: New member `selected_row_path' in - `EStorageSetViewPrivate'. - (init): Initialize it to NULL. - (tree_select_row): Set it to the path of the selected row. Don't - emit "folder_selected" yet. Also, keep the grab. - (button_release_event): New function, implementation of - `GtkWidget::button_release_event'. If `selected_row_path' is not - NULL, emit the "folder_selected" signal with `selected_row_path' - as the parameter and then set `selected_row_path' to NULL again. - (class_init): Install `button_release_event'. - - * e-storage-set-view.c: Made `ICON_WIDTH' and `ICON_HEIGHT' global - #defines. - (e_storage_set_view_construct): Set the row height to - `ICON_HEIGHT'. Alos, set the selection mode to - `GTK_SELECTION_BROWSE'. - -2000-05-15 Iain Holmes <ih@csd.abdn.ac.uk> - - * e-local-folder.c (get_string_value): Use the correct function to - get the node's contents. - - * e-shortcuts.c (load_shortcuts): Same as above. - -2000-05-14 Ettore Perazzoli <ettore@helixcode.com> - - * e-folder-type-repository.c - (e_folder_type_repository_get_control_id_for_type): Protect - against non-existing types. - (e_folder_type_repository_get_icon_for_type): Likewise. - -2000-05-14 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage-set-view.c - (folder_compare_cb): Callback comparison function for comparing - folders based on their names. - (insert_folders): Use it to sort the folder list before using it. - -2000-05-14 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c - (setup_storages): Pass the pointer to the folder type repository. - (e_shell_construct): Initialize the folder type repository before - everything else. - - * e-storage-set.c: New member `folder_type_repository' in - `EStorageSetPrivate'. - (init): Initialize it to NULL. - (destroy): Unref it. - (e_storage_set_construct): New arg @folder_type_repository. - Initialize the corresponding member in the private struct through - it. - (e_storage_set_new): New arg @folder_type_repository. - (e_storage_set_get_folder_type_repository): New function. - - * e-shortcuts.c (icon_callback): Just use [the new version of] - `e_folder_type_repository_get_icon_for_type()' instead of loading - the image manually. - - * e-folder-type-repository.c: New member `icon_pixbuf' in - `FolderType'. - (folder_type_new): Load the pixbuf. - (folder_type_free): Unref the pixbuf. - (e_folder_type_repository_get_icon_name_for_type): Renamed from - `e_folder_type_repository_get_icon_for_type'. - (e_folder_type_repository_get_icon_for_type): New function, now - returning a `GdkPixbuf *'. - - * e-shortcuts.c - (icon_callback): Use `e_shell_get_icon_name()'. - - * e-shell-view.c: New member `storage_set_view' in - `EShellViewPrivate'. - (init): Initialize it to NULL. - (e_shell_view_construct): Create an EStorageSetView for the - shell's EStorageSet and put it into a scrolled window. Also, put - the scrolled window into the EShellView with some - [temporary] GtkPaned action. Store the pointer to the - EStorageSetView to `priv->storage_set_view'. - (set_icon): Get an EShellView and an EFolder instead of an - EShellView and a URI. Also, don't leak. - (update_for_current_uir): New helper function. Call `set_icon'. - (show_error): Call it. - (folder_selected_cb): New function. - (setup_widgets): Connect it to the "folder_selected" signal of the - storage set view. - - * e-storage-set-view.c: New file. - * e-storage-set-view.h: New file. - - * e-shell-utils.c: New file. - * e-shell-utils.h: New file. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view-menu.c: Added an about box. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view.c: Set the icons when changing between components. - - * main.c: Set the default icon. (The change in e-shell-view.c - doesn't work unless we do this.) - -2000-05-09 Matt Loper <matt@helixcode.com> - - * e-shell-view-menu.c (command_run_bugbuddy): New function; allows - users to submit a bug. - (command_run_bugbuddy): Implemented with jacob's patch. - -2000-05-09 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (e_shell_new_view): Display the specified @uri in the - view. - - * e-shell-view.c (e_shell_view_construct): Removed arg @uri. - (e_shell_view_new): Likewise. - - * main.c: New string constant `STARTUP_URI', specifying the URI to - show in the startup view. - (new_view_idle_cb): New callback function to create a new view for - `STARTUP_URI' in the idle loop. We need to do this in the idle - loop because the CORBA stuff cannot work until the loop starts - running. - (main): Set `new_view_idle_cb' up as the idle callback instead of - creating the view right away. - -2000-05-09 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (setup_storages): Woops. Don't free the path before - the warning message, as we need to print it. - -2000-05-08 Ettore Perazzoli <ettore@helixcode.com> - - * main.c (destroy_cb): New function. - (main): Connect it to the `destroy' signal on the shell. - -2000-05-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts.c (load_shortcuts): Const fix. - -2000-05-08 Larry Ewing <lewing@helixcode.com> - - * e-shortcuts.c (load_shortcuts_into_view): xmlFree the return - value of xmlGetProp. - -2000-05-07 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts-view.c (e_shortcuts_view_construct): Use - correct cast. - -2000-05-07 Ettore Perazzoli <ettore@helixcode.com> - - * main.c (main): Connect to "no_views_left", not "destroy". - - * e-shell.c (view_destroy_cb): Grmpf. - -2000-05-07 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (e_shell_construct): Output a warning message if the - shortcut file is not found. - (setup_storages): Output a warning message if the local storage - cannot be initialized. - (destroy): Destroy all the views. - - * e-shell-view.c - (e_shell_view_construct): Ref the shell. - - * e-shortcuts-view.c - (e_shortcuts_view_construct): Ref the shortcuts. - - * e-shell.c: Create the "no_views_left" signal. New member - `views' in `EShellPrivate'. - (init): Initialize `views' to NULL. - (view_destroy_cb): Destroy handler for a view: remove the view - from `views', and emit the "no_views_left" signal if this was the - last view. - (e_shell_new_view): Add the new view to `views' and connect the - "destroy" signal to `view_destroy_cb'. - (destroy): Destroy the views. - - * e-shell.h: New signal "no_views_left". - - * e-shell-view-menu.c (command_quit): New function, implementation - of the "quit" command. - - * e-shell-view.c (e_shell_view_get_shell): New function. - - * e-shell.c (e_shell_quit): New function. - - * main.c (main): If it is not possible to create the shell for - some reason, pop up an error message. - (shell_destroy_cb): New function, signal handler for "destroy" on - the shell object. - (main): Connect it. - -2000-05-06 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts.c (destroy): Be safer about NULL objects. - - * e-shell.c (destroy): Be safer about NULL objects. - - * e-local-storage.c (load_folders): Use `readdir()', not - `readdir_r()'. - -2000-05-06 Ettore Perazzoli <ettore@helixcode.com> - - * main.c (init_corba) [! USING_OAF]: We have no options no - popt context. - -2000-05-06 Ettore Perazzoli <ettore@helixcode.com> - - * All files: Reorganized and redone a lot of the shell. New - features: internal URI namespace, extensible storage/folder - mechanism, configurable shortcuts. - -2000-05-03 Damon Chaplin <damon@helixcode.com> - - * e-shell-view.c (e_shell_view_new): turned the notebook border off. - The calendar looks better without it. If any of the views want a - border they should create it themselves, shouldn't they? - -2000-05-04 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcut.c (shell_icon_cb): Type of @url changed from `gchar - *' to `const gchar *'; new arg @data. - (e_shortcut_bar_view_new): Pass NULL as the closure value for - `e_shortcut_bar_set_icon_callback()'. - -2000-05-02 Ettore Perazzoli <ettore@helixcode.com> - - * e-folder-mail.c: Removed. - - * e-folder-mail.h: Removed. - - * eshell-types.h: Removed. - - * e-folder.h: Don't #include "eshell-types.h". - -2000-05-02 Ettore Perazzoli <ettore@helixcode.com> - - * e-folder.h: Removed member `eservice' from `EFolder'. - - * e-service.c: Removed. - - * e-service.h: Removed. - -2000-05-02 Matt Loper <matt@helixcode.com> - - * Makefile.am: set G_LOG_DOMAIN. - -2000-05-01 Dan Winship <danw@helixcode.com> - - * e-shell-view.c (e_shell_view_set_view): Turn off control frame - autoactivation, so the toolbars work correctly. This may actually - be a bug in Bonobo, but we'll kludge around it here for now. - -2000-04-27 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c: OAFized. - (get_view): If `bonobo_widget_new_control()' fails for the - calendar, don't try to get the property bag and stuff and thus - prevent a segfault. - - * main.c - (corba_init): Removed Bonobo initialization. Implemented OAF - version for the case in which `USING_OAF' is #defined. - (init_bonob): New function. - (main): Call `init_bonobo()'. - -2000-04-26 Matt Loper <matt@helixcode.com> - - * e-shell-view.c (bonobo_widget_is_dead): Helper function to see - whether a bonobo widget is a zombie (ie the remote bonobo control - died). - (e_shell_view_set_view): Try to respawn dead widgets. - -2000-04-25 Dan Winship <danw@helixcode.com> - - * Makefile.am: include -I$(datadir)/idl in orbit-idl arguments so - that you can have bonobo installed in the same prefix as - evolution, when that isn't the same prefix is gnome-libs, which a - lot of people seem to be doing. - (CLEANFILES): add EVOLUTION_CORBA_GENERATED - -2000-04-24 Christopher James Lahey <clahey@helixcode.com> - - * idl/folder.idl: Made some functions syncronous that didn't need - to be asyncronous. - -2000-04-24 Matt Loper <matt@helixcode.com> - - * e-shell-view.h: Added hpaned and treeview widgets to - EShellView. Added e_shell_view_toggle_shortcut_bar() and - e_shell_view_toggle_treeview(). - - * e-shell-view.c (e_shell_view_setup_shortcut_display): Use EPaned - widget to house our shortcut bar. - (e_shell_view_toggle_shortcut_bar): New function; toggles whether - the shortcut bar is showing. - (e_shell_view_toggle_treeview): Same, for the treeview (NYI). - (e_shell_view_new): Put the notebook view in our EPaned widget. - - * e-shell-view-menu.c (esv_cmd_toggle_shortcut_bar): New function; - toggles whether the shortcut bar is viewed. - (esv_cmd_toggle_treeview): Same, but with the treeview. Added - menuitems in the "view" menu to allow access to the above. - -2000-04-19 Seth Alves <alves@hungry.com> - - * e-shell-view.c (get_view): set calendar's uri with a property bag - -2000-04-19 Christopher James Lahey <clahey@helixcode.com> - - * idl/folder.idl: New idl file. Still unused. - -2000-04-14 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view.c: Made the left pane of the shell view not - autoresize. - -2000-04-09 Matt Loper <matt@helixcode.com> - - * e-shell-view.c (e_shell_view_setup): Set the default height - bigger, to 600, so that everything in the shortcut-bar shows up. - -2000-04-07 Matt Loper <matt@helixcode.com> - - * e-shell-view.c (destroy_folder_view): New function; - Bonobo_Unknown_unref's the controls that have the views in them. - (esv_destroy): Calls the above for each folder_view in the - hashtable. - (get_view): unref the ServiceRepository interface of the control - when we're done with it. - -2000-04-06 Miguel de Icaza <miguel@gnu.org> - - * shell/e-shortcut.c (shell_icon_cb): Append a slash here. - (shell_icons): Only list the filenames. - - * shell/main.c (evolution_boot): Be less rude. - -2000-04-06 Matt Loper <matt@helixcode.com> - - * shell/main.c (evolution_boot): Make sure our data directory is - available with e_setup_base_dir (). - -2000-04-06 Miguel de Icaza <miguel@gnu.org> - - * shell/e-shortcut.c (shell_icon_cb): Load the icons from the - installation path, not form the GNOME-libs installation prefix. - (shell_icon_cb): Memory leak fix. - - * shell/Makefile.am (imagesdir): Pass the EVOLUTION_IMAGES - installation directory here. - -2000-04-05 Seth Alves <alves@hungry.com> - - * shell/e-shell-view.c (get_view): hook up control:calendar - -2000-03-31 Dan Winship <danw@helixcode.com> - - * shell/e-shortcut.c (e_shortcut_bar_view_new, shell_icon_cb): - Update for shortcut bar changes. - - * shell/e-folder.h: add E_FOLDER_SUMMARY - * shell/e-shell.c (e_shell_setup_default_folders): make the - "Today" icon be of type E_FOLDER_SUMMARY, not E_FOLDER_MAIL. - -2000-03-30 Dan Winship <danw@helixcode.com> - - * shell/e-shell-view.c (e_shell_view_set_view): Hold off on - deactivating the "outgoing" control until after setting up the - "incoming" control. That way if the new control takes a few - seconds to load, there won't be an ugly empty spot where the - toolbar used to be while the new control loads. - -2000-03-29 Dan Winship <danw@helixcode.com> - - * shell/e-shell-view.c (e_shell_view_set_view): Call - bonobo_control_frame_activate on the folder_view every time it - is displayed, and bonobo_control_frame_deactivate every time it is - hidden. - -2000-03-25 Matt Loper <matt@helixcode.com> - - * shell/e-shell-view.c (get_view): Move CORBA_Environment to - different scope. - -2000-03-22 Matt Loper <matt@helixcode.com> - - * shell/main.c (evolution_boot): gtk_signal_connect'ed "destroy" - to gtk_main_quit, so that the shell dies when you want it to. - - * shell/e-shell-view.c (get_view): Reorganized, and added - assertions. - (e_shell_view_set_view): Added assertions. - -2000-03-20 Matt Loper <matt@helixcode.com> - - * shell/e-shell-view.h: New private field in EShellView added, - which contains the notebook and a hashtable of folders to views. - - * shell/e-shell-view.c (e_shell_view_set_view): Instead of - creating a new control every time we set the view, we now keep our - controls in a notebook. This function now switches to the correct - notebook page, or creates a new page/control as necessary. - (e_shell_view_new): Creates and inserts the notebook into the - shell. - -2000-03-13 Christopher James Lahey <clahey@helixcode.com> - - * shell/e-shell-view.c: Added an E_FOLDER_CONTACTS section to the - get_view function. - -2000-03-13 bertrand <bertrand@helixcode.com> - - * shell/e-shell.c (EShell_register_service): - test implementation. Show the uri and the type - of service that has just been registered. - - * shell/e-shell-view.c (get_view): - once we have the bonobo control widget, - disable the autoactivation and activate - the control frame. - (get_view): added a parameter to have - a reference to the EShellView. - (get_view): In the case of the mail component - use the Evolution_ServiceRepository to - give the component a reference to the - Shell server. - -2000-03-12 bertrand <bertrand@helixcode.com> - - * shell/e-shell-view.c (get_view): name change - - - * shell/e-folder.c (e_folder_get_folder_type): added the - get_e_folder_type function. - - * shell/evolution-service-repository.c: - (evolution_service_repository_new): creates an - Evolution_ServiceRepository object. - (create_evolution_service_repository): - create the corresponding servant. - (evolution_service_repository_construct): set - the closure as well as the virtual functions. - -2000-03-12 bertrand <bertrand@helixcode.com> - - * shell/evolution-service-repository.c: - * shell/evolution-service-repository.h: - Implementation of the service repository interface - as a bonobo object. - - * shell/evolution-service-repository.idl: - new file. Contains the definition for the service - repository interface. - - * shell/Shell.idl: move the shell related stuff - here - -2000-03-12 bertrand <bertrand@helixcode.com> - - * shell/e-folder.h: add a field refering to a - service associated to the efolder. In the case of - distant folders, it is generally a server. - - * shell/e-service.c: New class. Models a service. - A service is an object with an URI and a root folder. - It genreally reporesents a distant folder. - A service is generally a ressource shared amongst - several folders. - * shell/e-service.h: - -2000-03-07 bertrand <bertrand@helixcode.com> - - * shell/e-shell-shortcut.c (shortcut_bar_item_selected): - removed a test that prevented the standard menu - to be shown. - -2000-03-01 Ettore Perazzoli <ettore@helixcode.com> - - * shell/Makefile.am (INCLUDES): use `top_srcdir' instead of - `srcdir'. Also, add `$(top_srcdir)'. And put the srcdir includes - before everything else. - (evolution_LDADD): `libeutil.la', not `libeutil.a'. - -2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org> - - * shell/Makefile.am (evolution_LDADD): - add libetext.a. - -2000-02-08 Iain Holmes <ih@csd.abdn.ac.uk> - - * shell/Makefile.am: Changed the order of the compilation, so the CORBA - stuff was generated before it was needed. - -2000-01-15 Miguel de Icaza <miguel@gnu.org> - - * shell/e-shell.c: Construct the default folders - - * shell/e-shell-view.c (e_shell_view_new): Setup the main GnomeApp - application, load the shortcut, internal api. - - * shell/e-folder.c (e_folder_get_type_name): Return description - here; Change of policy; We now know about all of the possible - types that can be displayed on Evolution. - -2000-01-15 Miguel de Icaza <miguel@gnu.org> - - * shell/e-folder.c: Renamed signal. - - * widgets/shortcut-bar/e-shortcut-bar.c (e_shortcut_bar_add_item): - Use e_bar_set_item_data. - - Drop item_url; Require image argument; Require user data - argument. - -2000-01-05 Miguel de Icaza <miguel@gnu.org> - - * shell/Makefile.am: New file. - diff --git a/shell/Evolution-Session.idl b/shell/Evolution-Session.idl deleted file mode 100644 index 855f1c03ea..0000000000 --- a/shell/Evolution-Session.idl +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for saving configuration information. - * - * Authors: - * Ettore Perazzoli <ettore@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <Bonobo.h> - -module Evolution { - - interface Session : Bonobo::Unknown { - exception Failed {}; - - /** - * save_configuration: - * @prefix: A configuration path prefix. - * - * Save the current configuration at the specified @prefix. - * The component can use any path starting by @prefix for its - * keys. - */ - void save_configuration (in string prefix) - raises (Failed); - - /** - * load_configuration: - * @prefix: A configuration path prefix. - * - * Load the saved configuration at the specified @prefix. - */ - void load_configuration (in string prefix) - raises (Failed); - }; - -}; diff --git a/shell/Evolution-Shell.idl b/shell/Evolution-Shell.idl deleted file mode 100644 index bda5732537..0000000000 --- a/shell/Evolution-Shell.idl +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the Evolution shell. - * - * Authors: - * Ettore Perazzoli <ettore@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <Bonobo.idl> - -module Evolution { - interface ShellComponent; - - interface FolderSelectionListener; - - interface Shell : Bonobo::Unknown { - exception NotFound {}; - exception Busy {}; - - /** - * get_component_for_type: - * @type: name of a valid folder type - * - * Get the shell component associated with a specific folder type. - * - * Return value: the Evolution::ShellComponent interface for the component that - * handles @type. - */ - ShellComponent get_component_for_type (in string type) - raises (NotFound); - - typedef sequence<string> FolderTypeList; - - /** - * user_select_folder: - * @listener: a listener interface to report the answer of the user. - * @title: title for the folder selector dialog - * @default_folder: physical or `evolution:' URI for the folder that must be - * selected by default, when the dialog is popped up - * @possible_types: list of the names of the types of folders that are allowed - * - * Pop up a folder selection dialog from which the user can select a folder. - * Initially, the @default_folder is selected. The user can also create a new - * folder by using the "New..." button. The dialog only lets the user choose - * a folder whose type is listed in @possible_types. - */ - void user_select_folder (in FolderSelectionListener listener, - in string title, - in string default_folder, - in FolderTypeList possible_types) - raises (Busy); - }; - - interface FolderSelectionListener { - void selected (in string uri, in string physical_uri); - void cancel (); - }; -}; diff --git a/shell/Evolution-ShellComponent.idl b/shell/Evolution-ShellComponent.idl deleted file mode 100644 index f907cca72b..0000000000 --- a/shell/Evolution-ShellComponent.idl +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the Evolution components. - * - * Authors: - * Ettore Perazzoli <ettore@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <Bonobo.h> - -module Evolution { - interface Shell; - - struct FolderType { - string name; - string icon_name; - }; - - typedef sequence<FolderType> FolderTypeList; - - interface ShellComponentListener; - - interface ShellComponent : Bonobo::Unknown { - readonly attribute FolderTypeList supported_types; - - /* FIXME: Can we use an attribute here? */ - exception AlreadyOwned {}; - - void set_owner (in Shell shell, in string evolution_homedir) - raises (AlreadyOwned); - - exception NotOwned {}; - - void unset_owner () - raises (NotOwned); - - /* FIXME: We might want more exceptions here. */ - exception NotFound {}; - exception UnsupportedType {}; - exception InternalError {}; - - Bonobo::Control create_view (in string physical_uri, - in string type) - raises (NotFound, UnsupportedType, InternalError); - - exception Busy {}; - - void async_create_folder (in ShellComponentListener listener, - in string physical_uri, - in string type) - raises (Busy); - void async_remove_folder (in ShellComponentListener listener, - in string physical_uri) - raises (Busy); - - void populate_folder_context_menu (in Bonobo::UIHandler uih, - in string physical_uri, - in string type); - }; - - interface ShellComponentListener { - enum Result { - OK, - UNSUPPORTED_OPERATION, - UNSUPPORTED_TYPE, - EXISTS, - INVALID_URI, - PERMISSION_DENIED, - HAS_SUBFOLDERS, - NO_SPACE - }; - - void report_result (in Result result); - }; -}; diff --git a/shell/Evolution-ShellView.idl b/shell/Evolution-ShellView.idl deleted file mode 100644 index f0931dccdd..0000000000 --- a/shell/Evolution-ShellView.idl +++ /dev/null @@ -1,18 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the Evolution shell views. - * - * Authors: - * Ettore Perazzoli <ettore@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <Bonobo.idl> - -module Evolution { - interface ShellView : Bonobo::Unknown { - void set_message (in string message, in boolean busy); - void unset_message (); - }; -}; diff --git a/shell/Evolution-Storage.idl b/shell/Evolution-Storage.idl deleted file mode 100644 index 4e35e859bf..0000000000 --- a/shell/Evolution-Storage.idl +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Storage interface for the Evolution shell. - * - * Authors: - * Ettore Perazzoli <ettore@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <Bonobo.h> - -module Evolution { - struct Folder { - string type; - string description; - string name; - string physical_uri; - }; - - interface Storage; - interface StorageListener; - - interface Storage : Bonobo::Unknown { - attribute string name; - }; - - interface StorageListener { - exception Exists {}; - exception NotFound {}; - - void destroyed (); - - void new_folder (in string path, in Folder folder) - raises (Exists); - - void removed_folder (in string path) - raises (NotFound); - }; - - interface StorageRegistry : Bonobo::Unknown { - exception Exists {}; - exception NotFound {}; - - StorageListener register_storage (in Storage storage, in string name) - raises (Exists); - - void unregister_storage (in string name) - raises (NotFound); - }; -}; diff --git a/shell/Evolution.idl b/shell/Evolution.idl deleted file mode 100644 index 2463d23b10..0000000000 --- a/shell/Evolution.idl +++ /dev/null @@ -1,17 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * CORBA interface for the Evolution shell. - * - * Authors: - * Ettore Perazzoli <ettore@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <Bonobo.idl> - -#include <Evolution-Session.idl> -#include <Evolution-Shell.idl> -#include <Evolution-ShellComponent.idl> -#include <Evolution-ShellView.idl> -#include <Evolution-Storage.idl> diff --git a/shell/Makefile.am b/shell/Makefile.am deleted file mode 100644 index 0b2457a464..0000000000 --- a/shell/Makefile.am +++ /dev/null @@ -1,133 +0,0 @@ -SUBDIRS = glade - -INCLUDES = \ - -I$(top_srcdir)/widgets \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_srcdir) \ - $(BONOBO_GNOME_CFLAGS) \ - -DEVOLUTION_IMAGES=\""$(datadir)/images/evolution"\" \ - -DEVOLUTION_VERSION=\""$(VERSION)"\" \ - -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\" \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTION_GLADEDIR=\"$(datadir)/evolution/glade\" \ - -DG_LOG_DOMAIN=\"evolution-shell\" - -EXTRA_DIST = $(IDLS) - -CLEANFILES = $(IDL_GENERATED) - -# CORBA stuff - -IDLS = \ - Evolution.idl \ - Evolution-Session.idl \ - Evolution-Shell.idl \ - Evolution-ShellComponent.idl \ - Evolution-ShellView.idl \ - Evolution-Storage.idl - -IDL_GENERATED = \ - Evolution.h \ - Evolution-common.c \ - Evolution-skels.c \ - Evolution-stubs.c - -Evolution-impl.o: Evolution.h - -$(IDL_GENERATED): $(IDLS) - $(ORBIT_IDL) -I$(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \ - -I$(srcdir) $(srcdir)/Evolution.idl - -# Shell library - -noinst_LIBRARIES = \ - libeshell.a - -libeshell_a_SOURCES = \ - $(IDL_GENERATED) \ - evolution-session.c \ - evolution-session.h \ - evolution-shell-client.c \ - evolution-shell-client.h \ - evolution-shell-component.c \ - evolution-shell-component.h \ - evolution-shell-component-client.c \ - evolution-shell-component-client.h \ - evolution-shell-view.c \ - evolution-shell-view.h \ - evolution-storage.c \ - evolution-storage.h - -# Evolution executable - -bin_PROGRAMS = evolution - -evolution_SOURCES = \ - e-component-registry.c \ - e-component-registry.h \ - e-corba-storage-registry.c \ - e-corba-storage-registry.h \ - e-corba-storage.c \ - e-corba-storage.h \ - e-folder-type-registry.c \ - e-folder-type-registry.h \ - e-folder.c \ - e-folder.h \ - e-local-folder.c \ - e-local-folder.h \ - e-local-storage.c \ - e-local-storage.h \ - e-setup.c \ - e-setup.h \ - e-shell-constants.h \ - e-shell-folder-creation-dialog.c \ - e-shell-folder-creation-dialog.h \ - e-shell-folder-selection-dialog.c \ - e-shell-folder-selection-dialog.h \ - e-shell-folder-title-bar.c \ - e-shell-folder-title-bar.h \ - e-shell-utils.c \ - e-shell-utils.h \ - e-shell-view-menu.c \ - e-shell-view-menu.h \ - e-shell-view.c \ - e-shell-view.h \ - e-shell.c \ - e-shell.h \ - e-shortcuts-view.c \ - e-shortcuts-view.h \ - e-shortcuts.c \ - e-shortcuts.h \ - e-storage-set-view.c \ - e-storage-set-view.h \ - e-storage-set.c \ - e-storage-set.h \ - e-storage.c \ - e-storage.h \ - main.c - -evolution_LDADD = \ - libeshell.a \ - $(top_builddir)/widgets/shortcut-bar/libshortcut-bar.a \ - $(top_builddir)/widgets/e-paned/libepaned.a \ - $(top_builddir)/widgets/e-text/libetext.a \ - $(top_builddir)/widgets/misc/libemiscwidgets.a \ - $(top_builddir)/e-util/libeutil.la \ - $(UNICODE_LIBS) \ - $(BONOBO_GNOME_LIBS) - -# Purify support - -if ENABLE_PURIFY - -PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ - -all-local: evolution.pure - -evolution.pure: evolution - @rm -f evolution.pure - $(PLINK) $(evolution_LDFLAGS) $(evolution_OBJECTS) $(evolution_LDADD) $(LIBS) - -endif - - diff --git a/shell/e-component-registry.c b/shell/e-component-registry.c deleted file mode 100644 index 411fe93d42..0000000000 --- a/shell/e-component-registry.c +++ /dev/null @@ -1,374 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-component-registry.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> -#include <gtk/gtktypeutils.h> -#include <bonobo.h> - -#include "e-util/e-util.h" -#include "e-shell-utils.h" - -#include "Evolution.h" - -#include "evolution-shell-component-client.h" - -#include "e-component-registry.h" - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - -typedef struct _Component Component; - -struct _Component { - char *id; - - EvolutionShellComponentClient *client; - - /* Names of the folder types we support (normal ASCII strings). */ - GList *folder_type_names; -}; - -struct _EComponentRegistryPrivate { - EShell *shell; - - GHashTable *component_id_to_component; -}; - - -/* Component information handling. */ - -static Component * -component_new (const char *id, - EvolutionShellComponentClient *client) -{ - Component *new; - - bonobo_object_ref (BONOBO_OBJECT (client)); - - new = g_new (Component, 1); - new->id = g_strdup (id); - new->folder_type_names = NULL; - new->client = client; - - return new; -} - -static void -component_free (Component *component) -{ - Evolution_ShellComponent corba_shell_component; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (component->client)); - Evolution_ShellComponent_unset_owner (corba_shell_component, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("Cannot unregister component -- %s", component->id); - else - g_print ("Component unregistered successfully -- %s\n", component->id); - CORBA_exception_free (&ev); - - g_free (component->id); - - bonobo_object_unref (BONOBO_OBJECT (component->client)); - - e_free_string_list (component->folder_type_names); - - g_free (component); -} - -static gboolean -register_type (EComponentRegistry *component_registry, - const char *name, - const char *icon_name, - Component *handler) -{ - EComponentRegistryPrivate *priv; - EFolderTypeRegistry *folder_type_registry; - - priv = component_registry->priv; - - folder_type_registry = e_shell_get_folder_type_registry (priv->shell); - g_assert (folder_type_registry != NULL); - - if (! e_folder_type_registry_register_type (folder_type_registry, name, icon_name)) { - g_warning ("Trying to register duplicate folder type -- %s", name); - return FALSE; - } - - e_folder_type_registry_set_handler_for_type (folder_type_registry, name, handler->client); - - return TRUE; -} - -static gboolean -register_component (EComponentRegistry *component_registry, - const char *id) -{ - EComponentRegistryPrivate *priv; - Evolution_ShellComponent component_corba_interface; - Evolution_Shell shell_corba_interface; - Evolution_FolderTypeList *supported_types; - Component *component; - EvolutionShellComponentClient *client; - CORBA_Environment ev; - CORBA_unsigned_long i; - const char *local_directory; - - priv = component_registry->priv; - - if (g_hash_table_lookup (priv->component_id_to_component, id) != NULL) { - g_warning ("Trying to register component twice -- %s", id); - return FALSE; - } - - client = evolution_shell_component_client_new (id); - if (client == NULL) - return FALSE; - - CORBA_exception_init (&ev); - - /* FIXME we could use the EvolutionShellComponentClient API here instead, but for - now we don't care. */ - - component_corba_interface = bonobo_object_corba_objref (BONOBO_OBJECT (client)); - shell_corba_interface = bonobo_object_corba_objref (BONOBO_OBJECT (priv->shell)); - local_directory = e_shell_get_local_directory (priv->shell); - - Evolution_ShellComponent_set_owner (component_corba_interface, shell_corba_interface, local_directory, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - bonobo_object_unref (BONOBO_OBJECT (client)); - CORBA_exception_free (&ev); - return FALSE; - } - - supported_types = Evolution_ShellComponent__get_supported_types (component_corba_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION || supported_types->_length == 0) { - bonobo_object_unref (BONOBO_OBJECT (client)); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_exception_free (&ev); - - component = component_new (id, client); - g_hash_table_insert (priv->component_id_to_component, component->id, component); - - for (i = 0; i < supported_types->_length; i++) { - const Evolution_FolderType *type; - - type = supported_types->_buffer + i; - - if (! register_type (component_registry, type->name, type->icon_name, component)) { - g_warning ("Cannot register type `%s' for component %s", - type->name, component->id); - } else { - g_print ("Registered type for component -- (%s) %s\n", - type->name, component->id); - } - } - - CORBA_free (supported_types); - - return TRUE; -} - - -/* GtkObject methods. */ - -static void -component_id_foreach_free (void *key, - void *value, - void *user_data) -{ - Component *component; - - component = (Component *) value; - component_free (component); -} - -static void -destroy (GtkObject *object) -{ - EComponentRegistry *component_registry; - EComponentRegistryPrivate *priv; - - component_registry = E_COMPONENT_REGISTRY (object); - priv = component_registry->priv; - - bonobo_object_unref (BONOBO_OBJECT (priv->shell)); - - g_hash_table_foreach (priv->component_id_to_component, component_id_foreach_free, NULL); - g_hash_table_destroy (priv->component_id_to_component); - - g_free (priv); -} - - -static void -class_init (EComponentRegistryClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - parent_class = gtk_type_class (gtk_object_get_type ()); -} - - -static void -init (EComponentRegistry *component_registry) -{ - EComponentRegistryPrivate *priv; - - priv = g_new (EComponentRegistryPrivate, 1); - priv->shell = NULL; - priv->component_id_to_component = g_hash_table_new (g_str_hash, g_str_equal); - - component_registry->priv = priv; -} - - -void -e_component_registry_construct (EComponentRegistry *component_registry, - EShell *shell) -{ - EComponentRegistryPrivate *priv; - - g_return_if_fail (component_registry != NULL); - g_return_if_fail (E_IS_COMPONENT_REGISTRY (component_registry)); - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - - priv = component_registry->priv; - - bonobo_object_ref (BONOBO_OBJECT (shell)); - priv->shell = shell; -} - -EComponentRegistry * -e_component_registry_new (EShell *shell) -{ - EComponentRegistry *component_registry; - - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - component_registry = gtk_type_new (e_component_registry_get_type ()); - e_component_registry_construct (component_registry, shell); - - return component_registry; -} - - -gboolean -e_component_registry_register_component (EComponentRegistry *component_registry, - const char *id) -{ - g_return_val_if_fail (component_registry != NULL, FALSE); - g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (component_registry), FALSE); - g_return_val_if_fail (id != NULL, FALSE); - - return register_component (component_registry, id); -} - - -static void -compose_id_list_foreach (void *key, - void *value, - void *data) -{ - GList **listp; - const char *id; - - listp = (GList **) data; - id = (const char *) key; - - *listp = g_list_prepend (*listp, g_strdup (id)); -} - -/** - * e_component_registry_get_id_list: - * @component_registry: - * - * Get the list of components registered. - * - * Return value: A GList of strings containining the IDs for all the registered - * components. The list must be freed by the caller when not used anymore. - **/ -GList * -e_component_registry_get_id_list (EComponentRegistry *component_registry) -{ - EComponentRegistryPrivate *priv; - GList *list; - - g_return_val_if_fail (component_registry != NULL, NULL); - g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (component_registry), NULL); - - priv = component_registry->priv; - list = NULL; - - g_hash_table_foreach (priv->component_id_to_component, compose_id_list_foreach, &list); - - return list; -} - -/** - * e_component_registry_get_component_by_id: - * @component_registry: - * @id: The component's OAF ID - * - * Get the registered component client for the specified ID. If that component - * is not registered, return NULL. - * - * Return value: A pointer to the ShellComponentClient for that component. - **/ -EvolutionShellComponentClient * -e_component_registry_get_component_by_id (EComponentRegistry *component_registry, - const char *id) -{ - EComponentRegistryPrivate *priv; - const Component *component; - - g_return_val_if_fail (component_registry != NULL, NULL); - g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (component_registry), NULL); - g_return_val_if_fail (id != NULL, NULL); - - priv = component_registry->priv; - - component = g_hash_table_lookup (priv->component_id_to_component, id); - if (component == NULL) - return NULL; - - return component->client; -} - - -E_MAKE_TYPE (e_component_registry, "EComponentRegistry", EComponentRegistry, - class_init, init, PARENT_TYPE) diff --git a/shell/e-component-registry.h b/shell/e-component-registry.h deleted file mode 100644 index 0a34413844..0000000000 --- a/shell/e-component-registry.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-component-registry.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_COMPONENT_REGISTRY_H__ -#define __E_COMPONENT_REGISTRY_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> - -#include "e-shell.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_COMPONENT_REGISTRY (e_component_registry_get_type ()) -#define E_COMPONENT_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_COMPONENT_REGISTRY, EComponentRegistry)) -#define E_COMPONENT_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_COMPONENT_REGISTRY, EComponentRegistryClass)) -#define E_IS_COMPONENT_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_COMPONENT_REGISTRY)) -#define E_IS_COMPONENT_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_COMPONENT_REGISTRY)) - - -typedef struct _EComponentRegistry EComponentRegistry; -typedef struct _EComponentRegistryPrivate EComponentRegistryPrivate; -typedef struct _EComponentRegistryClass EComponentRegistryClass; - -struct _EComponentRegistry { - GtkObject parent; - - EComponentRegistryPrivate *priv; -}; - -struct _EComponentRegistryClass { - GtkObjectClass parent_class; -}; - - -GtkType e_component_registry_get_type (void); -void e_component_registry_construct (EComponentRegistry *component_registry, - EShell *shell); -EComponentRegistry *e_component_registry_new (EShell *shell); - -gboolean e_component_registry_register_component (EComponentRegistry *component_registry, - const char *id); - -GList *e_component_registry_get_id_list (EComponentRegistry *component_registry); - -EvolutionShellComponentClient *e_component_registry_get_component_by_id (EComponentRegistry *component_registry, - const char *id); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_COMPONENT_REGISTRY_H__ */ diff --git a/shell/e-corba-storage-registry.c b/shell/e-corba-storage-registry.c deleted file mode 100644 index c3b259bb71..0000000000 --- a/shell/e-corba-storage-registry.c +++ /dev/null @@ -1,246 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-storage-registry.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-util/e-util.h" - -#include "e-corba-storage.h" - -#include "e-corba-storage-registry.h" - - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _ECorbaStorageRegistryPrivate { - EStorageSet *storage_set; -}; - - -/* CORBA interface implementation. */ - -static POA_Evolution_StorageRegistry__vepv storage_registry_vepv; - -static POA_Evolution_StorageRegistry * -create_servant (void) -{ - POA_Evolution_StorageRegistry *servant; - CORBA_Environment ev; - - servant = (POA_Evolution_StorageRegistry *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &storage_registry_vepv; - - CORBA_exception_init (&ev); - - POA_Evolution_StorageRegistry__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - return servant; -} - -static Evolution_StorageListener -impl_StorageRegistry_register_storage (PortableServer_Servant servant, - const Evolution_Storage storage_interface, - const CORBA_char *name, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ECorbaStorageRegistry *storage_registry; - ECorbaStorageRegistryPrivate *priv; - EStorage *storage; - Evolution_StorageListener listener_interface; - - g_print ("Shell: Registering storage -- %s\n", name); - - bonobo_object = bonobo_object_from_servant (servant); - storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object); - priv = storage_registry->priv; - - storage = e_corba_storage_new (storage_interface, name); - - if (! e_storage_set_add_storage (priv->storage_set, storage)) { - CORBA_exception_set (ev, - CORBA_USER_EXCEPTION, - ex_Evolution_StorageRegistry_Exists, - NULL); - return CORBA_OBJECT_NIL; - } - - gtk_object_unref (GTK_OBJECT (storage)); - - listener_interface = CORBA_Object_duplicate (e_corba_storage_get_StorageListener - (E_CORBA_STORAGE (storage)), ev); - - return listener_interface; -} - -static void -impl_StorageRegistry_unregister_storage (PortableServer_Servant servant, - const CORBA_char *name, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ECorbaStorageRegistry *storage_registry; - ECorbaStorageRegistryPrivate *priv; - EStorage *storage; - - bonobo_object = bonobo_object_from_servant (servant); - storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object); - priv = storage_registry->priv; - - storage = e_storage_set_get_storage (priv->storage_set, name); - if (storage == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Evolution_StorageRegistry_NotFound, - NULL); - return; - } - - /* FIXME: Yucky to get the storage by name and then remove it. */ - /* FIXME: Check failure. */ - e_storage_set_remove_storage (priv->storage_set, storage); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - ECorbaStorageRegistry *corba_storage_registry; - ECorbaStorageRegistryPrivate *priv; - - corba_storage_registry = E_CORBA_STORAGE_REGISTRY (object); - priv = corba_storage_registry->priv; - - if (priv->storage_set != NULL) - gtk_object_unref (GTK_OBJECT (priv->storage_set)); - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* Initialization. */ - -static void -corba_class_init (void) -{ - POA_Evolution_StorageRegistry__vepv *vepv; - POA_Evolution_StorageRegistry__epv *epv; - PortableServer_ServantBase__epv *base_epv; - - base_epv = g_new0 (PortableServer_ServantBase__epv, 1); - base_epv->_private = NULL; - base_epv->finalize = NULL; - base_epv->default_POA = NULL; - - epv = g_new0 (POA_Evolution_StorageRegistry__epv, 1); - epv->register_storage = impl_StorageRegistry_register_storage; - epv->unregister_storage = impl_StorageRegistry_unregister_storage; - - vepv = &storage_registry_vepv; - vepv->_base_epv = base_epv; - vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); - vepv->Evolution_StorageRegistry_epv = epv; -} - -static void -class_init (ECorbaStorageRegistryClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - parent_class = gtk_type_class (PARENT_TYPE); - - corba_class_init (); -} - -static void -init (ECorbaStorageRegistry *corba_storage_registry) -{ - ECorbaStorageRegistryPrivate *priv; - - priv = g_new (ECorbaStorageRegistryPrivate, 1); - priv->storage_set = NULL; - - corba_storage_registry->priv = priv; -} - - -void -e_corba_storage_registry_construct (ECorbaStorageRegistry *corba_storage_registry, - Evolution_StorageRegistry corba_object, - EStorageSet *storage_set) -{ - ECorbaStorageRegistryPrivate *priv; - - g_return_if_fail (corba_storage_registry != NULL); - g_return_if_fail (E_IS_CORBA_STORAGE_REGISTRY (corba_storage_registry)); - g_return_if_fail (corba_object != CORBA_OBJECT_NIL); - - bonobo_object_construct (BONOBO_OBJECT (corba_storage_registry), corba_object); - - priv = corba_storage_registry->priv; - - gtk_object_ref (GTK_OBJECT (storage_set)); - priv->storage_set = storage_set; -} - -ECorbaStorageRegistry * -e_corba_storage_registry_new (EStorageSet *storage_set) -{ - ECorbaStorageRegistry *corba_storage_registry; - POA_Evolution_StorageRegistry *servant; - Evolution_StorageRegistry corba_object; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - - servant = create_servant (); - if (servant == NULL) - return NULL; - - corba_storage_registry = gtk_type_new (e_corba_storage_registry_get_type ()); - - corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (corba_storage_registry), - servant); - - e_corba_storage_registry_construct (corba_storage_registry, corba_object, storage_set); - - return corba_storage_registry; -} - - -E_MAKE_TYPE (e_corba_storage_registry, "ECorbaStorageRegistry", ECorbaStorageRegistry, class_init, init, PARENT_TYPE) diff --git a/shell/e-corba-storage-registry.h b/shell/e-corba-storage-registry.h deleted file mode 100644 index baf689c551..0000000000 --- a/shell/e-corba-storage-registry.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-storage-registry.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_CORBA_STORAGE_REGISTRY_H__ -#define __E_CORBA_STORAGE_REGISTRY_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-object.h> - -#include "Evolution.h" -#include "e-storage-set.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_CORBA_STORAGE_REGISTRY (e_corba_storage_registry_get_type ()) -#define E_CORBA_STORAGE_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CORBA_STORAGE_REGISTRY, ECorbaStorageRegistry)) -#define E_CORBA_STORAGE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CORBA_STORAGE_REGISTRY, ECorbaStorageRegistryClass)) -#define E_IS_CORBA_STORAGE_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CORBA_STORAGE_REGISTRY)) -#define E_IS_CORBA_STORAGE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_CORBA_STORAGE_REGISTRY)) - - -typedef struct _ECorbaStorageRegistry ECorbaStorageRegistry; -typedef struct _ECorbaStorageRegistryPrivate ECorbaStorageRegistryPrivate; -typedef struct _ECorbaStorageRegistryClass ECorbaStorageRegistryClass; - -struct _ECorbaStorageRegistry { - BonoboObject parent; - - ECorbaStorageRegistryPrivate *priv; -}; - -struct _ECorbaStorageRegistryClass { - BonoboObjectClass parent_class; -}; - - -GtkType e_corba_storage_registry_get_type (void); -void e_corba_storage_registry_construct (ECorbaStorageRegistry *corba_storage_registry, - Evolution_StorageRegistry corba_object, - EStorageSet *storage_set); -ECorbaStorageRegistry *e_corba_storage_registry_new (EStorageSet *storage_set); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_CORBA_STORAGE_REGISTRY_H__ */ diff --git a/shell/e-corba-storage.c b/shell/e-corba-storage.c deleted file mode 100644 index b4320a4c52..0000000000 --- a/shell/e-corba-storage.c +++ /dev/null @@ -1,354 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-storage.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo.h> - -#include "e-util/e-util.h" - -#include "Evolution.h" - -#include "e-corba-storage.h" - - -#define PARENT_TYPE E_TYPE_STORAGE -static EStorageClass *parent_class = NULL; - -typedef struct _StorageListenerServant StorageListenerServant; - -struct _ECorbaStoragePrivate { - char *name; - - Evolution_Storage storage_interface; - - /* The Evolution::StorageListener interface we expose. */ - - Evolution_StorageListener storage_listener_interface; - StorageListenerServant *storage_listener_servant; -}; - - -/* Implementation of the CORBA Evolution::StorageListener interface. */ - -static POA_Evolution_StorageListener__vepv storage_listener_vepv; - -struct _StorageListenerServant { - POA_Evolution_StorageListener servant; - EStorage *storage; -}; - -static StorageListenerServant * -storage_listener_servant_new (ECorbaStorage *corba_storage) -{ - StorageListenerServant *servant; - - servant = g_new0 (StorageListenerServant, 1); - - servant->servant.vepv = &storage_listener_vepv; - - gtk_object_ref (GTK_OBJECT (corba_storage)); - servant->storage = E_STORAGE (corba_storage); - - return servant; -} - -static void -storage_listener_servant_free (StorageListenerServant *servant) -{ - gtk_object_unref (GTK_OBJECT (servant->storage)); - - g_free (servant); -} - -#if 0 -static void -impl_StorageListener_destroy (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - /* FIXME */ -} -#endif - -static void -impl_StorageListener_new_folder (PortableServer_Servant servant, - const CORBA_char *path, - const Evolution_Folder *folder, - CORBA_Environment *ev) -{ - StorageListenerServant *storage_listener_servant; - EStorage *storage; - EFolder *e_folder; - - storage_listener_servant = (StorageListenerServant *) servant; - storage = storage_listener_servant->storage; - - e_folder = e_folder_new (folder->name, - folder->type, - folder->description); - - e_folder_set_physical_uri (e_folder, folder->physical_uri); - - if (! e_storage_new_folder (storage, path, e_folder)) { - g_print ("Cannot register folder -- %s %s\n", path, folder->name); - CORBA_exception_set (ev, - CORBA_USER_EXCEPTION, - ex_Evolution_StorageListener_Exists, - NULL); - gtk_object_unref (GTK_OBJECT (e_folder)); - } - - g_print ("Folder registered successfully -- %s %s\n", path, folder->name); -} - -static void -impl_StorageListener_removed_folder (PortableServer_Servant servant, - const CORBA_char *path, - CORBA_Environment *ev) -{ - StorageListenerServant *storage_listener_servant; - EStorage *storage; - - storage_listener_servant = (StorageListenerServant *) servant; - storage = storage_listener_servant->storage; - - if (! e_storage_removed_folder (storage, path)) - CORBA_exception_set (ev, - CORBA_USER_EXCEPTION, - ex_Evolution_StorageListener_NotFound, - NULL); -} - - -static gboolean -setup_storage_listener (ECorbaStorage *corba_storage) -{ - StorageListenerServant *servant; - ECorbaStoragePrivate *priv; - Evolution_StorageListener storage_listener_interface; - CORBA_Environment ev; - - priv = corba_storage->priv; - - servant = storage_listener_servant_new (corba_storage); - - CORBA_exception_init (&ev); - - POA_Evolution_StorageListener__init (servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - goto error; - - CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), servant, &ev)); - if (ev._major != CORBA_NO_EXCEPTION) - goto error; - - storage_listener_interface = PortableServer_POA_servant_to_reference (bonobo_poa (), - servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - goto error; - - priv->storage_listener_interface = storage_listener_interface; - priv->storage_listener_servant = servant; - - return TRUE; - - error: - storage_listener_servant_free (servant); - CORBA_exception_free (&ev); - return FALSE; -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - CORBA_Environment ev; - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - - corba_storage = E_CORBA_STORAGE (object); - priv = corba_storage->priv; - - g_free (priv->name); - - CORBA_exception_init (&ev); - - if (priv->storage_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->storage_interface, &ev); - CORBA_Object_release (priv->storage_interface, &ev); - } - - if (priv->storage_listener_interface != CORBA_OBJECT_NIL) - CORBA_Object_release (priv->storage_listener_interface, &ev); - - if (priv->storage_listener_servant != NULL) { - PortableServer_ObjectId *object_id; - - object_id = PortableServer_POA_servant_to_id (bonobo_poa (), priv->storage_listener_servant, - &ev); - PortableServer_POA_deactivate_object (bonobo_poa (), object_id, &ev); - - POA_Evolution_StorageListener__fini (priv->storage_listener_servant, &ev); - CORBA_free (object_id); - } - - CORBA_exception_free (&ev); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* EStorage methods. */ - -static const char * -get_name (EStorage *storage) -{ - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - - corba_storage = E_CORBA_STORAGE (storage); - priv = corba_storage->priv; - - return priv->name; -} - - -static void -corba_class_init (void) -{ - POA_Evolution_StorageListener__vepv *vepv; - POA_Evolution_StorageListener__epv *epv; - PortableServer_ServantBase__epv *base_epv; - - base_epv = g_new0 (PortableServer_ServantBase__epv, 1); - base_epv->_private = NULL; - base_epv->finalize = NULL; - base_epv->default_POA = NULL; - - epv = g_new0 (POA_Evolution_StorageListener__epv, 1); - epv->new_folder = impl_StorageListener_new_folder; - epv->removed_folder = impl_StorageListener_removed_folder; - - vepv = &storage_listener_vepv; - vepv->_base_epv = base_epv; - vepv->Evolution_StorageListener_epv = epv; -} - -static void -class_init (ECorbaStorageClass *klass) -{ - GtkObjectClass *object_class; - EStorageClass *storage_class; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - storage_class = E_STORAGE_CLASS (klass); - storage_class->get_name = get_name; - - corba_class_init (); - - parent_class = gtk_type_class (PARENT_TYPE); -} - -static void -init (ECorbaStorage *corba_storage) -{ - ECorbaStoragePrivate *priv; - - priv = g_new (ECorbaStoragePrivate, 1); - priv->name = NULL; - priv->storage_interface = CORBA_OBJECT_NIL; - - corba_storage->priv = priv; -} - - -/* FIXME: OK to have a boolean construct function? */ -void -e_corba_storage_construct (ECorbaStorage *corba_storage, - const Evolution_Storage storage_interface, - const char *name) -{ - ECorbaStoragePrivate *priv; - CORBA_Environment ev; - - g_return_if_fail (corba_storage != NULL); - g_return_if_fail (E_IS_CORBA_STORAGE (corba_storage)); - g_return_if_fail (storage_interface != CORBA_OBJECT_NIL); - g_return_if_fail (name != NULL); - - e_storage_construct (E_STORAGE (corba_storage)); - - priv = corba_storage->priv; - - priv->name = g_strdup (name); - - CORBA_exception_init (&ev); - - Bonobo_Unknown_ref (storage_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("%s -- Cannot reference Bonobo object", __FUNCTION__); - } else { - priv->storage_interface = CORBA_Object_duplicate (storage_interface, &ev); - } - - CORBA_exception_free (&ev); - - setup_storage_listener (corba_storage); -} - -EStorage * -e_corba_storage_new (const Evolution_Storage storage_interface, - const char *name) -{ - EStorage *new; - - g_return_val_if_fail (storage_interface != CORBA_OBJECT_NIL, NULL); - g_return_val_if_fail (name != NULL, NULL); - - new = gtk_type_new (e_corba_storage_get_type ()); - - e_corba_storage_construct (E_CORBA_STORAGE (new), storage_interface, name); - - return new; -} - - -const Evolution_StorageListener -e_corba_storage_get_StorageListener (ECorbaStorage *corba_storage) -{ - g_return_val_if_fail (corba_storage != NULL, NULL); - g_return_val_if_fail (E_IS_CORBA_STORAGE (corba_storage), NULL); - - return corba_storage->priv->storage_listener_interface; -} - - -E_MAKE_TYPE (e_corba_storage, "ECorbaStorage", ECorbaStorage, class_init, init, PARENT_TYPE) diff --git a/shell/e-corba-storage.h b/shell/e-corba-storage.h deleted file mode 100644 index 99ab23e97e..0000000000 --- a/shell/e-corba-storage.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-storage.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_CORBA_STORAGE_H__ -#define __E_CORBA_STORAGE_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-storage.h" - -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_CORBA_STORAGE (e_corba_storage_get_type ()) -#define E_CORBA_STORAGE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CORBA_STORAGE, ECorbaStorage)) -#define E_CORBA_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CORBA_STORAGE, ECorbaStorageClass)) -#define E_IS_CORBA_STORAGE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CORBA_STORAGE)) -#define E_IS_CORBA_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_CORBA_STORAGE)) - - -typedef struct _ECorbaStorage ECorbaStorage; -typedef struct _ECorbaStoragePrivate ECorbaStoragePrivate; -typedef struct _ECorbaStorageClass ECorbaStorageClass; - -struct _ECorbaStorage { - EStorage parent; - - ECorbaStoragePrivate *priv; -}; - -struct _ECorbaStorageClass { - EStorageClass parent_class; -}; - - -GtkType e_corba_storage_get_type (void); -void e_corba_storage_construct (ECorbaStorage *corba_storage, - const Evolution_Storage storage_interface, - const char *name); -EStorage *e_corba_storage_new (const Evolution_Storage storage_interface, - const char *name); - -/* FIXME: I don't like this call. */ -const Evolution_StorageListener e_corba_storage_get_StorageListener (ECorbaStorage *corba_storage); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_CORBA_STORAGE_H__ */ diff --git a/shell/e-folder-type-registry.c b/shell/e-folder-type-registry.c deleted file mode 100644 index 34fa5a0193..0000000000 --- a/shell/e-folder-type-registry.c +++ /dev/null @@ -1,367 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder-type-registry.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <glib.h> -#include <gtk/gtktypeutils.h> - -#include "e-util/e-util.h" - -#include "e-shell-utils.h" - -#include "e-folder-type-registry.h" - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - -struct _FolderType { - char *name; - char *icon_name; - - EvolutionShellComponentClient *handler; - - /* The icon, standard (48x48) and mini (16x16) versions. */ - GdkPixbuf *icon_pixbuf; - GdkPixbuf *mini_icon_pixbuf; -}; -typedef struct _FolderType FolderType; - -struct _EFolderTypeRegistryPrivate { - GHashTable *name_to_type; -}; - - -/* FolderType handling. */ - -static FolderType * -folder_type_new (const char *name, - const char *icon_name) -{ - FolderType *new; - char *icon_path; - - new = g_new (FolderType, 1); - - new->name = g_strdup (name); - new->icon_name = g_strdup (icon_name); - new->handler = NULL; - - icon_path = e_shell_get_icon_path (icon_name, FALSE); - if (icon_path == NULL) - new->icon_pixbuf = NULL; - else - new->icon_pixbuf = gdk_pixbuf_new_from_file (icon_path); - - g_free (icon_path); - - icon_path = e_shell_get_icon_path (icon_name, TRUE); - if (icon_path != NULL) { - new->mini_icon_pixbuf = gdk_pixbuf_new_from_file (icon_path); - } else { - if (new->icon_pixbuf != NULL) - new->mini_icon_pixbuf = gdk_pixbuf_ref (new->icon_pixbuf); - else - new->mini_icon_pixbuf = NULL; - } - - g_free (icon_path); - - return new; -} - -static void -folder_type_free (FolderType *folder_type) -{ - g_free (folder_type->name); - g_free (folder_type->icon_name); - - if (folder_type->icon_pixbuf != NULL) - gdk_pixbuf_unref (folder_type->icon_pixbuf); - if (folder_type->mini_icon_pixbuf != NULL) - gdk_pixbuf_unref (folder_type->mini_icon_pixbuf); - - if (folder_type->handler != NULL) - bonobo_object_unref (BONOBO_OBJECT (folder_type->handler)); - - g_free (folder_type); -} - -static FolderType * -get_folder_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name) -{ - EFolderTypeRegistryPrivate *priv; - - priv = folder_type_registry->priv; - - return g_hash_table_lookup (priv->name_to_type, type_name); -} - -static gboolean -register_folder_type (EFolderTypeRegistry *folder_type_registry, - const char *name, - const char *icon_name) -{ - EFolderTypeRegistryPrivate *priv; - FolderType *folder_type; - - priv = folder_type_registry->priv; - - /* Make sure we don't add the same type twice. */ - if (get_folder_type (folder_type_registry, name) != NULL) - return FALSE; - - folder_type = folder_type_new (name, icon_name); - g_hash_table_insert (priv->name_to_type, folder_type->name, folder_type); - - return TRUE; -} - -static gboolean -set_handler (EFolderTypeRegistry *folder_type_registry, - const char *name, - EvolutionShellComponentClient *handler) -{ - EFolderTypeRegistryPrivate *priv; - FolderType *folder_type; - - priv = folder_type_registry->priv; - - folder_type = get_folder_type (folder_type_registry, name); - if (folder_type == NULL) - return FALSE; - if (folder_type->handler != NULL) { - g_warning ("Folder type already has a handler -- %s", - folder_type->name); - return FALSE; - } - - bonobo_object_ref (BONOBO_OBJECT (handler)); - folder_type->handler = handler; - - return TRUE; -} - - -/* GtkObject methods. */ - -static void -hash_forall_free_folder_type (gpointer key, - gpointer value, - gpointer data) -{ - FolderType *folder_type; - - folder_type = (FolderType *) value; - folder_type_free (folder_type); -} - -static void -destroy (GtkObject *object) -{ - EFolderTypeRegistry *folder_type_registry; - EFolderTypeRegistryPrivate *priv; - - folder_type_registry = E_FOLDER_TYPE_REGISTRY (object); - priv = folder_type_registry->priv; - - g_hash_table_foreach (priv->name_to_type, - hash_forall_free_folder_type, NULL); - g_hash_table_destroy (priv->name_to_type); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (EFolderTypeRegistryClass *class) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (class); - object_class->destroy = destroy; - - parent_class = gtk_type_class (gtk_object_get_type ()); -} - -static void -init (EFolderTypeRegistry *folder_type_registry) -{ - EFolderTypeRegistryPrivate *priv; - - priv = g_new (EFolderTypeRegistryPrivate, 1); - priv->name_to_type = g_hash_table_new (g_str_hash, g_str_equal); - - folder_type_registry->priv = priv; -} - - -void -e_folder_type_registry_construct (EFolderTypeRegistry *folder_type_registry) -{ - g_return_if_fail (folder_type_registry != NULL); - g_return_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry)); - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (folder_type_registry), GTK_FLOATING); -} - -EFolderTypeRegistry * -e_folder_type_registry_new (void) -{ - EFolderTypeRegistry *new; - - new = gtk_type_new (e_folder_type_registry_get_type ()); - - e_folder_type_registry_construct (new); - - return new; -} - - -gboolean -e_folder_type_registry_register_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name, - const char *icon_name) -{ - g_return_val_if_fail (folder_type_registry != NULL, FALSE); - g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE); - g_return_val_if_fail (type_name != NULL, FALSE); - g_return_val_if_fail (icon_name != NULL, FALSE); - - return register_folder_type (folder_type_registry, type_name, icon_name); -} - -gboolean -e_folder_type_registry_set_handler_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name, - EvolutionShellComponentClient *handler) -{ - g_return_val_if_fail (folder_type_registry != NULL, FALSE); - g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE); - g_return_val_if_fail (handler != NULL, FALSE); - g_return_val_if_fail (BONOBO_IS_OBJECT_CLIENT (handler), FALSE); - - return set_handler (folder_type_registry, type_name, handler); -} - - -static void -get_type_names_hash_forall (void *key, - void *value, - void *data) -{ - GList **type_name_list; - - type_name_list = (GList **) data; - - *type_name_list = g_list_prepend (*type_name_list, g_strdup ((const char *) key)); -} - -GList * -e_folder_type_registry_get_type_names (EFolderTypeRegistry *folder_type_registry) -{ - GList *type_name_list; - EFolderTypeRegistryPrivate *priv; - - g_return_val_if_fail (folder_type_registry != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL); - - priv = folder_type_registry->priv; - - type_name_list = NULL; - g_hash_table_foreach (priv->name_to_type, get_type_names_hash_forall, &type_name_list); - - return type_name_list; -} - - -const char * -e_folder_type_registry_get_icon_name_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name) -{ - const FolderType *folder_type; - - g_return_val_if_fail (folder_type_registry != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL); - g_return_val_if_fail (type_name != NULL, NULL); - - folder_type = get_folder_type (folder_type_registry, type_name); - if (folder_type == NULL) { - g_warning ("%s: Unknown type -- %s", __FUNCTION__, type_name); - return NULL; - } - - return folder_type->icon_name; -} - -GdkPixbuf * -e_folder_type_registry_get_icon_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name, - gboolean mini) -{ - const FolderType *folder_type; - - g_return_val_if_fail (folder_type_registry != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL); - g_return_val_if_fail (type_name != NULL, NULL); - - folder_type = get_folder_type (folder_type_registry, type_name); - if (folder_type == NULL) { - g_warning ("%s: Unknown type -- %s", __FUNCTION__, type_name); - return NULL; - } - - if (mini) - return folder_type->mini_icon_pixbuf; - else - return folder_type->icon_pixbuf; -} - -EvolutionShellComponentClient * -e_folder_type_registry_get_handler_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name) -{ - const FolderType *folder_type; - - g_return_val_if_fail (folder_type_registry != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL); - g_return_val_if_fail (type_name != NULL, NULL); - - folder_type = get_folder_type (folder_type_registry, type_name); - if (folder_type == NULL) { - g_warning ("%s: Unknown type -- %s", __FUNCTION__, type_name); - return NULL; - } - - return folder_type->handler; -} - - -E_MAKE_TYPE (e_folder_type_registry, "EFolderTypeRegistry", EFolderTypeRegistry, - class_init, init, PARENT_TYPE) diff --git a/shell/e-folder-type-registry.h b/shell/e-folder-type-registry.h deleted file mode 100644 index 6d832282aa..0000000000 --- a/shell/e-folder-type-registry.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder-type-registry.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_FOLDER_TYPE_REGISTRY_H_ -#define _E_FOLDER_TYPE_REGISTRY_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include "evolution-shell-component-client.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_FOLDER_TYPE_REGISTRY (e_folder_type_registry_get_type ()) -#define E_FOLDER_TYPE_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_FOLDER_TYPE_REGISTRY, EFolderTypeRegistry)) -#define E_FOLDER_TYPE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_FOLDER_TYPE_REGISTRY, EFolderTypeRegistryClass)) -#define E_IS_FOLDER_TYPE_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_FOLDER_TYPE_REGISTRY)) -#define E_IS_FOLDER_TYPE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_FOLDER_TYPE_REGISTRY)) - - -typedef struct _EFolderTypeRegistry EFolderTypeRegistry; -typedef struct _EFolderTypeRegistryPrivate EFolderTypeRegistryPrivate; -typedef struct _EFolderTypeRegistryClass EFolderTypeRegistryClass; - -struct _EFolderTypeRegistry { - GtkObject parent; - - EFolderTypeRegistryPrivate *priv; -}; - -struct _EFolderTypeRegistryClass { - GtkObjectClass parent_class; -}; - - -GtkType e_folder_type_registry_get_type (void); -void e_folder_type_registry_construct (EFolderTypeRegistry *folder_type_registry); -EFolderTypeRegistry *e_folder_type_registry_new (void); - -gboolean e_folder_type_registry_register_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name, - const char *icon_name); -gboolean e_folder_type_registry_set_handler_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name, - EvolutionShellComponentClient *handler); - -GList *e_folder_type_registry_get_type_names (EFolderTypeRegistry *folder_type_registry); - -GdkPixbuf *e_folder_type_registry_get_icon_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name, - gboolean mini); -const char *e_folder_type_registry_get_icon_name_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name); -EvolutionShellComponentClient *e_folder_type_registry_get_handler_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_FOLDER_TYPE_REGISTRY_H_ */ diff --git a/shell/e-folder.c b/shell/e-folder.c deleted file mode 100644 index 90bd886352..0000000000 --- a/shell/e-folder.c +++ /dev/null @@ -1,289 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> - -#include "e-util/e-util.h" - -#include "e-folder.h" - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - -struct _EFolderPrivate { - char *name; - char *type; - char *description; - char *physical_uri; -}; - -#define EF_CLASS(obj) \ - E_FOLDER_CLASS (GTK_OBJECT (obj)->klass) - - -enum { - CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* EFolder methods. */ - -static gboolean -save_info (EFolder *folder) -{ - g_warning ("`%s' does not implement `EFolder::save_info()'", - gtk_type_name (GTK_OBJECT_TYPE (folder))); - return FALSE; -} - -static gboolean -load_info (EFolder *folder) -{ - g_warning ("`%s' does not implement `EFolder::load_info()'", - gtk_type_name (GTK_OBJECT_TYPE (folder))); - return FALSE; -} - -static gboolean -remove (EFolder *folder) -{ - g_warning ("`%s' does not implement `EFolder::remove()'", - gtk_type_name (GTK_OBJECT_TYPE (folder))); - return FALSE; -} - -static const char * -get_physical_uri (EFolder *folder) -{ - return folder->priv->physical_uri; -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EFolder *folder; - EFolderPrivate *priv; - - folder = E_FOLDER (object); - priv = folder->priv; - - g_free (priv->name); - g_free (priv->type); - g_free (priv->description); - g_free (priv->physical_uri); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (EFolderClass *klass) -{ - GtkObjectClass *object_class; - - parent_class = gtk_type_class (gtk_object_get_type ()); - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - signals[CHANGED] = gtk_signal_new ("changed", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EFolderClass, changed), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); - - klass->save_info = save_info; - klass->load_info = load_info; - klass->remove = remove; - klass->get_physical_uri = get_physical_uri; -} - -static void -init (EFolder *folder) -{ - EFolderPrivate *priv; - - priv = g_new (EFolderPrivate, 1); - priv->type = NULL; - priv->name = NULL; - priv->description = NULL; - priv->physical_uri = NULL; - - folder->priv = priv; -} - - -void -e_folder_construct (EFolder *folder, - const char *name, - const char *type, - const char *description) -{ - EFolderPrivate *priv; - - g_return_if_fail (folder != NULL); - g_return_if_fail (E_IS_FOLDER (folder)); - g_return_if_fail (name != NULL); - g_return_if_fail (type != NULL); - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (folder), GTK_FLOATING); - - priv = folder->priv; - - priv->name = g_strdup (name); - priv->type = g_strdup (type); - priv->description = g_strdup (description); -} - -EFolder * -e_folder_new (const char *name, - const char *type, - const char *description) -{ - EFolder *folder; - - g_return_val_if_fail (name != NULL, NULL); - g_return_val_if_fail (type != NULL, NULL); - g_return_val_if_fail (description != NULL, NULL); - - folder = gtk_type_new (E_TYPE_FOLDER); - - e_folder_construct (folder, name, type, description); - - return folder; -} - - -const char * -e_folder_get_name (EFolder *folder) -{ - g_return_val_if_fail (folder != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER (folder), NULL); - - return folder->priv->name; -} - -const char * -e_folder_get_type_string (EFolder *folder) -{ - g_return_val_if_fail (folder != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER (folder), NULL); - - return folder->priv->type; -} - -const char * -e_folder_get_description (EFolder *folder) -{ - g_return_val_if_fail (folder != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER (folder), NULL); - - return folder->priv->description; -} - - -void -e_folder_set_name (EFolder *folder, - const char *name) -{ - g_return_if_fail (folder != NULL); - g_return_if_fail (E_IS_FOLDER (folder)); - g_return_if_fail (name != NULL); - - g_free (folder->priv->name); - folder->priv->name = g_strdup (name); - - gtk_signal_emit (GTK_OBJECT (folder), signals[CHANGED]); -} - -void -e_folder_set_type_string (EFolder *folder, - const char *type) -{ - g_return_if_fail (folder != NULL); - g_return_if_fail (E_IS_FOLDER (folder)); - g_return_if_fail (type != NULL); - - g_free (folder->priv->type); - folder->priv->type = g_strdup (type); - - gtk_signal_emit (GTK_OBJECT (folder), signals[CHANGED]); -} - -void -e_folder_set_description (EFolder *folder, - const char *description) -{ - g_return_if_fail (folder != NULL); - g_return_if_fail (E_IS_FOLDER (folder)); - g_return_if_fail (description != NULL); - - g_free (folder->priv->description); - folder->priv->description = g_strdup (description); - - gtk_signal_emit (GTK_OBJECT (folder), signals[CHANGED]); -} - -void -e_folder_set_physical_uri (EFolder *folder, - const char *physical_uri) -{ - g_return_if_fail (folder != NULL); - g_return_if_fail (E_IS_FOLDER (folder)); - g_return_if_fail (physical_uri != NULL); - - g_free (folder->priv->physical_uri); - folder->priv->physical_uri = g_strdup (physical_uri); - - gtk_signal_emit (GTK_OBJECT (folder), signals[CHANGED]); -} - - -const char * -e_folder_get_physical_uri (EFolder *folder) -{ - g_return_val_if_fail (folder != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER (folder), NULL); - - return folder->priv->physical_uri; -} - - -E_MAKE_TYPE (e_folder, "EFolder", EFolder, class_init, init, PARENT_TYPE) diff --git a/shell/e-folder.h b/shell/e-folder.h deleted file mode 100644 index d7bbd6ba9e..0000000000 --- a/shell/e-folder.h +++ /dev/null @@ -1,93 +0,0 @@ - /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_FOLDER_H_ -#define _E_FOLDER_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_FOLDER (e_folder_get_type ()) -#define E_FOLDER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_FOLDER, EFolder)) -#define E_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_FOLDER, EFolderClass)) -#define E_IS_FOLDER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_FOLDER)) -#define E_IS_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_FOLDER)) - - -typedef struct _EFolder EFolder; -typedef struct _EFolderPrivate EFolderPrivate; -typedef struct _EFolderClass EFolderClass; - -struct _EFolder { - GtkObject parent; - - EFolderPrivate *priv; -}; - -struct _EFolderClass { - GtkObjectClass parent_class; - - /* Virtual methods. */ - gboolean (* save_info) (EFolder *folder); - gboolean (* load_info) (EFolder *folder); - gboolean (* remove) (EFolder *folder); - const char * (* get_physical_uri) (EFolder *folder); - - /* Signals. */ - void (* changed) (EFolder *folder); -}; - - -GtkType e_folder_get_type (void); -void e_folder_construct (EFolder *folder, - const char *name, - const char *type, - const char *description); -EFolder *e_folder_new (const char *name, - const char *type, - const char *description); - -const char *e_folder_get_physical_uri (EFolder *folder); - -const char *e_folder_get_name (EFolder *folder); -const char *e_folder_get_type_string (EFolder *folder); -const char *e_folder_get_description (EFolder *folder); - -void e_folder_set_name (EFolder *folder, const char *name); -void e_folder_set_type_string (EFolder *folder, const char *type); -void e_folder_set_description (EFolder *folder, const char *description); -void e_folder_set_physical_uri (EFolder *folder, const char *physical_uri); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_FOLDER_H_ */ diff --git a/shell/e-local-folder.c b/shell/e-local-folder.c deleted file mode 100644 index 80cee7d7bc..0000000000 --- a/shell/e-local-folder.c +++ /dev/null @@ -1,261 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-local-folder.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -/* The metafile goes like this: - - <?xml version="1.0"?> - <efolder> - <type>mail</type> - <description>This is the folder where I store mail from my gf</description> - <homepage>http://www.somewhere.net</homepage> - </efolder> - - FIXME: Do we want to use a namespace for this? - FIXME: Do we want to have an internationalized description? - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome-xml/parser.h> -#include <gnome-xml/xmlmemory.h> - -#include "e-util/e-util.h" -#include "e-util/e-xml-utils.h" - -#include "e-local-folder.h" - - -#define PARENT_TYPE E_TYPE_FOLDER -static EFolderClass *parent_class = NULL; - -#define URI_PREFIX "file://" -#define URI_PREFIX_LEN 7 - -#define METADATA_FILE_NAME "folder-metadata.xml" -#define METADATA_FILE_NAME_LEN 19 - -struct _ELocalFolderPrivate { - int dummy; -}; - - -static char * -get_string_value (xmlNode *node, - const char *name) -{ - xmlNode *p; - xmlChar *xml_string; - char *retval; - - p = e_xml_get_child_by_name (node, (xmlChar *) name); - if (p == NULL) - return NULL; - - p = e_xml_get_child_by_name (p, (xmlChar *) "text"); - if (p == NULL) - return NULL; - - xml_string = xmlNodeListGetString (node->doc, p, 1); - retval = g_strdup ((char *) xml_string); - xmlFree (xml_string); - - return retval; -} - -static gboolean -construct_loading_metadata (ELocalFolder *local_folder, - const char *path) -{ - EFolder *folder; - xmlDoc *doc; - xmlNode *root; - char *type; - char *description; - char *metadata_path; - char *physical_uri; - - folder = E_FOLDER (local_folder); - - metadata_path = g_concat_dir_and_file (path, METADATA_FILE_NAME); - - doc = xmlParseFile (metadata_path); - if (doc == NULL) { - g_free (metadata_path); - return FALSE; - } - - root = xmlDocGetRootElement (doc); - if (root == NULL || strcmp (root->name, "efolder") != 0) { - g_free (metadata_path); - xmlFreeDoc (doc); - return FALSE; - } - - type = get_string_value (root, "type"); - description = get_string_value (root, "description"); - - e_folder_construct (folder, g_basename (path), type, description); - - g_free (type); - g_free (description); - - xmlFreeDoc (doc); - - physical_uri = g_strconcat (URI_PREFIX, path, NULL); - e_folder_set_physical_uri (folder, physical_uri); - g_free (physical_uri); - - g_free (metadata_path); - - return TRUE; -} - -static gboolean -save_metadata (ELocalFolder *local_folder) -{ - EFolder *folder; - xmlDoc *doc; - xmlNode *root; - const char *physical_directory; - char *physical_path; - - folder = E_FOLDER (local_folder); - - doc = xmlNewDoc ((xmlChar *) "1.0"); - root = xmlNewDocNode (doc, NULL, (xmlChar *) "efolder", NULL); - xmlDocSetRootElement (doc, root); - - xmlNewChild (root, NULL, (xmlChar *) "type", - (xmlChar *) e_folder_get_type_string (folder)); - - if (e_folder_get_description (folder) != NULL) - xmlNewChild (root, NULL, (xmlChar *) "description", - (xmlChar *) e_folder_get_description (folder)); - - physical_directory = e_folder_get_physical_uri (folder) + URI_PREFIX_LEN - 1; - physical_path = g_concat_dir_and_file (physical_directory, METADATA_FILE_NAME); - - if (xmlSaveFile (physical_path, doc) < 0) { - unlink (physical_path); - g_free (physical_path); - xmlFreeDoc (doc); - return FALSE; - } - - g_free (physical_path); - - xmlFreeDoc (doc); - return TRUE; -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - /* No ELocalFolder-specific data to free. */ - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (ELocalFolderClass *klass) -{ - GtkObjectClass *object_class; - - parent_class = gtk_type_class (e_folder_get_type ()); - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; -} - -static void -init (ELocalFolder *local_folder) -{ -} - - -void -e_local_folder_construct (ELocalFolder *local_folder, - const char *name, - const char *type, - const char *description) -{ - g_return_if_fail (local_folder != NULL); - g_return_if_fail (E_IS_LOCAL_FOLDER (local_folder)); - g_return_if_fail (name != NULL); - g_return_if_fail (type != NULL); - - e_folder_construct (E_FOLDER (local_folder), name, type, description); -} - -EFolder * -e_local_folder_new (const char *name, - const char *type, - const char *description) -{ - ELocalFolder *local_folder; - - g_return_val_if_fail (name != NULL, NULL); - g_return_val_if_fail (type != NULL, NULL); - - local_folder = gtk_type_new (e_local_folder_get_type ()); - - e_local_folder_construct (local_folder, name, type, description); - - return E_FOLDER (local_folder); -} - -EFolder * -e_local_folder_new_from_path (const char *path) -{ - EFolder *folder; - - g_return_val_if_fail (g_path_is_absolute (path), NULL); - - folder = gtk_type_new (e_local_folder_get_type ()); - - if (! construct_loading_metadata (E_LOCAL_FOLDER (folder), path)) { - gtk_object_unref (GTK_OBJECT (folder)); - return NULL; - } - - return folder; -} - -gboolean -e_local_folder_save (ELocalFolder *local_folder) -{ - g_return_val_if_fail (local_folder != NULL, FALSE); - g_return_val_if_fail (E_IS_LOCAL_FOLDER (local_folder), FALSE); - g_return_val_if_fail (e_folder_get_physical_uri (E_FOLDER (local_folder)) != NULL, FALSE); - - return save_metadata (local_folder); -} - - -E_MAKE_TYPE (e_local_folder, "ELocalFolder", ELocalFolder, class_init, init, PARENT_TYPE) diff --git a/shell/e-local-folder.h b/shell/e-local-folder.h deleted file mode 100644 index aa9e79a990..0000000000 --- a/shell/e-local-folder.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-local-folder.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_LOCAL_FOLDER_H_ -#define _E_LOCAL_FOLDER_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> - -#include "e-folder.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_LOCAL_FOLDER (e_local_folder_get_type ()) -#define E_LOCAL_FOLDER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_LOCAL_FOLDER, ELocalFolder)) -#define E_LOCAL_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_LOCAL_FOLDER, ELocalFolderClass)) -#define E_IS_LOCAL_FOLDER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_LOCAL_FOLDER)) -#define E_IS_LOCAL_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_LOCAL_FOLDER)) - -typedef struct _ELocalFolder ELocalFolder; -typedef struct _ELocalFolderClass ELocalFolderClass; - -struct _ELocalFolder { - EFolder parent; -}; - -struct _ELocalFolderClass { - EFolderClass parent_class; -}; - - -GtkType e_local_folder_get_type (void); -void e_local_folder_construct (ELocalFolder *local_folder, - const char *name, - const char *type, - const char *description); -EFolder *e_local_folder_new (const char *name, - const char *type, - const char *description); -EFolder *e_local_folder_new_from_path (const char *physical_path); -gboolean e_local_folder_save (ELocalFolder *local_folder); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_LOCAL_FOLDER_H__ */ diff --git a/shell/e-local-storage.c b/shell/e-local-storage.c deleted file mode 100644 index 93234b4741..0000000000 --- a/shell/e-local-storage.c +++ /dev/null @@ -1,589 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-local-storage.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -/* FIXMEs: - * - * - If we have `.' or `..' as path elements, we lose. - * - * - If the LocalStorage is destroyed and an async operation on a shell component is - * pending, we get a callback on a bogus object. We need support for cancelling - * operations on the shell component. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <dirent.h> - -#include <errno.h> -#include <string.h> -#include <sys/param.h> -#include <sys/types.h> -#include <sys/stat.h> - -#include <gnome.h> - -#include "e-util/e-util.h" -#include "e-local-folder.h" - -#include "e-local-storage.h" - - -#define PARENT_TYPE E_TYPE_STORAGE -static EStorageClass *parent_class = NULL; - -#define SUBFOLDER_DIR_NAME "subfolders" -#define SUBFOLDER_DIR_NAME_LEN 10 - -struct _ELocalStoragePrivate { - EFolderTypeRegistry *folder_type_registry; - char *base_path; -}; - - -/* Utility functions. */ - -/* Translate a storage path into a physical path on the file system. */ -static char * -get_physical_path (ELocalStorage *local_storage, - const char *path) -{ - EStorage *storage; - ELocalStoragePrivate *priv; - const char *p, *newp; - char *dp; - char *real_path; - int real_path_len; - int base_path_len; - - storage = E_STORAGE (local_storage); - priv = local_storage->priv; - - /* @path is always absolute, so it starts with a slash. The base class should - make sure this is the case; if not, it's broken. */ - g_assert (*path == G_DIR_SEPARATOR); - path++; - - /* Calculate the length of the real path. */ - - real_path_len = strlen (path); - real_path_len++; /* For the ending zero. */ - - base_path_len = strlen (priv->base_path); - real_path_len += base_path_len; - real_path_len++; /* For the separating slash. */ - - /* Take account for the fact that we need to translate every separator into - `subfolders/'. */ - p = path; - while (1) { - newp = strchr (p, G_DIR_SEPARATOR); - if (newp == NULL) - break; - - real_path_len += SUBFOLDER_DIR_NAME_LEN; - real_path_len++; /* For the separating slash. */ - - /* Skip consecutive slashes. */ - while (*newp == G_DIR_SEPARATOR) - newp++; - - p = newp; - }; - - real_path = g_malloc (real_path_len); - dp = real_path; - - memcpy (dp, priv->base_path, base_path_len); - dp += base_path_len; - *(dp++) = G_DIR_SEPARATOR; - - /* Copy the mangled path. */ - p = path; - while (1) { - newp = strchr (p, G_DIR_SEPARATOR); - if (newp == NULL) { - strcpy (dp, p); - break; - } - - memcpy (dp, p, newp - p + 1); /* `+ 1' to copy the slash too. */ - dp += newp - p + 1; - - memcpy (dp, SUBFOLDER_DIR_NAME, SUBFOLDER_DIR_NAME_LEN); - dp += SUBFOLDER_DIR_NAME_LEN; - - *(dp++) = G_DIR_SEPARATOR; - - /* Skip consecutive slashes. */ - while (*newp == G_DIR_SEPARATOR) - newp++; - - p = newp; - } - - return real_path; -} - -static gboolean -load_folders (ELocalStorage *local_storage, - const char *parent_path, - const char *path, - const char *physical_path) -{ - DIR *dir; - char *subfolder_directory_path; - - if (parent_path == NULL) { - /* On the top level, we don't have any folders and, consequently, no - subfolder directory. */ - - subfolder_directory_path = g_strdup (physical_path); - } else { - EFolder *folder; - - /* Otherwise, we have to load the corresponding folder. */ - - folder = e_local_folder_new_from_path (physical_path); - if (folder == NULL) - return FALSE; - - e_storage_new_folder (E_STORAGE (local_storage), parent_path, folder); - - subfolder_directory_path = g_concat_dir_and_file (physical_path, SUBFOLDER_DIR_NAME); - } - - /* Now scan the subfolders and load them. The subfolders are represented by - directories under the "SUBFOLDER_DIR_NAME" directory. */ - - dir = opendir (subfolder_directory_path); - - if (dir == NULL) { - g_free (subfolder_directory_path); - return FALSE; - } - - while (1) { - struct stat file_stat; - struct dirent *dirent; - char *file_path; - char *new_path; - - dirent = readdir (dir); - if (dirent == NULL) - break; - - if (strcmp (dirent->d_name, ".") == 0 || strcmp (dirent->d_name, "..") == 0) - continue; - - file_path = g_concat_dir_and_file (subfolder_directory_path, - dirent->d_name); - - if (stat (file_path, &file_stat) < 0) { - g_free (file_path); - continue; - } - if (! S_ISDIR (file_stat.st_mode)) { - g_free (file_path); - continue; - } - - new_path = g_concat_dir_and_file (path, dirent->d_name); - - load_folders (local_storage, path, new_path, file_path); - - g_free (file_path); - g_free (new_path); - } - - closedir (dir); - g_free (subfolder_directory_path); - - return TRUE; -} - -static gboolean -load_all_folders (ELocalStorage *local_storage) -{ - const char *base_path; - - base_path = e_local_storage_get_base_path (local_storage); - - return load_folders (local_storage, NULL, G_DIR_SEPARATOR_S, base_path); -} - -static EStorageResult -errno_to_storage_result (void) -{ - EStorageResult storage_result; - - switch (errno) { - case EACCES: - case EROFS: - storage_result = E_STORAGE_PERMISSIONDENIED; - break; - case EEXIST: - storage_result = E_STORAGE_EXISTS; - break; - case ENOSPC: - storage_result = E_STORAGE_NOSPACE; - break; - default: - storage_result = E_STORAGE_GENERICERROR; - } - - return storage_result; -} - -static EStorageResult -shell_component_result_to_storage_result (EvolutionShellComponentResult result) -{ - /* FIXME: Maybe we need better mapping here. */ - switch (result) { - case EVOLUTION_SHELL_COMPONENT_OK: - return E_STORAGE_OK; - case EVOLUTION_SHELL_COMPONENT_NOTFOUND: - return E_STORAGE_NOTFOUND; - case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE: - return E_STORAGE_UNSUPPORTEDTYPE; - case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDOPERATION: - return E_STORAGE_UNSUPPORTEDOPERATION; - case EVOLUTION_SHELL_COMPONENT_EXISTS: - return E_STORAGE_EXISTS; - case EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED: - return E_STORAGE_PERMISSIONDENIED; - case EVOLUTION_SHELL_COMPONENT_ALREADYOWNED: - case EVOLUTION_SHELL_COMPONENT_BUSY: - case EVOLUTION_SHELL_COMPONENT_CORBAERROR: - case EVOLUTION_SHELL_COMPONENT_HASSUBFOLDERS: - case EVOLUTION_SHELL_COMPONENT_INTERNALERROR: - case EVOLUTION_SHELL_COMPONENT_INTERRUPTED: - case EVOLUTION_SHELL_COMPONENT_INVALIDARG: - case EVOLUTION_SHELL_COMPONENT_INVALIDURI: - case EVOLUTION_SHELL_COMPONENT_NOSPACE: - case EVOLUTION_SHELL_COMPONENT_NOTOWNED: - case EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR: - default: - return E_STORAGE_GENERICERROR; - } -} - - -/* Callbacks for the async methods invoked on the `Evolution::ShellComponent's. */ - -struct _AsyncCreateFolderCallbackData { - EStorage *storage; - - char *parent_path; - char *name; - char *type; - char *description; - char *physical_uri; - char *physical_path; - - EStorageResultCallback callback; - void *callback_data; -}; -typedef struct _AsyncCreateFolderCallbackData AsyncCreateFolderCallbackData; - -static void -component_async_create_folder_callback (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentResult result, - void *data) -{ - AsyncCreateFolderCallbackData *callback_data; - - callback_data = (AsyncCreateFolderCallbackData *) data; - - if (result != EVOLUTION_SHELL_COMPONENT_OK) { - /* XXX: This assumes the component won't leave any files in the directory. */ - rmdir (callback_data->physical_path); - } else { - EFolder *folder; - - folder = e_local_folder_new (callback_data->name, - callback_data->type, - callback_data->description); - - e_folder_set_physical_uri (folder, callback_data->physical_uri); - - if (e_local_folder_save (E_LOCAL_FOLDER (folder))) { - e_storage_new_folder (callback_data->storage, - callback_data->parent_path, - folder); - } else { - rmdir (callback_data->physical_path); - gtk_object_unref (GTK_OBJECT (folder)); - result = E_STORAGE_IOERROR; - } - } - - bonobo_object_unref (BONOBO_OBJECT (shell_component_client)); - - (* callback_data->callback) (callback_data->storage, - shell_component_result_to_storage_result (result), - callback_data->callback_data); - - g_free (callback_data->parent_path); - g_free (callback_data->name); - g_free (callback_data->type); - g_free (callback_data->description); - g_free (callback_data->physical_uri); - g_free (callback_data->physical_path); - g_free (callback_data); -} - - -/* GtkObject methods. */ - -static void -impl_destroy (GtkObject *object) -{ - ELocalStorage *local_storage; - ELocalStoragePrivate *priv; - - local_storage = E_LOCAL_STORAGE (object); - priv = local_storage->priv; - - g_free (priv->base_path); - - if (priv->folder_type_registry != NULL) - gtk_object_unref (GTK_OBJECT (priv->folder_type_registry)); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* EStorage methods. */ - -static const char * -impl_get_name (EStorage *storage) -{ - /* FIXME this sucks. */ - return "local"; -} - -static void -impl_async_create_folder (EStorage *storage, - const char *path, - const char *type, - const char *description, - EStorageResultCallback callback, - void *data) -{ - ELocalStorage *local_storage; - ELocalStoragePrivate *priv; - EvolutionShellComponentClient *component_client; - const char *folder_name; - AsyncCreateFolderCallbackData *callback_data; - char *physical_path; - char *physical_uri; - char *parent_path; - - local_storage = E_LOCAL_STORAGE (storage); - priv = local_storage->priv; - - component_client = e_folder_type_registry_get_handler_for_type (priv->folder_type_registry, - type); - if (component_client == NULL) { - (* callback) (storage, E_STORAGE_INVALIDTYPE, data); - return; - } - - g_assert (g_path_is_absolute (path)); - - folder_name = g_basename (path); - if (folder_name == path + 1) { - /* We want a direct child of the root, so we don't need to create a - `subfolders' directory. */ - physical_path = get_physical_path (local_storage, path); - parent_path = g_strdup (G_DIR_SEPARATOR_S); - } else { - char *parent_physical_path; - char *subfolders_directory_physical_path; - - /* Create the `subfolders' subdirectory under the parent. */ - - parent_path = g_strndup (path, folder_name - path - 1); - parent_physical_path = get_physical_path (local_storage, parent_path); - subfolders_directory_physical_path = g_concat_dir_and_file (parent_physical_path, - SUBFOLDER_DIR_NAME); - - if (! g_file_exists (subfolders_directory_physical_path) - && mkdir (subfolders_directory_physical_path, 0700) == -1) { - g_free (parent_path); - g_free (subfolders_directory_physical_path); - g_free (parent_physical_path); - - (* callback) (storage, errno_to_storage_result (), data); - return; - } - - physical_path = g_concat_dir_and_file (subfolders_directory_physical_path, - folder_name); - g_free (subfolders_directory_physical_path); - g_free (parent_physical_path); - } - - /* Create the directory that holds the folder. */ - - if (mkdir (physical_path, 0700) == -1) { - g_free (physical_path); - (* callback) (storage, errno_to_storage_result (), data); - return; - } - - /* Finally tell the component to do the job of creating the physical files in - it. */ - /* FIXME: We should put the operations on a queue so that we can cancel them when - the ELocalStorage is destroyed. */ - - physical_uri = g_strconcat ("file://", physical_path, NULL); - - callback_data = g_new (AsyncCreateFolderCallbackData, 1); - callback_data->storage = storage; - callback_data->parent_path = parent_path; - callback_data->name = g_strdup (folder_name); - callback_data->type = g_strdup (type); - callback_data->description = g_strdup (description); - callback_data->physical_uri = physical_uri; - callback_data->physical_path = physical_path; - callback_data->callback = callback; - callback_data->callback_data = data; - - bonobo_object_ref (BONOBO_OBJECT (component_client)); - - evolution_shell_component_client_async_create_folder (component_client, - physical_path, - type, - component_async_create_folder_callback, - callback_data); -} - -static void -impl_async_remove_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data) -{ - ELocalStorage *local_storage; - - local_storage = E_LOCAL_STORAGE (storage); -} - - -/* Initialization. */ - -static void -class_init (ELocalStorageClass *class) -{ - EStorageClass *storage_class; - GtkObjectClass *object_class; - - parent_class = gtk_type_class (e_storage_get_type ()); - object_class = GTK_OBJECT_CLASS (class); - storage_class = E_STORAGE_CLASS (class); - - object_class->destroy = impl_destroy; - - storage_class->get_name = impl_get_name; - storage_class->async_create_folder = impl_async_create_folder; - storage_class->async_remove_folder = impl_async_remove_folder; -} - -static void -init (ELocalStorage *local_storage) -{ - ELocalStoragePrivate *priv; - - priv = g_new (ELocalStoragePrivate, 1); - - priv->base_path = NULL; - priv->folder_type_registry = NULL; - - local_storage->priv = priv; -} - - -static gboolean -construct (ELocalStorage *local_storage, - EFolderTypeRegistry *folder_type_registry, - const char *base_path) -{ - ELocalStoragePrivate *priv; - int base_path_len; - - e_storage_construct (E_STORAGE (local_storage)); - - priv = local_storage->priv; - - base_path_len = strlen (base_path); - while (base_path_len > 0 && base_path[base_path_len - 1] == G_DIR_SEPARATOR) - base_path_len--; - - g_return_val_if_fail (base_path_len != 0, FALSE); - - g_assert (priv->folder_type_registry == NULL); - gtk_object_ref (GTK_OBJECT (folder_type_registry)); - priv->folder_type_registry = folder_type_registry; - - g_assert (priv->base_path == NULL); - priv->base_path = g_strndup (base_path, base_path_len); - - return load_all_folders (local_storage); -} - -EStorage * -e_local_storage_open (EFolderTypeRegistry *folder_type_registry, - const char *base_path) -{ - EStorage *new; - - g_return_val_if_fail (folder_type_registry != NULL, NULL); - g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL); - g_return_val_if_fail (base_path != NULL, NULL); - - new = gtk_type_new (e_local_storage_get_type ()); - - if (! construct (E_LOCAL_STORAGE (new), folder_type_registry, base_path)) { - gtk_object_unref (GTK_OBJECT (new)); - return NULL; - } - - return new; -} - -const char * -e_local_storage_get_base_path (ELocalStorage *local_storage) -{ - g_return_val_if_fail (local_storage != NULL, NULL); - g_return_val_if_fail (E_IS_LOCAL_STORAGE (local_storage), NULL); - - return local_storage->priv->base_path; -} - - -E_MAKE_TYPE (e_local_storage, "ELocalStorage", ELocalStorage, class_init, init, PARENT_TYPE) diff --git a/shell/e-local-storage.h b/shell/e-local-storage.h deleted file mode 100644 index 14a48cbdd4..0000000000 --- a/shell/e-local-storage.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-local-storage.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_LOCAL_STORAGE_H_ -#define _E_LOCAL_STORAGE_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-folder-type-registry.h" -#include "e-storage.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_LOCAL_STORAGE (e_local_storage_get_type ()) -#define E_LOCAL_STORAGE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_LOCAL_STORAGE, ELocalStorage)) -#define E_LOCAL_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_LOCAL_STORAGE, ELocalStorageClass)) -#define E_IS_LOCAL_STORAGE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_LOCAL_STORAGE)) -#define E_IS_LOCAL_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_LOCAL_STORAGE)) - -typedef struct _ELocalStorage ELocalStorage; -typedef struct _ELocalStoragePrivate ELocalStoragePrivate; -typedef struct _ELocalStorageClass ELocalStorageClass; - -struct _ELocalStorage { - EStorage parent; - - ELocalStoragePrivate *priv; -}; - -struct _ELocalStorageClass { - EStorageClass parent_class; -}; - - -GtkType e_local_storage_get_type (void); -EStorage *e_local_storage_open (EFolderTypeRegistry *folder_type_registry, - const char *base_path); -const char *e_local_storage_get_base_path (ELocalStorage *storage); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_LOCAL_STORAGE_H__ */ diff --git a/shell/e-setup.c b/shell/e-setup.c deleted file mode 100644 index 3393247f35..0000000000 --- a/shell/e-setup.c +++ /dev/null @@ -1,144 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-setup.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -/* This needs to be a lot better. */ - -#include <glib.h> -#include <gnome.h> - -#include <errno.h> -#include <sys/stat.h> - -#include "e-util/e-gui-utils.h" - -#include "e-setup.h" - - -static gboolean -copy_default_stuff (const char *evolution_directory) -{ - GtkWidget *dialog; - GtkWidget *label1; - GtkWidget *label2; - GtkWidget *label3; - gboolean retval; - char *command; - int result; - - dialog = gnome_dialog_new (_("Evolution installation"), - GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, - NULL); - - label1 = gtk_label_new (_("This seems to be the first time you run Evolution.")); - label2 = gtk_label_new (_("Please click \"OK\" to install the Evolution user files under")); - label3 = gtk_label_new (evolution_directory); - - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label1, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label2, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label3, TRUE, TRUE, 0); - - gtk_widget_show (label1); - gtk_widget_show (label2); - gtk_widget_show (label3); - - result = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); - if (result != 0) - return FALSE; - - if (mkdir (evolution_directory, 0700)) { - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("Cannot create the directory\n%s\nError: %s"), - evolution_directory, - g_strerror (errno)); - return FALSE; - } - - command = g_strconcat ("cp -r ", - EVOLUTION_DATADIR, - "/evolution/default_user/* ", - evolution_directory, - NULL); - - if (system (command) != 0) { - /* FIXME: Give more help. */ - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("Cannot copy files into\n`%s'."), evolution_directory); - retval = FALSE; - } else { - e_notice (NULL, GNOME_MESSAGE_BOX_INFO, - _("Evolution files successfully installed.")); - retval = TRUE; - } - - g_free (command); - - return retval; -} - - -gboolean -e_setup (const char *evolution_directory) -{ - struct stat statinfo; - char *file; - - if (stat (evolution_directory, &statinfo) != 0) - return copy_default_stuff (evolution_directory); - - if (! S_ISDIR (statinfo.st_mode)) { - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("The file `%s' is not a directory.\n" - "Please move it in order to allow installation\n" - "of the Evolution user files.")); - return FALSE; - } - - /* Make sure this is really our directory, not an Evolution - * build tree or something like that. - */ - file = g_strdup_printf ("%s/shortcuts.xml", evolution_directory); - if (stat (file, &statinfo) != 0) { - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("The directory `%s' exists but is not the\n" - "Evolution directory. Please move it in order\n" - "to allow installation of the Evolution user " - "files."), evolution_directory); - g_free (file); - return FALSE; - } - g_free (file); - - /* If the user has an old-style config file, replace it with - * the new-style config directory. FIXME: This should be - * temporary. - */ - file = g_strdup_printf ("%s/config", evolution_directory); - if (stat (file, &statinfo) == 0 && ! S_ISDIR (statinfo.st_mode)) { - char *old = g_strdup_printf ("%s.old", file); - rename (file, old); - mkdir (file, 0700); - g_free (old); - } - g_free (file); - - return TRUE; -} diff --git a/shell/e-setup.h b/shell/e-setup.h deleted file mode 100644 index a69d216b94..0000000000 --- a/shell/e-setup.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-setup.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_SETUP_H -#define _E_SETUP_H - -#include <glib.h> - -gboolean e_setup (const char *evolution_directory); - -#endif /* _E_SETUP_H */ diff --git a/shell/e-shell-constants.h b/shell/e-shell-constants.h deleted file mode 100644 index 70986144d0..0000000000 --- a/shell/e-shell-constants.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-utils.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef E_SHELL_CONSTANTS_H -#define E_SHELL_CONSTANTS_H - -#define E_SHELL_URI_PREFIX "evolution:" -#define E_SHELL_URI_PREFIX_LEN 10 - -#define E_SHELL_MINI_ICON_SUFFIX "-mini" -#define E_SHELL_MINI_ICON_SUFFIX_LEN 5 - -#define E_SHELL_ICON_SIZE 48 -#define E_SHELL_MINI_ICON_SIZE 16 - -#endif diff --git a/shell/e-shell-folder-creation-dialog.c b/shell/e-shell-folder-creation-dialog.c deleted file mode 100644 index e793b2ccff..0000000000 --- a/shell/e-shell-folder-creation-dialog.c +++ /dev/null @@ -1,398 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> -#include <glade/glade-xml.h> - -#include "e-util/e-gui-utils.h" -#include "e-util/e-util.h" - -#include "widgets/misc/e-scroll-frame.h" - -#include "e-storage-set.h" -#include "e-storage-set-view.h" - -#include "e-shell-folder-creation-dialog.h" - - -#define GLADE_FILE_NAME EVOLUTION_GLADEDIR "/e-shell-folder-creation-dialog.glade" - - -/* Data for the callbacks. */ -struct _DialogData { - GtkWidget *dialog; - EShell *shell; - GtkWidget *folder_name_entry; - GtkWidget *storage_set_view; - GtkWidget *folder_type_option_menu; - GList *folder_types; -}; -typedef struct _DialogData DialogData; - -static void -dialog_data_destroy (DialogData *dialog_data) -{ - e_free_string_list (dialog_data->folder_types); - g_free (dialog_data); -} - - -/* Callback for the asynchronous folder creation function. */ - -static void -async_create_cb (EStorage *storage, - EStorageResult result, - void *data) -{ - DialogData *dialog_data; - - dialog_data = (DialogData *) data; - - if (result == E_STORAGE_OK) { - gtk_widget_destroy (dialog_data->dialog); - return; - } - - e_notice (GTK_WINDOW (dialog_data->dialog), GNOME_MESSAGE_BOX_ERROR, - _("Cannot create the specified folder:\n%s"), - e_storage_result_to_string (result)); -} - - -/* Sanity check for the user-specified folder name. */ -/* FIXME in the future we would like not to have the `G_DIR_SEPARATOR' limitation. */ -static gboolean -entry_name_is_valid (GtkEntry *entry) -{ - const char *name; - - name = gtk_entry_get_text (entry); - - if (name == NULL || *name == '\0') - return FALSE; - - if (strchr (name, G_DIR_SEPARATOR) != NULL) - return FALSE; - - if (strcmp (name, ".") == 0 || strcmp (name, "..") == 0) - return FALSE; - - return TRUE; -} - - -/* Dialog signal callbacks. */ - -static void -dialog_clicked_cb (GnomeDialog *dialog, - int button_number, - void *data) -{ - DialogData *dialog_data; - EStorageSet *storage_set; - GtkWidget *folder_type_menu_item; - const char *folder_type; - const char *parent_path; - const char *folder_name; - char *path; - - if (button_number != 0) { - gnome_dialog_close (dialog); - return; - } - - dialog_data = (DialogData *) data; - - if (! entry_name_is_valid (GTK_ENTRY (dialog_data->folder_name_entry))) { - /* FIXME: Explain better. */ - e_notice (GTK_WINDOW (dialog), GNOME_MESSAGE_BOX_ERROR, - _("The specified folder name is not valid.")); - return; - } - - parent_path = e_storage_set_view_get_current_folder - (E_STORAGE_SET_VIEW (dialog_data->storage_set_view)); - if (parent_path == NULL) { - gnome_dialog_close (dialog); - return; - } - - folder_name = gtk_entry_get_text (GTK_ENTRY (dialog_data->folder_name_entry)); - path = g_concat_dir_and_file (parent_path, folder_name); - - storage_set = e_shell_get_storage_set (dialog_data->shell); - - folder_type_menu_item = GTK_OPTION_MENU (dialog_data->folder_type_option_menu)->menu_item; - folder_type = gtk_object_get_data (GTK_OBJECT (folder_type_menu_item), "folder_type"); - - if (folder_type == NULL) { - g_warning ("Cannot get folder type for selected GtkOptionMenu item."); - return; - } - - e_storage_set_async_create_folder (storage_set, - path, - folder_type, - NULL, /* description */ - async_create_cb, dialog_data); -} - -static void -dialog_close_cb (GnomeDialog *dialog, - void *data) -{ - gtk_widget_destroy (GTK_WIDGET (dialog)); -} - -static void -dialog_destroy_cb (GtkObject *object, - void *data) -{ - DialogData *dialog_data; - - dialog_data = (DialogData *) data; - dialog_data_destroy (dialog_data); -} - -static void -folder_name_entry_changed_cb (GtkEditable *editable, - void *data) -{ - GnomeDialog *dialog; - GtkEntry *entry; - - entry = GTK_ENTRY (editable); - dialog = GNOME_DIALOG (data); - - if (entry->text_length > 0) - gnome_dialog_set_sensitive (dialog, 0, TRUE); - else - gnome_dialog_set_sensitive (dialog, 0, FALSE); -} - - -/* Shell signal callbacks. */ - -static void -shell_destroy_cb (GtkObject *object, - void *data) -{ - GnomeDialog *dialog; - - dialog = GNOME_DIALOG (data); - gtk_widget_destroy (GTK_WIDGET (dialog)); -} - - -/* Dialog setup. */ - -static void -setup_dialog (GtkWidget *dialog, - GladeXML *gui, - EShell *shell, - GtkWindow *parent_window) -{ - if (parent_window != NULL) - gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window); - - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - gtk_window_set_title (GTK_WINDOW (dialog), _("Evolution - Create new folder")); - - gnome_dialog_set_default (GNOME_DIALOG (dialog), 0); - gnome_dialog_set_sensitive (GNOME_DIALOG (dialog), 0, FALSE); - - gtk_widget_show (dialog); -} - -static void -setup_folder_name_entry (GtkWidget *dialog, - GladeXML *gui, - EShell *shell) -{ - GtkWidget *folder_name_entry; - - folder_name_entry = glade_xml_get_widget (gui, "folder_name_entry"); - - gnome_dialog_editable_enters (GNOME_DIALOG (dialog), GTK_EDITABLE (folder_name_entry)); - - gtk_signal_connect (GTK_OBJECT (folder_name_entry), "changed", - GTK_SIGNAL_FUNC (folder_name_entry_changed_cb), dialog); -} - -static GtkWidget * -add_storage_set_view (GtkWidget *dialog, - GladeXML *gui, - EShell *shell, - const char *default_parent_folder) -{ - EStorageSet *storage_set; - GtkWidget *storage_set_view; - GtkWidget *scroll_frame; - GtkWidget *vbox; - - storage_set = e_shell_get_storage_set (shell); - storage_set_view = e_storage_set_new_view (storage_set); - - GTK_WIDGET_SET_FLAGS (storage_set_view, GTK_CAN_FOCUS); - - if (default_parent_folder != NULL) - e_storage_set_view_set_current_folder (E_STORAGE_SET_VIEW (storage_set_view), - default_parent_folder); - - vbox = glade_xml_get_widget (gui, "main_vbox"); - - scroll_frame = e_scroll_frame_new (NULL, NULL); - e_scroll_frame_set_policy (E_SCROLL_FRAME (scroll_frame), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (vbox), scroll_frame, TRUE, TRUE, 0); - - gtk_container_add (GTK_CONTAINER (scroll_frame), storage_set_view); - - gtk_widget_show (scroll_frame); - gtk_widget_show (storage_set_view); - - return storage_set_view; -} - -static GList * -add_folder_types (GtkWidget *dialog, - GladeXML *gui, - EShell *shell) -{ - EFolderTypeRegistry *folder_type_registry; - GtkWidget *folder_type_option_menu; - GtkWidget *menu; - GList *folder_types; - GList *p; - int default_item; - int i; - - folder_type_option_menu = glade_xml_get_widget (gui, "folder_type_option_menu"); - - /* KLUDGE. So, GtkOptionMenu is badly broken. It calculates its size - in `gtk_option_menu_set_menu()' instead of using `size_request()' as - any sane widget would do. So, in order to avoid the "narrow - GtkOptionMenu" bug, we have to destroy the existing associated menu - and create a new one. Life sucks. */ - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (folder_type_option_menu)); - g_assert (menu != NULL); - gtk_widget_destroy (menu); - - menu = gtk_menu_new (); - - folder_type_registry = e_shell_get_folder_type_registry (shell); - g_assert (folder_type_registry != NULL); - - folder_types = e_folder_type_registry_get_type_names (folder_type_registry); - if (folder_types == NULL) - return NULL; /* Uh? */ - - folder_types = g_list_sort (folder_types, (GCompareFunc) g_strcasecmp); - - /* FIXME: Use descriptive name (not in the registry's implementation yet). */ - /* FIXME: Add icon (I don't feel like writing an alpha-capable thingie again). */ - - default_item = 0; - for (p = folder_types, i = 0; p != NULL; p = p->next, i++) { - const char *type_name; - GtkWidget *menu_item; - - type_name = (const char *) p->data; - - menu_item = gtk_menu_item_new_with_label (type_name); - gtk_widget_show (menu_item); - gtk_menu_append (GTK_MENU (menu), menu_item); - - gtk_object_set_data (GTK_OBJECT (menu_item), "folder_type", (void *) type_name); - - if (strcmp (type_name, "mail") == 0) - default_item = i; - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU (folder_type_option_menu), menu); - gtk_widget_show (menu); - - gtk_option_menu_set_history (GTK_OPTION_MENU (folder_type_option_menu), default_item); - gtk_widget_queue_resize (folder_type_option_menu); - - return folder_types; -} - - -/* FIXME: Currently this is modal. I think it's OK, but if people think it is - not, we should change it to non-modal and make sure only one of these is - open at once. Currently it relies on modality for this. */ -void -e_shell_show_folder_creation_dialog (EShell *shell, - GtkWindow *parent_window, - const char *default_parent_folder) -{ - GladeXML *gui; - GtkWidget *dialog; - GtkWidget *storage_set_view; - GList *folder_types; - DialogData *dialog_data; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - - gui = glade_xml_new (GLADE_FILE_NAME, NULL); - if (gui == NULL) { - g_warning ("Cannot load Glade description file for the folder creation dialog -- %s", - GLADE_FILE_NAME); - return; - } - - dialog = glade_xml_get_widget (gui, "create_folder_dialog"); - - setup_dialog (dialog, gui, shell, parent_window); - setup_folder_name_entry (dialog, gui, shell); - - storage_set_view = add_storage_set_view (dialog, gui, shell, default_parent_folder); - folder_types = add_folder_types (dialog, gui, shell); - - dialog_data = g_new (DialogData, 1); - dialog_data->dialog = dialog; - dialog_data->shell = shell; - dialog_data->folder_name_entry = glade_xml_get_widget (gui, "folder_name_entry"); - dialog_data->storage_set_view = storage_set_view; - dialog_data->folder_type_option_menu = glade_xml_get_widget (gui, "folder_type_option_menu"); - dialog_data->folder_types = folder_types; - - gtk_signal_connect (GTK_OBJECT (dialog), "clicked", - GTK_SIGNAL_FUNC (dialog_clicked_cb), dialog_data); - gtk_signal_connect (GTK_OBJECT (dialog), "close", - GTK_SIGNAL_FUNC (dialog_close_cb), dialog_data); - gtk_signal_connect (GTK_OBJECT (dialog), "destroy", - GTK_SIGNAL_FUNC (dialog_destroy_cb), dialog_data); - - gtk_signal_connect_while_alive (GTK_OBJECT (shell), "destroy", - GTK_SIGNAL_FUNC (shell_destroy_cb), dialog_data, - GTK_OBJECT (dialog)); - - gtk_object_unref (GTK_OBJECT (gui)); -} diff --git a/shell/e-shell-folder-creation-dialog.h b/shell/e-shell-folder-creation-dialog.h deleted file mode 100644 index ac7518f986..0000000000 --- a/shell/e-shell-folder-creation-dialog.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef E_SHELL_FOLDER_CREATION_DIALOG_H -#define E_SHELL_FOLDER_CREATION_DIALOG_H - -#include <gtk/gtkwindow.h> - -#include "e-shell.h" - -void e_shell_show_folder_creation_dialog (EShell *shell, - GtkWindow *parent, - const char *default_parent_folder); - -#endif /* E_SHELL_FOLDER_CREATION_DIALOG_H */ diff --git a/shell/e-shell-folder-selection-dialog.c b/shell/e-shell-folder-selection-dialog.c deleted file mode 100644 index 3bf60d28e4..0000000000 --- a/shell/e-shell-folder-selection-dialog.c +++ /dev/null @@ -1,359 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-selection-dialog.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <libgnomeui/gnome-stock.h> -#include <libgnomeui/gnome-dialog.h> -#include <libgnome/gnome-i18n.h> - -#include "e-util/e-gui-utils.h" -#include "e-util/e-util.h" -#include "widgets/misc/e-scroll-frame.h" - -#include "e-shell-constants.h" -#include "e-storage-set-view.h" -#include "e-storage-set.h" - -#include "e-shell-folder-creation-dialog.h" - -#include "e-shell-folder-selection-dialog.h" - - -#define PARENT_TYPE (gnome_dialog_get_type ()) -static GnomeDialogClass *parent_class = NULL; - -struct _EShellFolderSelectionDialogPrivate { - EShell *shell; - GList *allowed_types; - EStorageSet *storage_set; - GtkWidget *storage_set_view; -}; - -enum { - FOLDER_SELECTED, - CANCELLED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -static gboolean -check_folder_type (EShellFolderSelectionDialog *folder_selection_dialog) -{ - EShellFolderSelectionDialogPrivate *priv; - const char *selected_path; - EFolder *folder; - const char *folder_type; - GList *p; - - priv = folder_selection_dialog->priv; - if (priv->allowed_types == NULL) - return TRUE; - - selected_path = e_shell_folder_selection_dialog_get_selected_path (folder_selection_dialog); - if (selected_path == NULL) - return FALSE; - - folder = e_storage_set_get_folder (priv->storage_set, selected_path); - if (folder == NULL) - return FALSE; - - folder_type = e_folder_get_type_string (folder); - - for (p = priv->allowed_types; p != NULL; p = p->next) { - const char *type; - - type = (const char *) p->data; - if (strcasecmp (folder_type, type) == 0) - return TRUE; - } - - e_notice (GTK_WINDOW (folder_selection_dialog), GNOME_MESSAGE_BOX_ERROR, - _("The type of the selected folder is not valid for\nthe requested operation.")); - - return FALSE; -} - - -/* GtkObject methods. */ - -static void -impl_destroy (GtkObject *object) -{ - EShellFolderSelectionDialog *folder_selection_dialog; - EShellFolderSelectionDialogPrivate *priv; - - folder_selection_dialog = E_SHELL_FOLDER_SELECTION_DIALOG (object); - priv = folder_selection_dialog->priv; - - if (priv->storage_set != NULL) - gtk_object_unref (GTK_OBJECT (priv->storage_set)); - - e_free_string_list (priv->allowed_types); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* GnomeDialog methods. */ - -static void -impl_clicked (GnomeDialog *dialog, - int button_number) -{ - EShellFolderSelectionDialog *folder_selection_dialog; - EShellFolderSelectionDialogPrivate *priv; - EStorageSetView *storage_set_view; - const char *default_parent_folder; - - folder_selection_dialog = E_SHELL_FOLDER_SELECTION_DIALOG (dialog); - priv = folder_selection_dialog->priv; - - switch (button_number) { - case 0: /* OK */ - if (check_folder_type (folder_selection_dialog)) { - gtk_signal_emit (GTK_OBJECT (folder_selection_dialog), signals[FOLDER_SELECTED], - e_shell_folder_selection_dialog_get_selected_path (folder_selection_dialog)); - gtk_widget_destroy (GTK_WIDGET (dialog)); - } - break; - case 1: /* Cancel */ - gtk_signal_emit (GTK_OBJECT (folder_selection_dialog), signals[CANCELLED]); - gtk_widget_destroy (GTK_WIDGET (dialog)); - break; - case 2: /* Add */ - storage_set_view = E_STORAGE_SET_VIEW (priv->storage_set_view); - default_parent_folder = e_storage_set_view_get_current_folder (storage_set_view); - - e_shell_show_folder_creation_dialog (priv->shell, GTK_WINDOW (dialog), - default_parent_folder); - - break; - } -} - - -/* GTK+ type initialization. */ - -static void -class_init (EShellFolderSelectionDialogClass *klass) -{ - GtkObjectClass *object_class; - GnomeDialogClass *dialog_class; - - parent_class = gtk_type_class (PARENT_TYPE); - object_class = GTK_OBJECT_CLASS (klass); - dialog_class = GNOME_DIALOG_CLASS (klass); - - object_class->destroy = impl_destroy; - - dialog_class->clicked = impl_clicked; - - signals[FOLDER_SELECTED] - = gtk_signal_new ("folder_selected", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EShellFolderSelectionDialogClass, folder_selected), - gtk_marshal_NONE__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - - signals[CANCELLED] - = gtk_signal_new ("cancelled", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EShellFolderSelectionDialogClass, cancelled), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EShellFolderSelectionDialog *shell_folder_selection_dialog) -{ - EShellFolderSelectionDialogPrivate *priv; - - priv = g_new (EShellFolderSelectionDialogPrivate, 1); - priv->shell = NULL; - priv->storage_set = NULL; - priv->storage_set_view = NULL; - priv->allowed_types = NULL; - - shell_folder_selection_dialog->priv = priv; -} - - -static void -set_default_folder (EShellFolderSelectionDialog *shell_folder_selection_dialog, - const char *default_uri) -{ - EShellFolderSelectionDialogPrivate *priv; - char *default_path; - - priv = shell_folder_selection_dialog->priv; - - if (default_uri && strncmp (default_uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0) { - /* `evolution:' URI. */ - default_path = g_strdup (default_uri + E_SHELL_URI_PREFIX_LEN); - } else { - /* Physical URI. */ - default_path = e_storage_set_get_path_for_physical_uri (priv->storage_set, - default_uri); - } - - e_storage_set_view_set_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view), - default_path); - - g_free (default_path); -} - - -/** - * e_shell_folder_selection_dialog_construct: - * @folder_selection_dialog: A folder selection dialog widget - * @shell: The this folder selection dialog is for - * @title: Title of the window - * @default_uri: The URI of the folder to be selected by default - * @allowed_types: List of the names of the allowed types - * - * Construct @folder_selection_dialog. - **/ -void -e_shell_folder_selection_dialog_construct (EShellFolderSelectionDialog *folder_selection_dialog, - EShell *shell, - const char *title, - const char *default_uri, - const char *allowed_types[]) -{ - EShellFolderSelectionDialogPrivate *priv; - GtkWidget *scroll_frame; - int i; - - g_return_if_fail (folder_selection_dialog != NULL); - g_return_if_fail (E_IS_SHELL_FOLDER_SELECTION_DIALOG (folder_selection_dialog)); - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - - priv = folder_selection_dialog->priv; - - gtk_window_set_modal (GTK_WINDOW (folder_selection_dialog), TRUE); - gtk_window_set_title (GTK_WINDOW (folder_selection_dialog), title); - - gnome_dialog_append_buttons (GNOME_DIALOG (folder_selection_dialog), - GNOME_STOCK_BUTTON_OK, - GNOME_STOCK_BUTTON_CANCEL, - _("New..."), - NULL); - gnome_dialog_set_default (GNOME_DIALOG (folder_selection_dialog), 0); - - gtk_window_set_policy (GTK_WINDOW (folder_selection_dialog), TRUE, TRUE, FALSE); - gtk_window_set_default_size (GTK_WINDOW (folder_selection_dialog), 350, 300); - - priv->shell = shell; - gtk_signal_connect_object_while_alive (GTK_OBJECT (shell), "destroy", - GTK_SIGNAL_FUNC (gtk_widget_destroy), - GTK_OBJECT (folder_selection_dialog)); - - priv->storage_set = e_shell_get_storage_set (shell); - gtk_object_ref (GTK_OBJECT (priv->storage_set)); - - priv->storage_set_view = e_storage_set_new_view (priv->storage_set); - GTK_WIDGET_SET_FLAGS (priv->storage_set_view, GTK_CAN_FOCUS); - - g_assert (priv->allowed_types == NULL); - if (allowed_types != NULL) { - for (i = 0; allowed_types[i] != NULL; i++) - priv->allowed_types = g_list_prepend (priv->allowed_types, - g_strdup (allowed_types[i])); - } - - set_default_folder (folder_selection_dialog, default_uri); - - scroll_frame = e_scroll_frame_new (NULL, NULL); - e_scroll_frame_set_policy (E_SCROLL_FRAME (scroll_frame), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_container_add (GTK_CONTAINER (scroll_frame), priv->storage_set_view); - - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (folder_selection_dialog)->vbox), - scroll_frame, TRUE, TRUE, 2); - - gtk_widget_show (scroll_frame); - gtk_widget_show (priv->storage_set_view); -} - -/** - * e_shell_folder_selection_dialog_new: - * @shell: The this folder selection dialog is for - * @title: Title of the window - * @default_uri: The URI of the folder to be selected by default - * @allowed_types: List of the names of the allowed types - * - * Create a new folder selection dialog widget. @default_uri can be either an - * `evolution:' URI or a physical URI (all the non-`evoluion:' URIs are - * considered to be physical URIs). - * - * Return value: - **/ -GtkWidget * -e_shell_folder_selection_dialog_new (EShell *shell, - const char *title, - const char *default_uri, - const char *allowed_types[]) -{ - EShellFolderSelectionDialog *folder_selection_dialog; - - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - folder_selection_dialog = gtk_type_new (e_shell_folder_selection_dialog_get_type ()); - e_shell_folder_selection_dialog_construct (folder_selection_dialog, shell, - title, default_uri, allowed_types); - - return GTK_WIDGET (folder_selection_dialog); -} - - -const char * -e_shell_folder_selection_dialog_get_selected_path (EShellFolderSelectionDialog *folder_selection_dialog) -{ - EShellFolderSelectionDialogPrivate *priv; - - g_return_val_if_fail (folder_selection_dialog != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL_FOLDER_SELECTION_DIALOG (folder_selection_dialog), NULL); - - priv = folder_selection_dialog->priv; - - return e_storage_set_view_get_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view)); -} - - -E_MAKE_TYPE (e_shell_folder_selection_dialog, "EShellFolderSelectionDialog", EShellFolderSelectionDialog, - class_init, init, PARENT_TYPE) diff --git a/shell/e-shell-folder-selection-dialog.h b/shell/e-shell-folder-selection-dialog.h deleted file mode 100644 index 2ddb98bafe..0000000000 --- a/shell/e-shell-folder-selection-dialog.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-selection-dialog.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef E_SHELL_FOLDER_SELECTION_DIALOG_H -#define E_SHELL_FOLDER_SELECTION_DIALOG_H - -#include <libgnomeui/gnome-dialog.h> - -#include "e-shell.h" - -#ifdef cplusplus -extern "C" { -#pragma } -#endif /* cplusplus */ - -#define E_TYPE_SHELL_FOLDER_SELECTION_DIALOG (e_shell_folder_selection_dialog_get_type ()) -#define E_SHELL_FOLDER_SELECTION_DIALOG(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_FOLDER_SELECTION_DIALOG, EShellFolderSelectionDialog)) -#define E_SHELL_FOLDER_SELECTION_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_FOLDER_SELECTION_DIALOG, EShellFolderSelectionDialogClass)) -#define E_IS_SHELL_FOLDER_SELECTION_DIALOG(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_FOLDER_SELECTION_DIALOG)) -#define E_IS_SHELL_FOLDER_SELECTION_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_FOLDER_SELECTION_DIALOG)) - - -typedef struct _EShellFolderSelectionDialog EShellFolderSelectionDialog; -typedef struct _EShellFolderSelectionDialogPrivate EShellFolderSelectionDialogPrivate; -typedef struct _EShellFolderSelectionDialogClass EShellFolderSelectionDialogClass; - -struct _EShellFolderSelectionDialog { - GnomeDialog parent; - - EShellFolderSelectionDialogPrivate *priv; -}; - -struct _EShellFolderSelectionDialogClass { - GnomeDialogClass parent_class; - - void (* folder_selected) (EShellFolderSelectionDialog *folder_selection_dialog, - const char *path); - void (* cancelled) (EShellFolderSelectionDialog *folder_selection_dialog); -}; - - -GtkType e_shell_folder_selection_dialog_get_type (void); -void e_shell_folder_selection_dialog_construct (EShellFolderSelectionDialog *folder_selection_dialog, - EShell *shell, - const char *title, - const char *default_path, - const char *allowed_types[]); -GtkWidget *e_shell_folder_selection_dialog_new (EShell *shell, - const char *title, - const char *default_path, - const char *allowed_types[]); - -const char *e_shell_folder_selection_dialog_get_selected_path (EShellFolderSelectionDialog *folder_selection_dialog); - -#ifdef cplusplus -} -#endif /* cplusplus */ - -#endif /* E_SHELL_FOLDER_SELECTION_DIALOG_H */ diff --git a/shell/e-shell-folder-title-bar.c b/shell/e-shell-folder-title-bar.c deleted file mode 100644 index 00d0e70e98..0000000000 --- a/shell/e-shell-folder-title-bar.c +++ /dev/null @@ -1,548 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-title-bar.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include "widgets/misc/e-clipped-label.h" -#include "e-util/e-util.h" - -#include "e-shell-constants.h" -#include "e-shell-folder-title-bar.h" - - -#define PARENT_TYPE GTK_TYPE_EVENT_BOX -static GtkEventBox *parent_class = NULL; - -struct _EShellFolderTitleBarPrivate { - GdkPixbuf *icon; - GtkWidget *icon_widget; - - /* The hbox containing the button, the label and the icon on the right. */ - GtkWidget *hbox; - - /* We have a label and a button. When the button is enabled, the label is hidden; - when the button is disable, only the label is visible. */ - - /* The label. */ - GtkWidget *label; - - /* The button. */ - GtkWidget *button; - GtkWidget *button_label; - GtkWidget *button_arrow; - - gboolean clickable; -}; - -enum { - TITLE_TOGGLED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -static char *arrow_xpm[] = { - "11 5 2 1", - " c none", - ". c #ffffffffffff", - " ......... ", - " ....... ", - " ..... ", - " ... ", - " . ", -}; - - -/* Icon handling. */ - -static unsigned int -rgb_from_gdk_color (GdkColor *color) -{ - return (((color->red >> 8) << 16) - | ((color->green >> 8) << 8) - | ((color->blue >> 8))); -} - -static GdkPixmap * -make_icon_pixmap (EShellFolderTitleBar *folder_title_bar, - const GdkPixbuf *pixbuf) -{ - GdkPixmap *pixmap; - GtkWidget *widget; - unsigned int depth; - unsigned int rgb; - - widget = GTK_WIDGET (folder_title_bar); - - rgb = rgb_from_gdk_color (&widget->style->bg[GTK_STATE_NORMAL]); - - depth = gtk_widget_get_visual (widget)->depth; - - pixmap = gdk_pixmap_new (GTK_WIDGET (folder_title_bar)->window, - E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE, - depth); - - if (pixbuf == NULL) { - gdk_draw_rectangle (pixmap, widget->style->bg_gc[GTK_STATE_NORMAL], TRUE, - 0, 0, E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE); - } else { - GdkPixbuf *composited_pixbuf; - - composited_pixbuf = gdk_pixbuf_composite_color_simple - (pixbuf, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf), - GDK_INTERP_NEAREST, 255, 32, rgb, rgb); - - gdk_pixbuf_render_to_drawable (composited_pixbuf, - pixmap, widget->style->fg_gc[GTK_STATE_NORMAL], - 0, 0, 0, 0, - E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE, - GDK_RGB_DITHER_MAX, 0, 0); - - gdk_pixbuf_unref (composited_pixbuf); - } - - return pixmap; -} - - -/* Icon pixmap. */ - -static GtkWidget * -create_icon_pixmap (GtkWidget *parent) -{ - GtkWidget *gtk_pixmap; - GdkPixmap *gdk_pixmap; - GdkBitmap *gdk_mask; - - gdk_pixmap = gdk_pixmap_create_from_xpm_d (parent->window, &gdk_mask, NULL, arrow_xpm); - gtk_pixmap = gtk_pixmap_new (gdk_pixmap, gdk_mask); - - gdk_pixmap_unref (gdk_pixmap); - gdk_bitmap_unref (gdk_mask); - - return gtk_pixmap; -} - -static void -title_button_box_realize_cb (GtkWidget *widget, - void *data) -{ - EShellFolderTitleBar *folder_title_bar; - EShellFolderTitleBarPrivate *priv; - GtkWidget *button_arrow; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (data); - priv = folder_title_bar->priv; - - if (priv->button_arrow != NULL) - return; - - button_arrow = create_icon_pixmap (widget); - - gtk_widget_show (button_arrow); - gtk_box_pack_start (GTK_BOX (widget), button_arrow, FALSE, TRUE, 2); - - priv->button_arrow = button_arrow; -} - - -/* Style handling. */ - -static void -endarken_style (GtkWidget *widget) -{ -#ifndef E_USE_STYLES - GtkStyle *style; - GtkRcStyle *new_rc_style; - int i; - - style = widget->style; - - new_rc_style = gtk_rc_style_new (); - - for (i = 0; i < 5; i++) { - new_rc_style->bg[i].red = style->bg[i].red * .8; - new_rc_style->bg[i].green = style->bg[i].green * .8; - new_rc_style->bg[i].blue = style->bg[i].blue * .8; - new_rc_style->fg[i].red = 0xffff; - new_rc_style->fg[i].green = 0xffff; - new_rc_style->fg[i].blue = 0xffff; - - new_rc_style->color_flags[i] = GTK_RC_BG | GTK_RC_FG; - } - - gtk_widget_modify_style (widget, new_rc_style); - - gtk_rc_style_unref (new_rc_style); -#endif -} - -static void -style_set_cb (GtkWidget *widget, - GtkStyle *previous_style, - void *data) -{ - EShellFolderTitleBar *folder_title_bar; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (widget); - - /* - This will cause a style_set signal to be emitted again, - so we need to do this to prevent infinite recursion. - */ - gtk_signal_handler_block_by_func (GTK_OBJECT (widget), GTK_SIGNAL_FUNC (style_set_cb), data); - - endarken_style (widget); - gtk_signal_handler_unblock_by_func (GTK_OBJECT (widget), GTK_SIGNAL_FUNC (style_set_cb), data); - - if (folder_title_bar->priv->icon) - e_shell_folder_title_bar_set_icon (folder_title_bar, folder_title_bar->priv->icon); -} - - -/* Popup button callback. */ - -static void -title_button_toggled_cb (GtkToggleButton *button, - void *data) -{ - EShellFolderTitleBar *folder_title_bar; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (data); - gtk_signal_emit (GTK_OBJECT (folder_title_bar), - signals[TITLE_TOGGLED], - gtk_toggle_button_get_active (button)); -} - - -/* GTkWidget methods. */ - -static void -realize (GtkWidget *widget) -{ - EShellFolderTitleBar *folder_title_bar; - EShellFolderTitleBarPrivate *priv; - GdkPixmap *pixmap; - - (* GTK_WIDGET_CLASS (parent_class)->realize) (widget); - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (widget); - priv = folder_title_bar->priv; - - pixmap = make_icon_pixmap (folder_title_bar, priv->icon); - priv->icon_widget = gtk_pixmap_new (pixmap, NULL); - gdk_pixmap_unref (pixmap); - gtk_widget_show (priv->icon_widget); - - gtk_misc_set_alignment (GTK_MISC (priv->icon_widget), 1.0, .5); - gtk_misc_set_padding (GTK_MISC (priv->icon_widget), 5, 0); - gtk_box_pack_start (GTK_BOX (priv->hbox), priv->icon_widget, TRUE, TRUE, 2); -} - -static void -unrealize (GtkWidget *widget) -{ - EShellFolderTitleBar *folder_title_bar; - EShellFolderTitleBarPrivate *priv; - - (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (widget); - priv = folder_title_bar->priv; - - gtk_widget_destroy (priv->icon_widget); - priv->icon_widget = NULL; -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EShellFolderTitleBar *folder_title_bar; - EShellFolderTitleBarPrivate *priv; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (object); - priv = folder_title_bar->priv; - - gdk_pixbuf_unref (priv->icon); - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (EShellFolderTitleBarClass *klass) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - widget_class = GTK_WIDGET_CLASS (klass); - widget_class->realize = realize; - widget_class->unrealize = unrealize; - - parent_class = gtk_type_class (PARENT_TYPE); - - signals[TITLE_TOGGLED] = gtk_signal_new ("title_toggled", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EShellFolderTitleBarClass, title_toggled), - gtk_marshal_NONE__BOOL, - GTK_TYPE_NONE, 1, - GTK_TYPE_BOOL); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EShellFolderTitleBar *shell_folder_title_bar) -{ - EShellFolderTitleBarPrivate *priv; - - priv = g_new (EShellFolderTitleBarPrivate, 1); - - priv->icon = NULL; - priv->icon_widget = NULL; - priv->hbox = NULL; - priv->label = NULL; - priv->button_label = NULL; - priv->button = NULL; - priv->button_arrow = NULL; - - priv->clickable = TRUE; - - shell_folder_title_bar->priv = priv; -} - - -/** - * e_shell_folder_title_bar_construct: - * @folder_title_bar: - * - * Construct the folder title bar widget. - **/ -void -e_shell_folder_title_bar_construct (EShellFolderTitleBar *folder_title_bar) -{ - EShellFolderTitleBarPrivate *priv; - GtkRequisition button_requisition; - GtkWidget *button_hbox; - GtkWidget *widget; - - g_return_if_fail (folder_title_bar != NULL); - g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar)); - - priv = folder_title_bar->priv; - widget = GTK_WIDGET (folder_title_bar); - - priv->label = gtk_label_new (""); - gtk_misc_set_padding (GTK_MISC (priv->label), 5, 0); - gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5); - - priv->button_label = gtk_label_new (""); - gtk_misc_set_padding (GTK_MISC (priv->button_label), 5, 0); - gtk_misc_set_alignment (GTK_MISC (priv->button_label), 0.0, 0.5); - gtk_widget_show (priv->button_label); - - button_hbox = gtk_hbox_new (FALSE, 0); - gtk_signal_connect (GTK_OBJECT (button_hbox), "realize", - GTK_SIGNAL_FUNC (title_button_box_realize_cb), folder_title_bar); - gtk_box_pack_start (GTK_BOX (button_hbox), priv->button_label, TRUE, TRUE, 0); - gtk_widget_show (button_hbox); - - priv->button = gtk_toggle_button_new (); - gtk_button_set_relief (GTK_BUTTON (priv->button), GTK_RELIEF_NONE); - gtk_container_add (GTK_CONTAINER (priv->button), button_hbox); - GTK_WIDGET_UNSET_FLAGS (priv->button, GTK_CAN_FOCUS); - gtk_widget_show (priv->button); - - priv->hbox = gtk_hbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (priv->hbox), 2); - gtk_box_pack_start (GTK_BOX (priv->hbox), priv->label, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (priv->hbox), priv->button, FALSE, TRUE, 0); - - gtk_widget_show (priv->hbox); - - gtk_signal_connect (GTK_OBJECT (priv->button), "toggled", - GTK_SIGNAL_FUNC (title_button_toggled_cb), folder_title_bar); - - gtk_container_add (GTK_CONTAINER (folder_title_bar), priv->hbox); - - gtk_signal_connect (GTK_OBJECT (folder_title_bar), "style_set", - GTK_SIGNAL_FUNC (style_set_cb), NULL); - - e_shell_folder_title_bar_set_title (folder_title_bar, NULL); - - /* KLUDGE */ - gtk_widget_size_request (priv->button, &button_requisition); - gtk_widget_set_usize (priv->label, button_requisition.width, button_requisition.height); -} - -/** - * e_shell_folder_title_bar_new: - * @void: - * - * Create a new title bar widget. - * - * Return value: - **/ -GtkWidget * -e_shell_folder_title_bar_new (void) -{ - EShellFolderTitleBar *new; - - new = gtk_type_new (e_shell_folder_title_bar_get_type ()); - - e_shell_folder_title_bar_construct (new); - - return GTK_WIDGET (new); -} - -/** - * e_shell_folder_title_bar_set_title: - * @folder_title_bar: - * @title: - * - * Set the title for the title bar. - **/ -void -e_shell_folder_title_bar_set_title (EShellFolderTitleBar *folder_title_bar, - const char *title) -{ - EShellFolderTitleBarPrivate *priv; - - g_return_if_fail (folder_title_bar != NULL); - g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar)); - - priv = folder_title_bar->priv; - - if (title == NULL) { - gtk_label_set_text (GTK_LABEL (priv->button_label), _("(Untitled)")); - gtk_label_set_text (GTK_LABEL (priv->label), _("(Untitled)")); - } else { - gtk_label_set_text (GTK_LABEL (priv->button_label), title); - gtk_label_set_text (GTK_LABEL (priv->label), title); - } - - /* FIXME: There seems to be a bug in EClippedLabel, this is just a workaround. */ - gtk_widget_queue_draw (GTK_WIDGET (folder_title_bar)); -} - -/** - * e_shell_folder_title_bar_set_icon: - * @folder_title_bar: - * @icon: - * - * Set the name of the icon for the title bar. - **/ -void -e_shell_folder_title_bar_set_icon (EShellFolderTitleBar *folder_title_bar, - const GdkPixbuf *icon) -{ - EShellFolderTitleBarPrivate *priv; - GdkPixmap *pixmap; - - g_return_if_fail (icon != NULL); - - g_return_if_fail (folder_title_bar != NULL); - g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar)); - - priv = folder_title_bar->priv; - - gdk_pixbuf_ref ((GdkPixbuf *) icon); - if (priv->icon) - gdk_pixbuf_unref (priv->icon); - priv->icon = (GdkPixbuf *) icon; - - pixmap = make_icon_pixmap (folder_title_bar, icon); - - gtk_pixmap_set (GTK_PIXMAP (priv->icon_widget), pixmap, NULL); -} - - -/** - * e_shell_folder_title_bar_set_toggle_state: - * @folder_title_bar: - * @state: - * - * Set whether the title bar's button is in pressed state (TRUE) or not (FALSE). - **/ -void -e_shell_folder_title_bar_set_toggle_state (EShellFolderTitleBar *folder_title_bar, - gboolean state) -{ - EShellFolderTitleBarPrivate *priv; - - g_return_if_fail (folder_title_bar != NULL); - g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar)); - - priv = folder_title_bar->priv; - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->button), state); -} - -/** - * e_shell_folder_title_bar_set_clickable: - * @folder_title_bar: - * @clickable: - * - * Specify whether @folder_title_bar is clickable. If not, the arrow pixmap is not shown. - **/ -void -e_shell_folder_title_bar_set_clickable (EShellFolderTitleBar *folder_title_bar, - gboolean clickable) -{ - EShellFolderTitleBarPrivate *priv; - - g_return_if_fail (folder_title_bar != NULL); - g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar)); - - priv = folder_title_bar->priv; - - if ((priv->clickable && clickable) || (! priv->clickable && ! clickable)) - return; - - if (clickable) { - gtk_widget_show (priv->button); - gtk_widget_hide (priv->label); - } else { - gtk_widget_hide (priv->button); - gtk_widget_show (priv->label); - } - - priv->clickable = !! clickable; -} - - -E_MAKE_TYPE (e_shell_folder_title_bar, "EShellFolderTitleBar", EShellFolderTitleBar, class_init, init, PARENT_TYPE) diff --git a/shell/e-shell-folder-title-bar.h b/shell/e-shell-folder-title-bar.h deleted file mode 100644 index c8bab9994c..0000000000 --- a/shell/e-shell-folder-title-bar.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-title-bar.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_SHELL_FOLDER_TITLE_BAR_H__ -#define __E_SHELL_FOLDER_TITLE_BAR_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkeventbox.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHELL_FOLDER_TITLE_BAR (e_shell_folder_title_bar_get_type ()) -#define E_SHELL_FOLDER_TITLE_BAR(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_FOLDER_TITLE_BAR, EShellFolderTitleBar)) -#define E_SHELL_FOLDER_TITLE_BAR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_FOLDER_TITLE_BAR, EShellFolderTitleBarClass)) -#define E_IS_SHELL_FOLDER_TITLE_BAR(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_FOLDER_TITLE_BAR)) -#define E_IS_SHELL_FOLDER_TITLE_BAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_FOLDER_TITLE_BAR)) - - -typedef struct _EShellFolderTitleBar EShellFolderTitleBar; -typedef struct _EShellFolderTitleBarPrivate EShellFolderTitleBarPrivate; -typedef struct _EShellFolderTitleBarClass EShellFolderTitleBarClass; - -struct _EShellFolderTitleBar { - GtkEventBox parent; - - EShellFolderTitleBarPrivate *priv; -}; - -struct _EShellFolderTitleBarClass { - GtkEventBoxClass parent_class; - - /* Signals. */ - void (* title_toggled) (EShellFolderTitleBar *folder_title_bar, gboolean pressed); -}; - - -GtkType e_shell_folder_title_bar_get_type (void); -void e_shell_folder_title_bar_construct (EShellFolderTitleBar *folder_title_bar); -GtkWidget *e_shell_folder_title_bar_new (void); - -void e_shell_folder_title_bar_set_title (EShellFolderTitleBar *folder_title_bar, - const char *title); -void e_shell_folder_title_bar_set_icon (EShellFolderTitleBar *folder_title_bar, - const GdkPixbuf *icon); -void e_shell_folder_title_bar_set_toggle_state (EShellFolderTitleBar *folder_title_bar, - gboolean state); -void e_shell_folder_title_bar_set_clickable (EShellFolderTitleBar *folder_title_bar, - gboolean clickable); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_SHELL_FOLDER_TITLE_BAR_H__ */ diff --git a/shell/e-shell-utils.c b/shell/e-shell-utils.c deleted file mode 100644 index 9065fc224c..0000000000 --- a/shell/e-shell-utils.c +++ /dev/null @@ -1,107 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-utils.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> - -#include "e-shell-constants.h" - -#include "e-shell-utils.h" - - -static char * -get_icon_path (const char *icon_name) -{ - char *icon_path; - - if (g_path_is_absolute (icon_name)) { - icon_path = g_strdup (icon_name); - } else { - icon_path = gnome_pixmap_file (icon_name); - - if (icon_path == NULL) - icon_path = g_concat_dir_and_file (EVOLUTION_IMAGES, - icon_name); - } - - if (g_file_exists (icon_path)) { - return icon_path; - } else { - g_free (icon_path); - return NULL; - } -} - -static char * -get_mini_name (const char *icon_name) -{ - const char *dot_ptr; - const char *basename; - char *name_without_extension; - char *mini_name; - - basename = g_basename (icon_name); - if (basename == NULL) - return NULL; - - dot_ptr = strrchr (basename, '.'); - - if (dot_ptr == NULL) { - /* No extension. */ - return g_strconcat (icon_name, E_SHELL_MINI_ICON_SUFFIX, NULL); - } - - name_without_extension = g_strndup (icon_name, dot_ptr - icon_name); - mini_name = g_strconcat (name_without_extension, E_SHELL_MINI_ICON_SUFFIX, - dot_ptr, NULL); - g_free (name_without_extension); - - return mini_name; -} - - -char * -e_shell_get_icon_path (const char *icon_name, - gboolean try_mini) -{ - if (try_mini) { - char *path; - char *mini_name; - - mini_name = get_mini_name (icon_name); - if (mini_name == NULL) { - path = NULL; - } else { - path = get_icon_path (mini_name); - g_free (mini_name); - } - - if (path != NULL) - return path; - } - - return get_icon_path (icon_name); -} diff --git a/shell/e-shell-utils.h b/shell/e-shell-utils.h deleted file mode 100644 index a701dd38eb..0000000000 --- a/shell/e-shell-utils.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-utils.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef E_SHELL_UTILS_H -#define E_SHELL_UTILS_H - -char *e_shell_get_icon_path (const char *icon_name, - gboolean try_mini); - -#endif diff --git a/shell/e-shell-view-menu.c b/shell/e-shell-view-menu.c deleted file mode 100644 index 6cf7fe826a..0000000000 --- a/shell/e-shell-view-menu.c +++ /dev/null @@ -1,623 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-view.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: - * Miguel de Icaza - * Ettore Perazzoli - */ - -#include <config.h> -#include <gnome.h> - -#include "e-shell-folder-creation-dialog.h" -#include "e-shell-folder-selection-dialog.h" - -#include "e-shell-constants.h" - -#include "e-shell-view-menu.h" - - -/* EShellView callbacks. */ - -static void -shortcut_bar_mode_changed_cb (EShellView *shell_view, - EShellViewSubwindowMode new_mode, - void *data) -{ - BonoboUIHandler *uih; - const char *path; - gboolean toggle_state; - - if (new_mode == E_SHELL_VIEW_SUBWINDOW_HIDDEN) - toggle_state = FALSE; - else - toggle_state = TRUE; - - path = (const char *) data; - uih = e_shell_view_get_bonobo_ui_handler (shell_view); - - bonobo_ui_handler_menu_set_toggle_state (uih, path, toggle_state); -} - -static void -folder_bar_mode_changed_cb (EShellView *shell_view, - EShellViewSubwindowMode new_mode, - void *data) -{ - BonoboUIHandler *uih; - const char *path; - gboolean toggle_state; - - if (new_mode == E_SHELL_VIEW_SUBWINDOW_HIDDEN) - toggle_state = FALSE; - else - toggle_state = TRUE; - - path = (const char *) data; - uih = e_shell_view_get_bonobo_ui_handler (shell_view); - - bonobo_ui_handler_menu_set_toggle_state (uih, path, toggle_state); -} - - -/* Command callbacks. */ -static void -command_quit (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - EShell *shell; - - shell_view = E_SHELL_VIEW (data); - - shell = e_shell_view_get_shell (shell_view); - e_shell_quit (shell); -} - -static void -command_run_bugbuddy (BonoboUIHandler *uih, - void *data, - const char *path) -{ - int pid; - char *args[] = { - "bug-buddy", - "--sm-disable", - "--package=evolution", - "--package-ver="VERSION, - NULL - }; - args[0] = gnome_is_program_in_path ("bug-buddy"); - if (!args[0]) { - /* you might have to call gnome_dialog_run() on the - * dialog returned here, I don't remember... - */ - gnome_error_dialog (_("Bug buddy was not found in your $PATH.")); - } - pid = gnome_execute_async (NULL, 4, args); - g_free (args[0]); - if (pid == -1) { - /* same as above */ - gnome_error_dialog (_("Bug buddy could not be run.")); - } -} - -static void -zero_pointer(GtkObject *object, void **pointer) -{ - *pointer = NULL; -} - -static void -command_about_box (BonoboUIHandler *uih, - void *data, - const char *path) -{ - static GtkWidget *about_box = NULL; - - if (about_box) - gdk_window_raise(GTK_WIDGET(about_box)->window); - else { - const gchar *authors[] = { - "Seth Alves", - "Anders Carlsson", - "Damon Chaplin", - "Clifford R. Conover", - "Miguel de Icaza", - "Radek Doulik", - "Arturo Espinoza", - "Larry Ewing", - "Nat Friedman", - "Bertrand Guiheneuf", - "Tuomas Kuosmanen", - "Christopher J. Lahey", - "Matthew Loper", - "Federico Mena", - "Eskil Heyn Olsen", - "Ettore Perazzoli", - "Jeffrey Stedfast", - "Russell Steinthal", - "Peter Teichman", - "Chris Toshok", - "Peter Williams", - "Dan Winship", - "Michael Zucchi", - NULL}; - - about_box = gnome_about_new(_("Evolution"), - VERSION, - _("Copyright 1999, 2000 Helix Code, Inc."), - authors, - _("Evolution is a suite of groupware applications\n" - "for mail, calendaring, and contact management\n" - "within the GNOME desktop environment."), - NULL); - gtk_signal_connect(GTK_OBJECT(about_box), "destroy", - GTK_SIGNAL_FUNC(zero_pointer), &about_box); - gtk_widget_show(about_box); - } -} - -static void -command_help (BonoboUIHandler *uih, - void *data, - const char *path) -{ - char *url; - - url = g_strdup_printf ("ghelp:%s/gnome/help/evolution/C/%s", - EVOLUTION_DATADIR, (char *)data); - gnome_url_show (url); -} - -static void -command_toggle_folder_bar (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - EShellViewSubwindowMode mode; - gboolean show; - - shell_view = E_SHELL_VIEW (data); - - show = bonobo_ui_handler_menu_get_toggle_state (uih, path); - if (show) - mode = E_SHELL_VIEW_SUBWINDOW_STICKY; - else - mode = E_SHELL_VIEW_SUBWINDOW_HIDDEN; - - e_shell_view_set_folder_bar_mode (shell_view, mode); -} - -static void -command_toggle_shortcut_bar (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - EShellViewSubwindowMode mode; - gboolean show; - - shell_view = E_SHELL_VIEW (data); - - show = bonobo_ui_handler_menu_get_toggle_state (uih, path); - - if (show) - mode = E_SHELL_VIEW_SUBWINDOW_STICKY; - else - mode = E_SHELL_VIEW_SUBWINDOW_HIDDEN; - - e_shell_view_set_shortcut_bar_mode (shell_view, mode); -} - - -static void -command_new_folder (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - EShell *shell; - const char *current_uri; - const char *default_parent_folder; - - shell_view = E_SHELL_VIEW (data); - shell = e_shell_view_get_shell (shell_view); - current_uri = e_shell_view_get_current_uri (shell_view); - - if (strncmp (current_uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0) - default_parent_folder = current_uri + E_SHELL_URI_PREFIX_LEN; - else - default_parent_folder = NULL; - - e_shell_show_folder_creation_dialog (shell, GTK_WINDOW (shell_view), - default_parent_folder); -} - -static void -command_new_view (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - EShell *shell; - const char *current_uri; - - shell_view = E_SHELL_VIEW (data); - shell = e_shell_view_get_shell (shell_view); - current_uri = e_shell_view_get_current_uri (shell_view); - - e_shell_new_view (shell, current_uri); -} - - -/* Going to a folder. */ - -static void -folder_selection_dialog_cancelled_cb (EShellFolderSelectionDialog *folder_selection_dialog, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); -} - -static void -folder_selection_dialog_folder_selected_cb (EShellFolderSelectionDialog *folder_selection_dialog, - const char *path, - void *data) -{ - if (path != NULL) { - EShellView *shell_view; - char *uri; - - shell_view = E_SHELL_VIEW (data); - - uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - e_shell_view_display_uri (shell_view, uri); - g_free (uri); - } -} - -static void -command_goto_folder (BonoboUIHandler *uih, - void *data, - const char *path) -{ - GtkWidget *folder_selection_dialog; - EShellView *shell_view; - EShell *shell; - const char *current_uri; - - shell_view = E_SHELL_VIEW (data); - shell = e_shell_view_get_shell (shell_view); - - current_uri = e_shell_view_get_current_uri (shell_view); - - folder_selection_dialog = e_shell_folder_selection_dialog_new (shell, - _("Go to folder..."), - current_uri, - NULL); - - gtk_window_set_transient_for (GTK_WINDOW (folder_selection_dialog), GTK_WINDOW (shell_view)); - - gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "folder_selected", - GTK_SIGNAL_FUNC (folder_selection_dialog_folder_selected_cb), shell_view); - gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "cancelled", - GTK_SIGNAL_FUNC (folder_selection_dialog_cancelled_cb), shell_view); - - gtk_widget_show (folder_selection_dialog); -} - -static void -command_create_folder (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - EShell *shell; - const char *current_uri; - const char *default_folder; - - shell_view = E_SHELL_VIEW (data); - shell = e_shell_view_get_shell (shell_view); - - current_uri = e_shell_view_get_current_uri (shell_view); - - if (strncmp (current_uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0) - default_folder = current_uri + E_SHELL_URI_PREFIX_LEN; - else - default_folder = NULL; - - e_shell_show_folder_creation_dialog (shell, GTK_WINDOW (shell_view), default_folder); -} - - -/* Unimplemented commands. */ - -#define DEFINE_UNIMPLEMENTED(func) \ -static void \ -func (BonoboUIHandler *uih, void *data, const char *path) \ -{ \ - g_warning ("EShellView: %s: not implemented.", __FUNCTION__); \ -} \ - -DEFINE_UNIMPLEMENTED (command_new_shortcut) -DEFINE_UNIMPLEMENTED (command_new_mail_message) -DEFINE_UNIMPLEMENTED (command_new_contact) -DEFINE_UNIMPLEMENTED (command_new_task_request) - - -static void -menu_create_file_new (BonoboUIHandler *uih, - void *data) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/File/New", - _("_New"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); - - bonobo_ui_handler_menu_new_item (uih, "/File/New/View", - _("_View"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 'v', GDK_CONTROL_MASK | GDK_SHIFT_MASK, - command_new_view, data); - bonobo_ui_handler_menu_new_item (uih, "/File/New/View", - _("_Folder"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 'f', GDK_CONTROL_MASK | GDK_SHIFT_MASK, - command_new_folder, data); - bonobo_ui_handler_menu_new_item (uih, "/File/New/Evolution bar shortcut", - _("Evolution bar _shortcut"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 's', GDK_CONTROL_MASK | GDK_SHIFT_MASK, - command_new_shortcut, data); - - bonobo_ui_handler_menu_new_separator (uih, "/File/New/Separator1", -1); - - bonobo_ui_handler_menu_new_item (uih, "/File/New/Mail message", - _("_Mail message (FIXME)"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 'm', GDK_CONTROL_MASK | GDK_SHIFT_MASK, - command_new_mail_message, data); - bonobo_ui_handler_menu_new_item (uih, "/File/New/Appointment", - _("_Appointment (FIXME)"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 'a', GDK_CONTROL_MASK | GDK_SHIFT_MASK, - command_new_shortcut, data); - bonobo_ui_handler_menu_new_item (uih, "/File/New/Contact", - _("_Contact (FIXME)"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 'c', GDK_CONTROL_MASK | GDK_SHIFT_MASK, - command_new_contact, data); - bonobo_ui_handler_menu_new_item (uih, "/File/New/Contact", - _("_Task (FIXME)"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 't', GDK_CONTROL_MASK | GDK_SHIFT_MASK, - command_new_task_request, data); -} - -static void -menu_create_file (BonoboUIHandler *uih, - void *data) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/File", - _("_File"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); - - menu_create_file_new (uih, data); - - bonobo_ui_handler_menu_new_separator (uih, "/File/Separator1", -1); - - bonobo_ui_handler_menu_new_item (uih, "/File/Go to folder", - _("_Go to Folder..."), - _("Display a different folder"), - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_goto_folder, data); - - bonobo_ui_handler_menu_new_item (uih, "/File/Create new folder", - _("_Create New Folder..."), - _("Create a new folder"), - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_create_folder, data); - - bonobo_ui_handler_menu_new_placeholder (uih, "/File/<Print Placeholder>"); - - bonobo_ui_handler_menu_new_separator (uih, "/File/Separator2", -1); - - bonobo_ui_handler_menu_new_item (uih, "/File/Exit", - _("E_xit..."), - _("Create a new folder"), - -1, - BONOBO_UI_HANDLER_PIXMAP_STOCK, - GNOME_STOCK_MENU_EXIT, - 0, 0, - command_quit, data); -} - -static void -menu_create_edit (BonoboUIHandler *uih, - void *data) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/Edit", - _("_Edit"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); -} - -static void -menu_create_view (BonoboUIHandler *uih, - void *data) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/View", - _("_View"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); - - bonobo_ui_handler_menu_new_toggleitem (uih, "/View/Show shortcut bar", - _("Show _Shortcut Bar"), - _("Show the shortcut bar"), - -1, - 0, 0, - command_toggle_shortcut_bar, data); - bonobo_ui_handler_menu_new_toggleitem (uih, "/View/Show folder bar", - _("Show _Folder Bar"), - _("Show the folder bar"), - -1, - 0, 0, - command_toggle_folder_bar, data); -} - -static void -menu_create_settings (BonoboUIHandler *uih, - void *data) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/Settings", - _("_Settings"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); -} - -static void -menu_create_help (BonoboUIHandler *uih, - void *data) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/Help", - _("_Help"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); - - bonobo_ui_handler_menu_new_item (uih, "/Help/Help index", - _("Help _Index"), - NULL, - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_help, "index.html"); - bonobo_ui_handler_menu_new_item (uih, "/Help/Getting started", - _("Getting _Started"), - NULL, - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_help, "usage-mainwindow.html"); - bonobo_ui_handler_menu_new_item (uih, "/Help/Using the mailer", - _("Using the _Mailer"), - NULL, - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_help, "usage-mail.html"); - bonobo_ui_handler_menu_new_item (uih, "/Help/Using the calendar", - _("Using the _Calendar"), - NULL, - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_help, "usage-calendar.html"); - bonobo_ui_handler_menu_new_item (uih, "/Help/Using the contact manager", - _("Using the C_ontact Manager"), - NULL, - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_help, "usage-contact.html"); - - bonobo_ui_handler_menu_new_separator (uih, "/Help/Separator1", -1); - - bonobo_ui_handler_menu_new_item (uih, "/Help/Submit bug report", - _("_Submit Bug Report"), - _("Submit bug report using Bug Buddy"), - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_run_bugbuddy, data); - - bonobo_ui_handler_menu_new_separator (uih, "/Help/Separator2", -1); - - bonobo_ui_handler_menu_new_item (uih, "/Help/About Evolution", - _("_About Evolution..."), - _("Show information about Evolution"), - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - command_about_box, data); -} - - -/* FIXME these must match the corresponding setup in the GnomeUIInfo and this sucks sucks. */ -#define SHORTCUT_BAR_TOGGLE_PATH "/View/Show shortcut bar" -#define FOLDER_BAR_TOGGLE_PATH "/View/Show folder bar" - -void -e_shell_view_menu_setup (EShellView *shell_view) -{ - BonoboUIHandler *uih; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - uih = e_shell_view_get_bonobo_ui_handler (shell_view); - - menu_create_file (uih, shell_view); - menu_create_edit (uih, shell_view); - menu_create_view (uih, shell_view); - menu_create_settings (uih, shell_view); - - bonobo_ui_handler_menu_new_placeholder (uih, "/<Component Placeholder>"); - - menu_create_help (uih, shell_view); - - gtk_signal_connect (GTK_OBJECT (shell_view), "shortcut_bar_mode_changed", - GTK_SIGNAL_FUNC (shortcut_bar_mode_changed_cb), - SHORTCUT_BAR_TOGGLE_PATH); - gtk_signal_connect (GTK_OBJECT (shell_view), "folder_bar_mode_changed", - GTK_SIGNAL_FUNC (folder_bar_mode_changed_cb), - FOLDER_BAR_TOGGLE_PATH); - - /* Initialize the toggles. Yeah, this is, well, yuck. */ - - folder_bar_mode_changed_cb (shell_view, e_shell_view_get_folder_bar_mode (shell_view), - FOLDER_BAR_TOGGLE_PATH); - shortcut_bar_mode_changed_cb (shell_view, e_shell_view_get_shortcut_bar_mode (shell_view), - SHORTCUT_BAR_TOGGLE_PATH); -} diff --git a/shell/e-shell-view-menu.h b/shell/e-shell-view-menu.h deleted file mode 100644 index fb86cb9e98..0000000000 --- a/shell/e-shell-view-menu.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-view.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: - * Miguel de Icaza - * Ettore Perazzoli - */ - -#ifndef E_SHELL_VIEW_MENU_H -#define E_SHELL_VIEW_MENU_H - -#include <bonobo/bonobo-ui-handler.h> - -#include "e-shell-view.h" - -void e_shell_view_menu_setup (EShellView *shell_view); - -#endif diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c deleted file mode 100644 index c7bc911aad..0000000000 --- a/shell/e-shell-view.c +++ /dev/null @@ -1,1379 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-view.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: - * Ettore Perazzoli <ettore@helixcode.com> - * Miguel de Icaza <miguel@helixcode.com> - * Matt Loper <matt@helixcode.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> -#include <bonobo.h> -#include <libgnomeui/gnome-window-icon.h> - -#include "widgets/misc/e-clipped-label.h" -#include "e-util/e-util.h" -#include "e-util/e-gui-utils.h" - -#include "evolution-shell-view.h" - -#include "e-shell-constants.h" -#include "e-shell-folder-title-bar.h" -#include "e-shell-utils.h" -#include "e-shell.h" -#include "e-shortcuts-view.h" -#include "e-storage-set-view.h" -#include "e-title-bar.h" - -#include "e-shell-view.h" -#include "e-shell-view-menu.h" - -#include <widgets/e-paned/e-hpaned.h> - - -#define PARENT_TYPE gnome_app_get_type () /* Losing GnomeApp does not define GNOME_TYPE_APP. */ -static GnomeAppClass *parent_class = NULL; - -struct _EShellViewPrivate { - /* The shell. */ - EShell *shell; - - /* The UI handler. */ - BonoboUIHandler *uih; - - /* Currently displayed URI. */ - char *uri; - - /* The widgetry. */ - GtkWidget *appbar; - GtkWidget *hpaned; - GtkWidget *view_vbox; - GtkWidget *view_title_bar; - GtkWidget *view_hpaned; - GtkWidget *contents; - GtkWidget *notebook; - GtkWidget *shortcut_bar; - GtkWidget *storage_set_title_bar; - GtkWidget *storage_set_view; - GtkWidget *storage_set_view_box; - - /* The view we have already open. */ - GHashTable *uri_to_control; - - /* Position of the handles in the paneds, to be restored when we show elements - after hiding them. */ - unsigned int hpaned_position; - unsigned int view_hpaned_position; - - /* Status of the shortcut and folder bars. */ - EShellViewSubwindowMode shortcut_bar_mode; - EShellViewSubwindowMode folder_bar_mode; - - /* Timeout ID for the progress bar. */ - int progress_bar_timeout_id; - - /* Status of the progress bar. */ - int progress_bar_value; -}; - -enum { - SHORTCUT_BAR_MODE_CHANGED, - FOLDER_BAR_MODE_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -#define DEFAULT_SHORTCUT_BAR_WIDTH 100 -#define DEFAULT_TREE_WIDTH 130 - -#define DEFAULT_WIDTH 705 -#define DEFAULT_HEIGHT 550 - - -/* Utility functions. */ - -static GtkWidget * -create_label_for_empty_page (void) -{ - GtkWidget *label; - - label = e_clipped_label_new (_("(No folder displayed)")); - gtk_widget_show (label); - - return label; -} - -/* FIXME this is broken. */ -static gboolean -bonobo_widget_is_dead (BonoboWidget *bonobo_widget) -{ - BonoboControlFrame *control_frame; - CORBA_Object corba_object; - CORBA_Environment ev; - gboolean is_dead; - - control_frame = bonobo_widget_get_control_frame (bonobo_widget); - corba_object = bonobo_control_frame_get_control (control_frame); - - CORBA_exception_init (&ev); - is_dead = CORBA_Object_non_existent (corba_object, &ev); - CORBA_exception_free (&ev); - - return is_dead; -} - - -/* Folder bar pop-up handling. */ - -static void disconnect_popup_signals (EShellView *shell_view); - -static void -storage_set_view_box_button_release_event_cb (GtkWidget *widget, - GdkEventButton *button_event, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - gdk_pointer_ungrab (GDK_CURRENT_TIME); - gtk_grab_remove (priv->storage_set_view_box); - - e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_HIDDEN); - - disconnect_popup_signals (shell_view); - - e_shell_folder_title_bar_set_toggle_state (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), FALSE); -} - -static void -popup_storage_set_view_close_button_clicked (ETitleBar *title_bar, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - gdk_pointer_ungrab (GDK_CURRENT_TIME); - gtk_grab_remove (priv->storage_set_view_box); - - disconnect_popup_signals (shell_view); - - e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_STICKY); - e_shell_folder_title_bar_set_toggle_state (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), FALSE); -} - -static void -storage_set_view_box_map_cb (GtkWidget *widget, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - if ((gdk_pointer_grab (widget->window, TRUE, - (GDK_BUTTON_PRESS_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK - | GDK_LEAVE_NOTIFY_MASK - | GDK_POINTER_MOTION_MASK), - NULL, NULL, GDK_CURRENT_TIME) != 0)) { - g_warning ("%s -- pointer grab failed.", __FUNCTION__); - e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_STICKY); - return; - } - - gtk_grab_add (widget); - gtk_signal_connect (GTK_OBJECT (widget), "button_release_event", - GTK_SIGNAL_FUNC (storage_set_view_box_button_release_event_cb), shell_view); - gtk_signal_connect (GTK_OBJECT (priv->storage_set_view), "button_release_event", - GTK_SIGNAL_FUNC (storage_set_view_box_button_release_event_cb), shell_view); - gtk_signal_connect (GTK_OBJECT (priv->storage_set_title_bar), "close_button_clicked", - GTK_SIGNAL_FUNC (popup_storage_set_view_close_button_clicked), shell_view); -} - -static void -disconnect_popup_signals (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - gtk_signal_disconnect_by_func (GTK_OBJECT (priv->storage_set_view_box), - GTK_SIGNAL_FUNC (storage_set_view_box_button_release_event_cb), - shell_view); - gtk_signal_disconnect_by_func (GTK_OBJECT (priv->storage_set_view), - GTK_SIGNAL_FUNC (storage_set_view_box_button_release_event_cb), - shell_view); - gtk_signal_disconnect_by_func (GTK_OBJECT (priv->storage_set_title_bar), - GTK_SIGNAL_FUNC (popup_storage_set_view_close_button_clicked), - shell_view); - gtk_signal_disconnect_by_func (GTK_OBJECT (priv->storage_set_view_box), - GTK_SIGNAL_FUNC (storage_set_view_box_map_cb), - shell_view); -} - -static void -pop_up_folder_bar (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - priv->folder_bar_mode = E_SHELL_VIEW_SUBWINDOW_TRANSIENT; - - /* We need to show the storage set view box and do a pointer grab to catch the - mouse clicks. But until the box is shown, we cannot grab. So we connect to - the "map" signa; `storage_set_view_box_map_cb' will do the grab. */ - - gtk_signal_connect (GTK_OBJECT (priv->storage_set_view_box), "map", - GTK_SIGNAL_FUNC (storage_set_view_box_map_cb), shell_view); - gtk_widget_show (priv->storage_set_view_box); - - e_paned_set_position (E_PANED (priv->view_hpaned), priv->view_hpaned_position); -} - - -/* Callbacks. */ - -/* Callback called when an icon on the shortcut bar gets clicked. */ -static void -activate_shortcut_cb (EShortcutsView *shortcut_view, - EShortcuts *shortcuts, - const char *uri, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - e_shell_view_display_uri (shell_view, uri); -} - -/* Callback called when a folder on the tree view gets clicked. */ -static void -folder_selected_cb (EStorageSetView *storage_set_view, - const char *path, - void *data) -{ - EShellView *shell_view; - char *uri; - - shell_view = E_SHELL_VIEW (data); - - uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - e_shell_view_display_uri (shell_view, uri); - g_free (uri); -} - -/* Callback called when the close button on the tree's title bar is clicked. */ -static void -storage_set_view_close_button_clicked_cb (ETitleBar *title_bar, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_HIDDEN); -} - -/* Callback called when the title bar button has been pressed. */ -static void -title_bar_toggled_cb (EShellFolderTitleBar *title_bar, - gboolean state, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - if (! state) - return; - - if (e_shell_view_get_folder_bar_mode (shell_view) != E_SHELL_VIEW_SUBWINDOW_TRANSIENT) - pop_up_folder_bar (shell_view); -} - - -/* Widget setup. */ - -static void -setup_storage_set_subwindow (EShellView *shell_view) -{ - EShellViewPrivate *priv; - GtkWidget *storage_set_view; - GtkWidget *vbox; - GtkWidget *scrolled_window; - - priv = shell_view->priv; - - storage_set_view = e_storage_set_view_new (e_shell_get_storage_set (priv->shell)); - gtk_signal_connect (GTK_OBJECT (storage_set_view), "folder_selected", - GTK_SIGNAL_FUNC (folder_selected_cb), shell_view); - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_container_add (GTK_CONTAINER (scrolled_window), storage_set_view); - - vbox = gtk_vbox_new (FALSE, 0); - priv->storage_set_title_bar = e_title_bar_new (_("Folders")); - - gtk_box_pack_start (GTK_BOX (vbox), priv->storage_set_title_bar, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0); - - gtk_signal_connect (GTK_OBJECT (priv->storage_set_title_bar), "close_button_clicked", - GTK_SIGNAL_FUNC (storage_set_view_close_button_clicked_cb), shell_view); - - gtk_widget_show (vbox); - gtk_widget_show (storage_set_view); - gtk_widget_show (priv->storage_set_title_bar); - gtk_widget_show (scrolled_window); - - priv->storage_set_view_box = vbox; - priv->storage_set_view = storage_set_view; -} - -static void -setup_widgets (EShellView *shell_view) -{ - EShellViewPrivate *priv; - GtkWidget *progress_bar; - - priv = shell_view->priv; - - /* The application bar. */ - - priv->appbar = gnome_appbar_new (TRUE, TRUE, GNOME_PREFERENCES_NEVER); - gnome_app_set_statusbar (GNOME_APP (shell_view), priv->appbar); - - /* The progress bar. */ - - progress_bar = GNOME_APPBAR (GNOME_APP (shell_view)->statusbar)->progress; - - gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (progress_bar), GTK_PROGRESS_LEFT_TO_RIGHT); - gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (progress_bar), GTK_PROGRESS_CONTINUOUS); - - /* The shortcut bar. */ - - priv->shortcut_bar = e_shortcuts_new_view (e_shell_get_shortcuts (priv->shell)); - gtk_signal_connect (GTK_OBJECT (priv->shortcut_bar), "activate_shortcut", - GTK_SIGNAL_FUNC (activate_shortcut_cb), shell_view); - - /* The storage set view. */ - - setup_storage_set_subwindow (shell_view); - - /* The tabless notebook which we used to contain the views. */ - - priv->notebook = gtk_notebook_new (); - gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE); - - /* Page for "No URL displayed" message. */ - - gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), create_label_for_empty_page (), NULL); - - /* Put things into a paned and the paned into the GnomeApp. */ - - priv->view_vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (priv->view_vbox), 2); - - priv->view_title_bar = e_shell_folder_title_bar_new (); - gtk_signal_connect (GTK_OBJECT (priv->view_title_bar), "title_toggled", - GTK_SIGNAL_FUNC (title_bar_toggled_cb), shell_view); - - priv->view_hpaned = e_hpaned_new (); - e_paned_add1 (E_PANED (priv->view_hpaned), priv->storage_set_view_box); - e_paned_add2 (E_PANED (priv->view_hpaned), priv->notebook); - e_paned_set_position (E_PANED (priv->view_hpaned), DEFAULT_TREE_WIDTH); - - gtk_box_pack_start (GTK_BOX (priv->view_vbox), priv->view_title_bar, - FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (priv->view_vbox), priv->view_hpaned, - TRUE, TRUE, 2); - - priv->hpaned = e_hpaned_new (); - e_paned_add1 (E_PANED (priv->hpaned), priv->shortcut_bar); - e_paned_add2 (E_PANED (priv->hpaned), priv->view_vbox); - e_paned_set_position (E_PANED (priv->hpaned), DEFAULT_SHORTCUT_BAR_WIDTH); - - gnome_app_set_contents (GNOME_APP (shell_view), priv->hpaned); - - /* Show stuff. */ - - gtk_widget_show (priv->shortcut_bar); - gtk_widget_show (priv->storage_set_view); - gtk_widget_show (priv->storage_set_view_box); - gtk_widget_show (priv->notebook); - gtk_widget_show (priv->hpaned); - gtk_widget_show (priv->view_hpaned); - gtk_widget_show (priv->view_vbox); - gtk_widget_show (priv->view_title_bar); - - /* By default, both the folder bar and shortcut bar are visible. */ - priv->shortcut_bar_mode = E_SHELL_VIEW_SUBWINDOW_STICKY; - priv->folder_bar_mode = E_SHELL_VIEW_SUBWINDOW_STICKY; - - /* FIXME: Session management and stuff? */ - gtk_window_set_default_size (GTK_WINDOW (shell_view), DEFAULT_WIDTH, DEFAULT_HEIGHT); -} - - -/* BonoboUIHandler setup. */ - -static void -setup_bonobo_ui_handler (EShellView *shell_view) -{ - BonoboUIHandler *uih; - EShellViewPrivate *priv; - - priv = shell_view->priv; - - uih = bonobo_ui_handler_new (); - - bonobo_ui_handler_set_app (uih, GNOME_APP (shell_view)); - bonobo_ui_handler_create_menubar (uih); - /* bonobo_ui_handler_create_toolbar (uih, "Toolbar"); */ - bonobo_ui_handler_set_statusbar (uih, priv->appbar); - - priv->uih = uih; -} - - -/* GtkObject methods. */ - -static void -hash_forall_destroy_control (void *name, - void *value, - void *data) -{ - BonoboWidget *bonobo_widget; - - bonobo_widget = BONOBO_WIDGET (value); - gtk_widget_destroy (GTK_WIDGET (bonobo_widget)); - - g_free (name); -} - -static void -destroy (GtkObject *object) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (object); - priv = shell_view->priv; - - g_hash_table_foreach (priv->uri_to_control, hash_forall_destroy_control, NULL); - g_hash_table_destroy (priv->uri_to_control); - - bonobo_object_unref (BONOBO_OBJECT (priv->uih)); - - g_free (priv->uri); - - if (priv->progress_bar_timeout_id != 0) - gtk_timeout_remove (priv->progress_bar_timeout_id); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - -/* Unrealize handler */ -static void -unrealize (GtkWidget *widget) -{ - if (GTK_WIDGET_CLASS (parent_class)->unrealize) - (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); - - /* We flush so that all the destroy window requests for foreign windows - * get sent over the X wire. Hopefully this will diminish the chance of - * hitting the CORBA (sync) vs. Xlib (async) race conditions. This is - * not the complete fix, which should actually be put in Bonobo and - * completed. FIXME. - */ - gdk_flush (); -} - -static int -delete_event (GtkWidget *widget, - GdkEventAny *event) -{ - EShellView *shell_view; - EShell *shell; - - shell_view = E_SHELL_VIEW (widget); - - shell = e_shell_view_get_shell (shell_view); - e_shell_quit (shell); - /* FIXME: Is this right, or should it be FALSE? */ - return TRUE; -} - - -/* Initialization. */ - -static void -class_init (EShellViewClass *klass) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = (GtkObjectClass *) klass; - widget_class = (GtkWidgetClass *) klass; - - object_class->destroy = destroy; - - widget_class->unrealize = unrealize; - widget_class->delete_event = delete_event; - - parent_class = gtk_type_class (gnome_app_get_type ()); - - signals[SHORTCUT_BAR_MODE_CHANGED] - = gtk_signal_new ("shortcut_bar_mode_changed", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EShellViewClass, shortcut_bar_mode_changed), - gtk_marshal_NONE__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - signals[FOLDER_BAR_MODE_CHANGED] - = gtk_signal_new ("folder_bar_mode_changed", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EShellViewClass, folder_bar_mode_changed), - gtk_marshal_NONE__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = g_new (EShellViewPrivate, 1); - - priv->shell = NULL; - priv->uih = NULL; - priv->uri = NULL; - - priv->appbar = NULL; - priv->hpaned = NULL; - priv->view_hpaned = NULL; - priv->contents = NULL; - priv->notebook = NULL; - - priv->storage_set_title_bar = NULL; - priv->storage_set_view = NULL; - priv->storage_set_view_box = NULL; - priv->shortcut_bar = NULL; - - priv->shortcut_bar_mode = E_SHELL_VIEW_SUBWINDOW_HIDDEN; - priv->folder_bar_mode = E_SHELL_VIEW_SUBWINDOW_HIDDEN; - - priv->hpaned_position = 0; - priv->view_hpaned_position = 0; - - priv->uri_to_control = g_hash_table_new (g_str_hash, g_str_equal); - - priv->progress_bar_timeout_id = 0; - priv->progress_bar_value = 0; - - shell_view->priv = priv; -} - - -/* Progress bar handling. */ - -#define PROGRESS_BAR_TIMEOUT 80 - -static int -progress_bar_timeout_cb (void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - GtkWidget *progress_bar; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - progress_bar = GNOME_APPBAR (GNOME_APP (shell_view)->statusbar)->progress; - - priv->progress_bar_value = ! priv->progress_bar_value; - gtk_progress_set_value (GTK_PROGRESS (progress_bar), priv->progress_bar_value); - - return TRUE; -} - -static void -start_progress_bar (EShellView *shell_view) -{ - EShellViewPrivate *priv; - GtkWidget *progress_bar; - - priv = shell_view->priv; - progress_bar = GNOME_APPBAR (GNOME_APP (shell_view)->statusbar)->progress; - - if (priv->progress_bar_timeout_id != 0) - return; - - priv->progress_bar_timeout_id = gtk_timeout_add (PROGRESS_BAR_TIMEOUT, - progress_bar_timeout_cb, - shell_view); - - gtk_progress_set_activity_mode (GTK_PROGRESS (progress_bar), TRUE); - gtk_progress_set_value (GTK_PROGRESS (progress_bar), priv->progress_bar_value); -} - -static void -stop_progress_bar (EShellView *shell_view) -{ - EShellViewPrivate *priv; - GtkWidget *progress_bar; - - priv = shell_view->priv; - progress_bar = GNOME_APPBAR (GNOME_APP (shell_view)->statusbar)->progress; - - if (priv->progress_bar_timeout_id != 0) { - gtk_timeout_remove (priv->progress_bar_timeout_id); - priv->progress_bar_timeout_id = 0; - } - - gtk_progress_set_activity_mode (GTK_PROGRESS (progress_bar), FALSE); - gtk_progress_set_value (GTK_PROGRESS (progress_bar), 0); -} - - -/* EvolutionShellView interface callbacks. */ - -static void -shell_view_interface_set_message_cb (EvolutionShellView *shell_view, - const char *message, - gboolean busy, - void *data) -{ - GnomeApp *app; - GnomeAppBar *app_bar; - - app = GNOME_APP (data); - app_bar = GNOME_APPBAR (app->statusbar); - - gtk_progress_set_value (GTK_PROGRESS (app_bar->progress), 1.0); - - if (message != NULL) - gnome_appbar_set_status (app_bar, message); - else - gnome_appbar_set_status (app_bar, ""); - - if (busy) - start_progress_bar (E_SHELL_VIEW (data)); - else - stop_progress_bar (E_SHELL_VIEW (data)); -} - -static void -shell_view_interface_unset_message_cb (EvolutionShellView *shell_view, - void *data) -{ - GnomeApp *app; - GnomeAppBar *app_bar; - - app = GNOME_APP (data); - app_bar = GNOME_APPBAR (app->statusbar); - - gnome_appbar_set_status (app_bar, ""); - - stop_progress_bar (E_SHELL_VIEW (data)); -} - - -void -e_shell_view_construct (EShellView *shell_view, - EShell *shell) -{ - EShellViewPrivate *priv; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - - priv = shell_view->priv; - - gnome_app_construct (GNOME_APP (shell_view), "evolution", "Evolution"); - - priv->shell = shell; - - setup_widgets (shell_view); - setup_bonobo_ui_handler (shell_view); - - e_shell_view_menu_setup (shell_view); - - e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_HIDDEN); -} - -GtkWidget * -e_shell_view_new (EShell *shell) -{ - GtkWidget *new; - - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - new = gtk_type_new (e_shell_view_get_type ()); - e_shell_view_construct (E_SHELL_VIEW (new), shell); - - return new; -} - - -static const char * -get_storage_set_path_from_uri (const char *uri) -{ - const char *colon; - - if (uri == NULL) - return NULL; - - if (g_path_is_absolute (uri)) - return NULL; - - colon = strchr (uri, ':'); - if (colon == NULL || colon == uri || colon[1] == '\0') - return NULL; - - if (! g_path_is_absolute (colon + 1)) - return NULL; - - if (g_strncasecmp (uri, E_SHELL_URI_PREFIX, colon - uri) != 0) - return NULL; - - return colon + 1; -} - -static void -update_window_icon (EShellView *shell_view, - EFolder *folder) -{ - EShellViewPrivate *priv; - const char *type; - const char *icon_name; - char *icon_path; - - priv = shell_view->priv; - - if (folder == NULL) - type = NULL; - else - type = e_folder_get_type_string (folder); - - if (type == NULL) { - icon_path = NULL; - } else { - EFolderTypeRegistry *folder_type_registry; - - folder_type_registry = e_shell_get_folder_type_registry (priv->shell); - icon_name = e_folder_type_registry_get_icon_name_for_type (folder_type_registry, type); - if (icon_name == NULL) - icon_path = NULL; - else - icon_path = e_shell_get_icon_path (icon_name, TRUE); - } - - if (icon_path == NULL) { - gnome_window_icon_set_from_default (GTK_WINDOW (shell_view)); - } else { - gnome_window_icon_set_from_file (GTK_WINDOW (shell_view), icon_path); - g_free (icon_path); - } -} - -static void -update_folder_title_bar (EShellView *shell_view, - EFolder *folder) -{ - EShellViewPrivate *priv; - EFolderTypeRegistry *folder_type_registry; - GdkPixbuf *folder_icon; - const char *folder_name; - const char *folder_type_name; - - priv = shell_view->priv; - - if (folder == NULL) - folder_type_name = NULL; - else - folder_type_name = e_folder_get_type_string (folder); - - if (folder_type_name == NULL) { - folder_name = NULL; - folder_icon = NULL; - } else { - folder_type_registry = e_shell_get_folder_type_registry (priv->shell); - folder_icon = e_folder_type_registry_get_icon_for_type (folder_type_registry, - folder_type_name, - TRUE); - folder_name = e_folder_get_name (folder); - } - - e_shell_folder_title_bar_set_icon (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), folder_icon); - e_shell_folder_title_bar_set_title (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), folder_name); -} - -static void -update_for_current_uri (EShellView *shell_view) -{ - EShellViewPrivate *priv; - EFolder *folder; - const char *folder_name; - const char *path; - char *window_title; - - priv = shell_view->priv; - - path = get_storage_set_path_from_uri (priv->uri); - - if (path == NULL) - folder = NULL; - else - folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), - path); - - if (folder == NULL) - folder_name = _("None"); - else - folder_name = e_folder_get_name (folder); - - window_title = g_strdup_printf (_("Evolution - %s"), folder_name); - gtk_window_set_title (GTK_WINDOW (shell_view), window_title); - g_free (window_title); - - update_folder_title_bar (shell_view, folder); - - update_window_icon (shell_view, folder); - - gtk_signal_handler_block_by_func (GTK_OBJECT (priv->storage_set_view), - GTK_SIGNAL_FUNC (folder_selected_cb), - shell_view); - e_storage_set_view_set_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view), - path); - gtk_signal_handler_unblock_by_func (GTK_OBJECT (priv->storage_set_view), - GTK_SIGNAL_FUNC (folder_selected_cb), - shell_view); -} - -/* This displays the specified page, doing the appropriate Bonobo activation/deactivation - magic to make sure things work nicely. FIXME: Crappy way to solve the issue. */ -static void -set_current_notebook_page (EShellView *shell_view, - int page_num) -{ - EShellViewPrivate *priv; - GtkNotebook *notebook; - GtkWidget *current; - BonoboControlFrame *control_frame; - int current_page; - - priv = shell_view->priv; - notebook = GTK_NOTEBOOK (priv->notebook); - - current_page = gtk_notebook_get_current_page (notebook); - if (current_page == page_num) - return; - - if (current_page != -1 && current_page != 0) { - current = gtk_notebook_get_nth_page (notebook, current_page); - control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (current)); - - bonobo_control_frame_set_autoactivate (control_frame, FALSE); - bonobo_control_frame_control_deactivate (control_frame); - } - - gtk_notebook_set_page (notebook, page_num); - - if (page_num == -1 || page_num == 0) - return; - - current = gtk_notebook_get_nth_page (notebook, page_num); - control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (current)); - - bonobo_control_frame_set_autoactivate (control_frame, FALSE); - bonobo_control_frame_control_activate (control_frame); -} - -static void -setup_evolution_shell_view_interface (EShellView *shell_view, - GtkWidget *control) -{ - BonoboControlFrame *control_frame; - EvolutionShellView *shell_view_interface; - - control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (control)); - shell_view_interface = evolution_shell_view_new (); - - gtk_signal_connect_while_alive (GTK_OBJECT (shell_view_interface), "set_message", - GTK_SIGNAL_FUNC (shell_view_interface_set_message_cb), - shell_view, GTK_OBJECT (shell_view)); - gtk_signal_connect_while_alive (GTK_OBJECT (shell_view_interface), "unset_message", - GTK_SIGNAL_FUNC (shell_view_interface_unset_message_cb), - shell_view, GTK_OBJECT (shell_view)); - - bonobo_object_add_interface (BONOBO_OBJECT (control_frame), - BONOBO_OBJECT (shell_view_interface)); -} - -/* Create a new view for @uri with @control. It assumes a view for @uri does not exist yet. */ -static GtkWidget * -get_control_for_uri (EShellView *shell_view, - const char *uri) -{ - EShellViewPrivate *priv; - EFolderTypeRegistry *folder_type_registry; - EStorageSet *storage_set; - EFolder *folder; - Bonobo_UIHandler corba_uih; - EvolutionShellComponentClient *handler_client; - Bonobo_Control corba_control; - Evolution_ShellComponent handler; - const char *path; - const char *folder_type; - GtkWidget *control; - CORBA_Environment ev; - - priv = shell_view->priv; - - path = strchr (uri, ':'); - if (path == NULL) - return NULL; - - path++; - if (*path == '\0') - return NULL; - - storage_set = e_shell_get_storage_set (priv->shell); - folder_type_registry = e_shell_get_folder_type_registry (priv->shell); - - folder = e_storage_set_get_folder (storage_set, path); - if (folder == NULL) - return NULL; - - folder_type = e_folder_get_type_string (folder); - if (folder_type == NULL) - return NULL; - - handler_client = e_folder_type_registry_get_handler_for_type (folder_type_registry, folder_type); - if (handler_client == NULL) - return NULL; - - handler = bonobo_object_corba_objref (BONOBO_OBJECT (handler_client)); - if (handler_client == CORBA_OBJECT_NIL) - return NULL; - - CORBA_exception_init (&ev); - - corba_control = Evolution_ShellComponent_create_view ( - handler, e_folder_get_physical_uri (folder), folder_type, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - corba_uih = bonobo_object_corba_objref (BONOBO_OBJECT (priv->uih)); - control = bonobo_widget_new_control_from_objref (corba_control, corba_uih); - - setup_evolution_shell_view_interface (shell_view, control); - - return control; -} - -static gboolean -show_existing_view (EShellView *shell_view, - const char *uri, - GtkWidget *control) -{ - EShellViewPrivate *priv; - int notebook_page; - - g_print ("Already have view for %s\n", uri); - - priv = shell_view->priv; - - notebook_page = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), control); - g_assert (notebook_page != -1); - - /* A BonoboWidget can be a "zombie" in the sense that its actual - control is dead; if it's zombie, we have to recreate it. */ - if (bonobo_widget_is_dead (BONOBO_WIDGET (control))) { - GtkWidget *parent; - Bonobo_UIHandler uih; - - parent = control->parent; - uih = bonobo_object_corba_objref (BONOBO_OBJECT (priv->uih)); - - /* Out with the old. */ - gtk_container_remove (GTK_CONTAINER (parent), control); - g_hash_table_remove (priv->uri_to_control, uri); - - /* In with the new. */ - control = get_control_for_uri (shell_view, uri); - if (control == NULL) - return FALSE; - - gtk_container_add (GTK_CONTAINER (parent), control); - g_hash_table_insert (priv->uri_to_control, g_strdup (uri), control); - - /* Show. */ - gtk_widget_show (control); - } - - set_current_notebook_page (shell_view, notebook_page); - - return TRUE; -} - -static gboolean -create_new_view_for_uri (EShellView *shell_view, - const char *uri) -{ - GtkWidget *control; - EShellViewPrivate *priv; - int page_num; - - priv = shell_view->priv; - - control = get_control_for_uri (shell_view, uri); - if (control == NULL) - return FALSE; - - gtk_widget_show (control); - - gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), control, NULL); - - page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), control); - g_assert (page_num != -1); - set_current_notebook_page (shell_view, page_num); - - g_hash_table_insert (priv->uri_to_control, g_strdup (uri), control); - - return TRUE; -} - -gboolean -e_shell_view_display_uri (EShellView *shell_view, - const char *uri) -{ - EShellViewPrivate *priv; - GtkWidget *control; - gboolean retval; - - g_return_val_if_fail (shell_view != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - - priv = shell_view->priv; - - if (uri == NULL) { - gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), 0); - gtk_notebook_prepend_page (GTK_NOTEBOOK (priv->notebook), - create_label_for_empty_page (), NULL); - - set_current_notebook_page (shell_view, 0); - - if (priv->uri != NULL) { - g_free (priv->uri); - priv->uri = NULL; - } - - retval = TRUE; - - goto end; - } - - if (strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) != 0) { - retval = FALSE; - goto end; - } - - control = g_hash_table_lookup (priv->uri_to_control, uri); - if (control != NULL) { - g_assert (GTK_IS_WIDGET (control)); - show_existing_view (shell_view, uri, control); - } else if (! create_new_view_for_uri (shell_view, uri)) { - retval = FALSE; - goto end; - } - - g_free (priv->uri); - priv->uri = g_strdup (uri); - - retval = TRUE; - - end: - update_for_current_uri (shell_view); - return retval; -} - - -void -e_shell_view_set_shortcut_bar_mode (EShellView *shell_view, - EShellViewSubwindowMode mode) -{ - EShellViewPrivate *priv; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (mode == E_SHELL_VIEW_SUBWINDOW_STICKY - || mode == E_SHELL_VIEW_SUBWINDOW_HIDDEN); - - priv = shell_view->priv; - - if (priv->shortcut_bar_mode == mode) - return; - - if (mode == E_SHELL_VIEW_SUBWINDOW_STICKY) { - if (! GTK_WIDGET_VISIBLE (priv->shortcut_bar)) { - gtk_widget_show (priv->shortcut_bar); - e_paned_set_position (E_PANED (priv->hpaned), priv->hpaned_position); - } - } else { - if (GTK_WIDGET_VISIBLE (priv->shortcut_bar)) { - gtk_widget_hide (priv->shortcut_bar); - /* FIXME this is a private field! */ - priv->hpaned_position = E_PANED (priv->hpaned)->child1_size; - e_paned_set_position (E_PANED (priv->hpaned), 0); - } - } - - priv->shortcut_bar_mode = mode; - - gtk_signal_emit (GTK_OBJECT (shell_view), signals[SHORTCUT_BAR_MODE_CHANGED], mode); -} - -/** - * e_shell_view_set_folder_bar_mode: - * @shell_view: - * @mode: - * - * Set the visualization mode for the folder bar's subwindow. - **/ -void -e_shell_view_set_folder_bar_mode (EShellView *shell_view, - EShellViewSubwindowMode mode) -{ - EShellViewPrivate *priv; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (mode == E_SHELL_VIEW_SUBWINDOW_STICKY - || mode == E_SHELL_VIEW_SUBWINDOW_HIDDEN); - - priv = shell_view->priv; - - if (priv->folder_bar_mode == mode) - return; - - if (mode == E_SHELL_VIEW_SUBWINDOW_STICKY) { - if (! GTK_WIDGET_VISIBLE (priv->storage_set_view_box)) { - gtk_widget_show (priv->storage_set_view_box); - e_paned_set_position (E_PANED (priv->view_hpaned), priv->view_hpaned_position); - } - - e_shell_folder_title_bar_set_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), - FALSE); - } else { - if (GTK_WIDGET_VISIBLE (priv->storage_set_view_box)) { - gtk_widget_hide (priv->storage_set_view_box); - /* FIXME this is a private field! */ - priv->view_hpaned_position = E_PANED (priv->view_hpaned)->child1_size; - e_paned_set_position (E_PANED (priv->view_hpaned), 0); - } - - e_shell_folder_title_bar_set_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), - TRUE); - } - - priv->folder_bar_mode = mode; - - gtk_signal_emit (GTK_OBJECT (shell_view), signals[FOLDER_BAR_MODE_CHANGED], mode); -} - -EShellViewSubwindowMode -e_shell_view_get_shortcut_bar_mode (EShellView *shell_view) -{ - g_return_val_if_fail (shell_view != NULL, E_SHELL_VIEW_SUBWINDOW_HIDDEN); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), E_SHELL_VIEW_SUBWINDOW_HIDDEN); - - return shell_view->priv->shortcut_bar_mode; -} - -EShellViewSubwindowMode -e_shell_view_get_folder_bar_mode (EShellView *shell_view) -{ - g_return_val_if_fail (shell_view != NULL, E_SHELL_VIEW_SUBWINDOW_HIDDEN); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), E_SHELL_VIEW_SUBWINDOW_HIDDEN); - - return shell_view->priv->folder_bar_mode; -} - - -EShell * -e_shell_view_get_shell (EShellView *shell_view) -{ - g_return_val_if_fail (shell_view != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - return shell_view->priv->shell; -} - -BonoboUIHandler * -e_shell_view_get_bonobo_ui_handler (EShellView *shell_view) -{ - g_return_val_if_fail (shell_view != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - return shell_view->priv->uih; -} - -GtkWidget * -e_shell_view_get_appbar (EShellView *shell_view) -{ - g_return_val_if_fail (shell_view != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - return shell_view->priv->appbar; -} - -const char * -e_shell_view_get_current_uri (EShellView *shell_view) -{ - g_return_val_if_fail (shell_view != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - return shell_view->priv->uri; -} - - -/** - * e_shell_view_save_settings: - * @shell_view: - * @prefix: - * - * Save settings for @shell_view at the specified gnome config @prefix - * - * Return value: TRUE if successful, FALSE if not. - **/ -gboolean -e_shell_view_save_settings (EShellView *shell_view, - const char *prefix) -{ - EShellViewPrivate *priv; - const char *uri; - - g_return_val_if_fail (shell_view != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - g_return_val_if_fail (prefix != NULL, FALSE); - - priv = shell_view->priv; - - gnome_config_push_prefix (prefix); - - gnome_config_set_int ("FolderBarMode", e_shell_view_get_folder_bar_mode (shell_view)); - gnome_config_set_int ("ShortcutBarMode", e_shell_view_get_shortcut_bar_mode (shell_view)); - gnome_config_set_int ("HPanedPosition", e_paned_get_position (E_PANED (priv->hpaned))); - gnome_config_set_int ("ViewHPanedPosition", e_paned_get_position (E_PANED (priv->view_hpaned))); - - uri = e_shell_view_get_current_uri (shell_view); - if (uri != NULL) - gnome_config_set_string ("DisplayedURI", uri); - else - gnome_config_clean_section ("DisplayedURI"); - - gnome_config_pop_prefix (); - - return TRUE; -} - -/** - * e_shell_view_load_settings: - * @shell_view: - * @prefix: - * - * Load settings for @shell_view at the specified gnome config @prefix - * - * Return value: - **/ -gboolean -e_shell_view_load_settings (EShellView *shell_view, - const char *prefix) -{ - EShellViewPrivate *priv; - int val; - char *stringval; - - g_return_val_if_fail (shell_view != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - g_return_val_if_fail (prefix != NULL, FALSE); - - priv = shell_view->priv; - - gnome_config_push_prefix (prefix); - - val = gnome_config_get_int ("FolderBarMode"); - e_shell_view_set_folder_bar_mode (shell_view, val); - - val = gnome_config_get_int ("ShortcutBarMode"); - e_shell_view_set_shortcut_bar_mode (shell_view, val); - - val = gnome_config_get_int ("HPanedPosition"); - e_paned_set_position (E_PANED (priv->hpaned), val); - - val = gnome_config_get_int ("ViewHPanedPosition"); - e_paned_set_position (E_PANED (priv->view_hpaned), val); - - stringval = gnome_config_get_string ("DisplayedURI"); - e_shell_view_display_uri (shell_view, stringval); - g_free (stringval); - - gnome_config_pop_prefix (); - - return TRUE; -} - - -E_MAKE_TYPE (e_shell_view, "EShellView", EShellView, class_init, init, PARENT_TYPE) diff --git a/shell/e-shell-view.h b/shell/e-shell-view.h deleted file mode 100644 index 69a0e5c22c..0000000000 --- a/shell/e-shell-view.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-view.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_SHELL_VIEW_H_ -#define _E_SHELL_VIEW_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <libgnomeui/gnome-app.h> -#include <bonobo/bonobo-ui-handler.h> - -#include "e-shell.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - - -#define E_TYPE_SHELL_VIEW (e_shell_view_get_type ()) -#define E_SHELL_VIEW(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_VIEW, EShellView)) -#define E_SHELL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_VIEW, EShellViewClass)) -#define E_IS_SHELL_VIEW(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_VIEW)) -#define E_IS_SHELL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_VIEW)) - -typedef struct _EShellView EShellView; -typedef struct _EShellViewPrivate EShellViewPrivate; -typedef struct _EShellViewClass EShellViewClass; - -enum _EShellViewSubwindowMode { - E_SHELL_VIEW_SUBWINDOW_HIDDEN, - E_SHELL_VIEW_SUBWINDOW_TRANSIENT, - E_SHELL_VIEW_SUBWINDOW_STICKY -}; -typedef enum _EShellViewSubwindowMode EShellViewSubwindowMode; - -struct _EShellView { - GnomeApp parent; - - EShellViewPrivate *priv; -}; - -struct _EShellViewClass { - GnomeAppClass parent_class; - - /* Signals. */ - void (* shortcut_bar_mode_changed) (EShellView *shell_view, EShellViewSubwindowMode new_mode); - void (* folder_bar_mode_changed) (EShellView *shell_view, EShellViewSubwindowMode mode); -}; - - -GtkType e_shell_view_get_type (void); -void e_shell_view_construct (EShellView *shell_view, - EShell *shell); -GtkWidget *e_shell_view_new (EShell *shell); - -gboolean e_shell_view_display_uri (EShellView *shell_view, - const char *uri); - -void e_shell_view_set_shortcut_bar_mode (EShellView *shell_view, - EShellViewSubwindowMode mode); -void e_shell_view_set_folder_bar_mode (EShellView *shell_view, - EShellViewSubwindowMode mode); -EShellViewSubwindowMode e_shell_view_get_shortcut_bar_mode (EShellView *shell_view); -EShellViewSubwindowMode e_shell_view_get_folder_bar_mode (EShellView *shell_view); - -EShell *e_shell_view_get_shell (EShellView *shell_view); -BonoboUIHandler *e_shell_view_get_bonobo_ui_handler (EShellView *shell_view); -GtkWidget *e_shell_view_get_appbar (EShellView *shell_view); -const char *e_shell_view_get_current_uri (EShellView *shell_view); - -gboolean e_shell_view_save_settings (EShellView *shell_view, - const char *prefix); -gboolean e_shell_view_load_settings (EShellView *shell_view, - const char *prefix); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHELL_VIEW_H_ */ diff --git a/shell/e-shell.c b/shell/e-shell.c deleted file mode 100644 index 26a556de96..0000000000 --- a/shell/e-shell.c +++ /dev/null @@ -1,846 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> - -#include "Evolution.h" - -#include "e-util/e-gui-utils.h" -#include "e-util/e-util.h" - -#include "e-component-registry.h" -#include "e-corba-storage-registry.h" -#include "e-folder-type-registry.h" -#include "e-local-storage.h" -#include "e-shell-constants.h" -#include "e-shell-folder-selection-dialog.h" -#include "e-shell-view.h" -#include "e-shortcuts.h" -#include "e-storage-set.h" - -#include "e-shell.h" - - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _EShellPrivate { - char *local_directory; - - GList *views; - - EStorageSet *storage_set; - EShortcuts *shortcuts; - EFolderTypeRegistry *folder_type_registry; - - EComponentRegistry *component_registry; - - ECorbaStorageRegistry *corba_storage_registry; -}; - - -/* Constants. */ - -/* FIXME: We need a component repository instead. */ - -#define SHORTCUTS_FILE_NAME "shortcuts.xml" -#define LOCAL_STORAGE_DIRECTORY "local" - -#define MAIL_COMPONENT_ID "OAFIID:evolution-shell-component:evolution-mail:d3cb3ed6-a654-4337-8aa0-f443751d6d1b" -#define CALENDAR_COMPONENT_ID "OAFIID:evolution-shell-component:evolution-calendar:2eb9eb63-d305-4918-9c35-faae5db19e51" -#define ADDRESSBOOK_COMPONENT_ID "OAFIID:evolution-shell-component:addressbook:b7a26547-7014-4bb5-98ab-2bcac2bb55ca" - - -enum { - NO_VIEWS_LEFT, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Callback for the folder selection dialog. */ - -static void -folder_selection_dialog_cancelled_cb (EShellFolderSelectionDialog *folder_selection_dialog, - void *data) -{ - Evolution_FolderSelectionListener listener; - CORBA_Environment ev; - - listener = gtk_object_get_data (GTK_OBJECT (folder_selection_dialog), "corba_listener"); - - CORBA_exception_init (&ev); - - Evolution_FolderSelectionListener_cancel (listener, &ev); - - CORBA_exception_free (&ev); - - gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); -} - -static void -folder_selection_dialog_folder_selected_cb (EShellFolderSelectionDialog *folder_selection_dialog, - const char *path, - void *data) -{ - CORBA_Environment ev; - EShell *shell; - Evolution_FolderSelectionListener listener; - EStorageSet *storage_set; - EFolder *folder; - char *uri; - const char *physical_uri; - - shell = E_SHELL (data); - listener = gtk_object_get_data (GTK_OBJECT (folder_selection_dialog), "corba_listener"); - - CORBA_exception_init (&ev); - - storage_set = e_shell_get_storage_set (shell); - folder = e_storage_set_get_folder (storage_set, path); - - uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - - if (folder == NULL) - physical_uri = ""; - else - physical_uri = e_folder_get_physical_uri (folder); - - Evolution_FolderSelectionListener_selected (listener, uri, physical_uri, &ev); - g_free (uri); - - CORBA_exception_free (&ev); - - gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); -} - - -/* CORBA interface implementation. */ - -static POA_Evolution_Shell__vepv shell_vepv; - -static POA_Evolution_Shell * -create_servant (void) -{ - POA_Evolution_Shell *servant; - CORBA_Environment ev; - - servant = (POA_Evolution_Shell *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &shell_vepv; - - CORBA_exception_init (&ev); - - POA_Evolution_Shell__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - return servant; -} - -static Evolution_ShellComponent -impl_Shell_get_component_for_type (PortableServer_Servant servant, - const CORBA_char *type, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponentClient *handler; - EFolderTypeRegistry *folder_type_registry; - Evolution_ShellComponent corba_component; - EShell *shell; - - bonobo_object = bonobo_object_from_servant (servant); - shell = E_SHELL (bonobo_object); - folder_type_registry = shell->priv->folder_type_registry; - - handler = e_folder_type_registry_get_handler_for_type (folder_type_registry, type); - - if (handler == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_Evolution_Shell_NotFound, NULL); - return CORBA_OBJECT_NIL; - } - - corba_component = bonobo_object_corba_objref (BONOBO_OBJECT (handler)); - Bonobo_Unknown_ref (corba_component, ev); - - return CORBA_Object_duplicate (corba_component, ev); -} - -static void -corba_listener_destroy_notify (void *data) -{ - CORBA_Environment ev; - Evolution_FolderSelectionListener listener_interface; - - listener_interface = (Evolution_FolderSelectionListener) data; - - CORBA_exception_init (&ev); - CORBA_Object_release (listener_interface, &ev); - CORBA_exception_free (&ev); -} - -static void -impl_Shell_user_select_folder (PortableServer_Servant servant, - const Evolution_FolderSelectionListener listener, - const CORBA_char *title, - const CORBA_char *default_folder, - const Evolution_Shell_FolderTypeList *corba_allowed_types, - CORBA_Environment *ev) -{ - GtkWidget *folder_selection_dialog; - BonoboObject *bonobo_object; - Evolution_FolderSelectionListener listener_duplicate; - EShell *shell; - const char **allowed_types; - int i; - - bonobo_object = bonobo_object_from_servant (servant); - shell = E_SHELL (bonobo_object); - - allowed_types = alloca (sizeof (allowed_types[0]) * (corba_allowed_types->_length + 1)); - for (i = 0; i < corba_allowed_types->_length; i++) - allowed_types[i] = corba_allowed_types->_buffer[i]; - allowed_types[corba_allowed_types->_length] = NULL; - - /* CORBA doesn't allow you to pass a NULL pointer. */ - if (!*default_folder) - default_folder = NULL; - folder_selection_dialog = e_shell_folder_selection_dialog_new (shell, title, default_folder, allowed_types); - - listener_duplicate = CORBA_Object_duplicate (listener, ev); - gtk_object_set_data_full (GTK_OBJECT (folder_selection_dialog), "corba_listener", - listener_duplicate, corba_listener_destroy_notify); - - gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "folder_selected", - GTK_SIGNAL_FUNC (folder_selection_dialog_folder_selected_cb), shell); - gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "cancelled", - GTK_SIGNAL_FUNC (folder_selection_dialog_cancelled_cb), shell); - - gtk_widget_show (folder_selection_dialog); -} - - -/* Initialization of the storages. */ - -static gboolean -setup_corba_storages (EShell *shell) -{ - EShellPrivate *priv; - ECorbaStorageRegistry *corba_storage_registry; - - priv = shell->priv; - - g_assert (priv->storage_set != NULL); - corba_storage_registry = e_corba_storage_registry_new (priv->storage_set); - - if (corba_storage_registry == NULL) - return FALSE; - - bonobo_object_add_interface (BONOBO_OBJECT (shell), BONOBO_OBJECT (corba_storage_registry)); - - /* Notice that `bonobo_object_add_interface()' aggregates the two object's - reference counts, so we need an extra ref here if we want to keep a separate - pointer to the storage interface. */ - bonobo_object_ref (BONOBO_OBJECT (corba_storage_registry)); - priv->corba_storage_registry = corba_storage_registry; - - return TRUE; -} - -static gboolean -setup_local_storage (EShell *shell) -{ - EStorage *local_storage; - EShellPrivate *priv; - gchar *local_storage_path; - - priv = shell->priv; - - local_storage_path = g_concat_dir_and_file (priv->local_directory, - LOCAL_STORAGE_DIRECTORY); - local_storage = e_local_storage_open (priv->folder_type_registry, - local_storage_path); - if (local_storage == NULL) { - g_warning (_("Cannot set up local storage -- %s"), local_storage_path); - g_free (local_storage_path); - return FALSE; - } - g_free (local_storage_path); - - g_assert (shell->priv->folder_type_registry); - - e_storage_set_add_storage (priv->storage_set, local_storage); - - gtk_object_unref (GTK_OBJECT (local_storage)); - - return TRUE; -} - - -/* Initialization of the components. */ - -static void -setup_components (EShell *shell) -{ - EShellPrivate *priv; - - priv = shell->priv; - - priv->component_registry = e_component_registry_new (shell); - - /* FIXME: Hardcoded for now. */ - - if (! e_component_registry_register_component (priv->component_registry, MAIL_COMPONENT_ID)) - g_warning ("Cannot activate mail component -- %s", MAIL_COMPONENT_ID); - - if (! e_component_registry_register_component (priv->component_registry, CALENDAR_COMPONENT_ID)) - g_warning ("Cannot activate calendar component -- %s", CALENDAR_COMPONENT_ID); - - if (! e_component_registry_register_component (priv->component_registry, ADDRESSBOOK_COMPONENT_ID)) - g_warning ("Cannot activate addressbook component -- %s", ADDRESSBOOK_COMPONENT_ID); -} - - -/* EShellView destruction callback. */ - -static void -view_destroy_cb (GtkObject *object, - gpointer data) -{ - EShell *shell; - - g_assert (E_IS_SHELL_VIEW (object)); - - shell = E_SHELL (data); - shell->priv->views = g_list_remove (shell->priv->views, object); - - if (shell->priv->views == NULL) { - /* FIXME: This looks like a Bonobo bug to me. */ - bonobo_object_ref (BONOBO_OBJECT (shell)); - gtk_signal_emit (GTK_OBJECT (shell), signals[NO_VIEWS_LEFT]); - bonobo_object_unref (BONOBO_OBJECT (shell)); - } -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EShell *shell; - EShellPrivate *priv; - GList *p; - - shell = E_SHELL (object); - priv = shell->priv; - - g_free (priv->local_directory); - - if (priv->storage_set != NULL) - gtk_object_unref (GTK_OBJECT (priv->storage_set)); - - if (priv->shortcuts != NULL) - gtk_object_unref (GTK_OBJECT (priv->shortcuts)); - - if (priv->folder_type_registry != NULL) - gtk_object_unref (GTK_OBJECT (priv->folder_type_registry)); - - if (priv->component_registry != NULL) - gtk_object_unref (GTK_OBJECT (priv->component_registry)); - - for (p = priv->views; p != NULL; p = p->next) { - EShellView *view; - - view = E_SHELL_VIEW (p->data); - - gtk_signal_disconnect_by_func (GTK_OBJECT (view), - GTK_SIGNAL_FUNC (view_destroy_cb), shell); - gtk_object_destroy (GTK_OBJECT (view)); - } - - g_list_free (priv->views); - - if (priv->corba_storage_registry != NULL) - bonobo_object_unref (BONOBO_OBJECT (priv->corba_storage_registry)); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* Initialization. */ - -static void -corba_class_init (void) -{ - POA_Evolution_Shell__vepv *vepv; - POA_Evolution_Shell__epv *epv; - PortableServer_ServantBase__epv *base_epv; - - base_epv = g_new0 (PortableServer_ServantBase__epv, 1); - base_epv->_private = NULL; - base_epv->finalize = NULL; - base_epv->default_POA = NULL; - - epv = g_new0 (POA_Evolution_Shell__epv, 1); - epv->get_component_for_type = impl_Shell_get_component_for_type; - epv->user_select_folder = impl_Shell_user_select_folder; - - vepv = &shell_vepv; - vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); - vepv->Evolution_Shell_epv = epv; -} - -static void -class_init (EShellClass *klass) -{ - GtkObjectClass *object_class; - - parent_class = gtk_type_class (PARENT_TYPE); - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - signals[NO_VIEWS_LEFT] = - gtk_signal_new ("no_views_left", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EShellClass, no_views_left), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); - - corba_class_init (); -} - -static void -init (EShell *shell) -{ - EShellPrivate *priv; - - priv = g_new (EShellPrivate, 1); - - priv->views = NULL; - - priv->local_directory = NULL; - priv->storage_set = NULL; - priv->shortcuts = NULL; - priv->component_registry = NULL; - priv->folder_type_registry = NULL; - priv->corba_storage_registry = NULL; - - shell->priv = priv; -} - - -void -e_shell_construct (EShell *shell, - Evolution_Shell corba_object, - const char *local_directory) -{ - EShellPrivate *priv; - gchar *shortcut_path; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (corba_object != CORBA_OBJECT_NIL); - g_return_if_fail (local_directory != NULL); - g_return_if_fail (g_path_is_absolute (local_directory)); - - bonobo_object_construct (BONOBO_OBJECT (shell), corba_object); - - priv = shell->priv; - - priv->local_directory = g_strdup (local_directory); - priv->folder_type_registry = e_folder_type_registry_new (); - priv->storage_set = e_storage_set_new (shell->priv->folder_type_registry); - - gtk_object_ref (GTK_OBJECT (priv->storage_set )); - - /* CORBA storages must be set up before the components, because otherwise components - cannot register their own storages. */ - if (! setup_corba_storages (shell)) - return; - - setup_components (shell); - - /* The local storage depends on the component registry. */ - setup_local_storage (shell); - - shortcut_path = g_concat_dir_and_file (local_directory, "shortcuts.xml"); - priv->shortcuts = e_shortcuts_new (priv->storage_set, - priv->folder_type_registry, - shortcut_path); - - if (priv->shortcuts == NULL) - g_warning ("Cannot load shortcuts -- %s", shortcut_path); - - g_free (shortcut_path); -} - -EShell * -e_shell_new (const char *local_directory) -{ - EShell *new; - EShellPrivate *priv; - Evolution_Shell corba_object; - POA_Evolution_Shell *servant; - - g_return_val_if_fail (local_directory != NULL, NULL); - g_return_val_if_fail (*local_directory != '\0', NULL); - - servant = create_servant (); - if (servant == NULL) - return NULL; - - new = gtk_type_new (e_shell_get_type ()); - - corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant); - e_shell_construct (new, corba_object, local_directory); - - priv = new->priv; - - if (priv->shortcuts == NULL || priv->storage_set == NULL) { - bonobo_object_unref (BONOBO_OBJECT (new)); - return NULL; - } - - return new; -} - - -GtkWidget * -e_shell_new_view (EShell *shell, - const char *uri) -{ - GtkWidget *view; - - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - view = e_shell_view_new (shell); - - gtk_widget_show (view); - gtk_signal_connect (GTK_OBJECT (view), "destroy", - GTK_SIGNAL_FUNC (view_destroy_cb), shell); - - if (uri != NULL) - e_shell_view_display_uri (E_SHELL_VIEW (view), uri); - - shell->priv->views = g_list_prepend (shell->priv->views, view); - - return view; -} - - -const char * -e_shell_get_local_directory (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - return shell->priv->local_directory; -} - -EShortcuts * -e_shell_get_shortcuts (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - return shell->priv->shortcuts; -} - -EStorageSet * -e_shell_get_storage_set (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - return shell->priv->storage_set; -} - -EFolderTypeRegistry * -e_shell_get_folder_type_registry (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - return shell->priv->folder_type_registry; -} - - -static gboolean -save_settings_for_views (EShell *shell) -{ - EShellPrivate *priv; - GList *p; - gboolean retval; - char *prefix; - int i; - - priv = shell->priv; - retval = TRUE; - - for (p = priv->views, i = 0; p != NULL; p = p->next, i++) { - EShellView *view; - - view = E_SHELL_VIEW (p->data); - - prefix = g_strdup_printf ("=%s/config/Shell=/Views/%d/", - priv->local_directory, i); - - if (! e_shell_view_save_settings (view, prefix)) { - g_warning ("Cannot save settings for view -- %d", i); - retval = FALSE; - } - - g_free (prefix); - } - - prefix = g_strdup_printf ("=%s/config/Shell=/Views/NumberOfViews", - priv->local_directory); - gnome_config_set_int (prefix, g_list_length (priv->views)); - g_free (prefix); - - gnome_config_sync (); - - return TRUE; -} - -static gboolean -save_settings_for_component (EShell *shell, - const char *id, - EvolutionShellComponentClient *client) -{ - Bonobo_Unknown unknown_interface; - Evolution_Session session_interface; - CORBA_Environment ev; - char *prefix; - gboolean retval; - - unknown_interface = bonobo_object_corba_objref (BONOBO_OBJECT (client)); - g_assert (unknown_interface != CORBA_OBJECT_NIL); - - CORBA_exception_init (&ev); - - session_interface = Bonobo_Unknown_query_interface (unknown_interface, "IDL:Evolution/Session:1.0", &ev); - if (ev._major != CORBA_NO_EXCEPTION || CORBA_Object_is_nil (session_interface, &ev)) { - CORBA_exception_free (&ev); - return TRUE; - } - - prefix = g_strconcat ("/apps/Evolution/Shell/Components/", id, NULL); - Evolution_Session_save_configuration (session_interface, prefix, &ev); - - if (ev._major == CORBA_NO_EXCEPTION) - retval = TRUE; - else - retval = FALSE; - - g_free (prefix); - - CORBA_exception_free (&ev); - - return retval; -} - -static gboolean -save_settings_for_components (EShell *shell) -{ - EShellPrivate *priv; - GList *component_ids; - GList *p; - gboolean retval; - - priv = shell->priv; - - g_assert (priv->component_registry); - component_ids = e_component_registry_get_id_list (priv->component_registry); - - retval = TRUE; - for (p = component_ids; p != NULL; p = p->next) { - EvolutionShellComponentClient *client; - const char *id; - - id = p->data; - client = e_component_registry_get_component_by_id (priv->component_registry, id); - - if (! save_settings_for_component (shell, id, client)) - retval = FALSE; - } - - e_free_string_list (component_ids); - - return retval; -} - -/** - * e_shell_save_settings: - * @shell: - * - * Save the settings for this shell. - * - * Return value: %TRUE if it worked, %FALSE otherwise. Even if %FALSE is - * returned, it is possible that at least part of the settings for the views - * have been saved. - **/ -gboolean -e_shell_save_settings (EShell *shell) -{ - gboolean views_saved; - gboolean components_saved; - - g_return_val_if_fail (shell != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL (shell), FALSE); - - views_saved = save_settings_for_views (shell); - components_saved = save_settings_for_components (shell); - - return views_saved && components_saved; -} - -/** - * e_shell_restore_from_settings: - * @shell: An EShell object. - * - * Restore the existing views from the saved configuration. The shell must - * have no views for this to work. - * - * Return value: %FALSE if the shell has some open views or there is no saved - * configuration. %TRUE if the configuration could be restored successfully. - **/ -gboolean -e_shell_restore_from_settings (EShell *shell) -{ - EShellPrivate *priv; - gboolean retval; - char *prefix; - int num_views; - int i; - - g_return_val_if_fail (shell != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL (shell), FALSE); - g_return_val_if_fail (shell->priv->views == NULL, FALSE); - - priv = shell->priv; - - prefix = g_strdup_printf ("=%s/config/Shell=/Views/NumberOfViews", - priv->local_directory); - num_views = gnome_config_get_int (prefix); - if (num_views == 0) - return FALSE; - - retval = TRUE; - - for (i = 0; i < num_views; i++) { - GtkWidget *view_widget; - - prefix = g_strdup_printf ("=%s/config/Shell=/Views/%d/", - priv->local_directory, i); - - /* FIXME restore the URI here. There should be an - e_shell_view_new_from_configuration() thingie. */ - view_widget = e_shell_new_view (shell, NULL); - - if (! e_shell_view_load_settings (E_SHELL_VIEW (view_widget), prefix)) - retval = FALSE; - - g_free (prefix); - } - - return retval; -} - -/** - * e_shell_quit: - * @shell: An EShell. - * - * Make @shell quit. This will close all the associated views and destroy the - * object. - **/ -void -e_shell_quit (EShell *shell) -{ - EShellPrivate *priv; - GList *p; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - - e_shell_save_settings (shell); - - priv = shell->priv; - - for (p = priv->views; p != NULL; p = p->next) { - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (p->data); - gtk_signal_disconnect_by_func (GTK_OBJECT (shell_view), - GTK_SIGNAL_FUNC (view_destroy_cb), shell); - gtk_widget_destroy (GTK_WIDGET (shell_view)); - } - - g_list_free (priv->views); - priv->views = NULL; - - bonobo_object_unref (BONOBO_OBJECT (priv->corba_storage_registry)); - - priv->corba_storage_registry = NULL; - - e_storage_set_remove_all_storages (priv->storage_set); - - /* - * Ok, so you thought the GUI components lifecycle was coupled to - * the Shell's, in fact this is not the case, they are unref'd - * here, and NULL'd to avoid shell destruction killing them again. - * So; the shell can be destroyed either remotely or localy. - */ - - gtk_object_unref (GTK_OBJECT (priv->storage_set)); - gtk_object_unref (GTK_OBJECT (priv->shortcuts)); - gtk_object_unref (GTK_OBJECT (priv->folder_type_registry)); - gtk_object_unref (GTK_OBJECT (priv->component_registry)); - - priv->storage_set = NULL; - priv->shortcuts = NULL; - priv->folder_type_registry = NULL; - priv->component_registry = NULL; - - bonobo_object_unref (BONOBO_OBJECT (shell)); -} - - -E_MAKE_TYPE (e_shell, "EShell", EShell, class_init, init, PARENT_TYPE) diff --git a/shell/e-shell.h b/shell/e-shell.h deleted file mode 100644 index ca63c4776d..0000000000 --- a/shell/e-shell.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_SHELL_H_ -#define _E_SHELL_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-object.h> - -#include "Evolution.h" -#include "e-shortcuts.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHELL (e_shell_get_type ()) -#define E_SHELL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL, EShell)) -#define E_SHELL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL, EShellClass)) -#define E_IS_SHELL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL)) -#define E_IS_SHELL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL)) - - -typedef struct _EShell EShell; -typedef struct _EShellPrivate EShellPrivate; -typedef struct _EShellClass EShellClass; - -struct _EShell { - BonoboObject parent; - - EShellPrivate *priv; -}; - -struct _EShellClass { - BonoboObjectClass parent_class; - - void (* no_views_left) (EShell *shell); -}; - - -GtkType e_shell_get_type (void); -void e_shell_construct (EShell *shell, - Evolution_Shell corba_object, - const char *local_directory); - -EShell *e_shell_new (const char *local_directory); -GtkWidget *e_shell_new_view (EShell *shell, - const char *uri); - -const char *e_shell_get_local_directory (EShell *shell); -EShortcuts *e_shell_get_shortcuts (EShell *shell); -EStorageSet *e_shell_get_storage_set (EShell *shell); -EFolderTypeRegistry *e_shell_get_folder_type_registry (EShell *shell); - -gboolean e_shell_save_settings (EShell *shell); -gboolean e_shell_restore_from_settings (EShell *shell); - -void e_shell_quit (EShell *shell); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHELL_H_ */ diff --git a/shell/e-shortcuts-view.c b/shell/e-shortcuts-view.c deleted file mode 100644 index 6f457cc18d..0000000000 --- a/shell/e-shortcuts-view.c +++ /dev/null @@ -1,584 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts-view.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> - -#include "e-util/e-util.h" - -#include "e-shortcuts-view.h" - - -#define PARENT_TYPE E_TYPE_SHORTCUT_BAR -static EShortcutBarClass *parent_class = NULL; - -struct _EShortcutsViewPrivate { - EShortcuts *shortcuts; -}; - -enum { - ACTIVATE_SHORTCUT, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* View initialization. */ - -static const char * -get_storage_set_path_from_uri (const char *uri) -{ - const char *colon; - - if (g_path_is_absolute (uri)) - return NULL; - - colon = strchr (uri, ':'); - if (colon == NULL || colon == uri || colon[1] == '\0') - return NULL; - - if (! g_path_is_absolute (colon + 1)) - return NULL; - - if (g_strncasecmp (uri, "evolution", colon - uri) != 0) - return NULL; - - return colon + 1; -} - -static void -load_group (EShortcutsView *shortcuts_view, - EShortcuts *shortcuts, - const char *group_title, - int group_num) -{ - EShortcutsViewPrivate *priv; - EStorageSet *storage_set; - GList *shortcut_list; - GList *p; - - priv = shortcuts_view->priv; - - storage_set = e_shortcuts_get_storage_set (shortcuts); - g_assert (storage_set != NULL); - - shortcut_list = e_shortcuts_get_shortcuts_in_group (shortcuts, group_title); - if (shortcut_list == NULL) - return; - - for (p = shortcut_list; p != NULL; p = p->next) { - EFolder *folder; - const char *path; - const char *uri; - const char *name; - - uri = (const char *) p->data; - path = get_storage_set_path_from_uri (uri); - if (path != NULL) - folder = e_storage_set_get_folder (storage_set, path); - - if (path == NULL || folder == NULL) { - /* FIXME */ - g_warning ("Invalid link while loading shortcut bar view -- %s\n", - uri); - continue; - } - - name = e_folder_get_name (folder); - e_shortcut_model_add_item (E_SHORTCUT_BAR (shortcuts_view)->model, group_num, -1, uri, name); - } - - e_free_string_list (shortcut_list); -} - -static void -load_all_shortcuts (EShortcutsView *shortcuts_view, - EShortcuts *shortcuts) -{ - EShortcutsViewPrivate *priv; - GList *group_titles; - GList *p; - int group_num; - - priv = shortcuts_view->priv; - - group_titles = e_shortcuts_get_group_titles (shortcuts); - - for (p = group_titles; p != NULL; p = p->next) { - const char *group_title; - - group_title = (const char *) p->data; - group_num = e_shortcut_model_add_group (E_SHORTCUT_BAR (shortcuts_view)->model, - -1, group_title); - - load_group (shortcuts_view, shortcuts, group_title, group_num); - } - - e_free_string_list (group_titles); - - gtk_object_ref (GTK_OBJECT (shortcuts)); - priv->shortcuts = shortcuts; -} - -/* Icon callback for the shortcut bar. */ -static GdkPixbuf * -icon_callback (EShortcutBar *shortcut_bar, - const char *uri, - gpointer data) -{ - EFolderTypeRegistry *folder_type_registry; - EShortcuts *shortcuts; - EStorageSet *storage_set; - EFolder *folder; - GdkPixbuf *pixbuf; - const char *type; - - shortcuts = E_SHORTCUTS (data); - - storage_set = e_shortcuts_get_storage_set (shortcuts); - folder_type_registry = e_storage_set_get_folder_type_registry (storage_set); - - folder = e_storage_set_get_folder (storage_set, - get_storage_set_path_from_uri (uri)); - - if (folder == NULL) - return NULL; - - type = e_folder_get_type_string (folder); - if (type == NULL) - return NULL; - - /* FIXME mini icons? */ - pixbuf = e_folder_type_registry_get_icon_for_type (folder_type_registry, type, FALSE); - if (pixbuf != NULL) - gdk_pixbuf_ref (pixbuf); - - return pixbuf; -} - - -/* Shortcut bar right-click menu. */ - -struct _RightClickMenuData { - EShortcutsView *shortcuts_view; - int group_num; -}; -typedef struct _RightClickMenuData RightClickMenuData; - -static void -toggle_large_icons_cb (GtkWidget *widget, - void *data) -{ - RightClickMenuData *menu_data; - - g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (widget)); - - if (data == NULL) - return; - - menu_data = (RightClickMenuData *) data; - - if (! GTK_CHECK_MENU_ITEM (widget)->active) - return; - - e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (menu_data->shortcuts_view), - menu_data->group_num, - E_ICON_BAR_LARGE_ICONS); -} - -static void -toggle_small_icons_cb (GtkWidget *widget, - void *data) -{ - RightClickMenuData *menu_data; - - g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (widget)); - - if (data == NULL) - return; - - menu_data = (RightClickMenuData *) data; - - if (! GTK_CHECK_MENU_ITEM (widget)->active) - return; - - e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (menu_data->shortcuts_view), - menu_data->group_num, - E_ICON_BAR_SMALL_ICONS); -} - -static GnomeUIInfo icon_size_radio_group_uiinfo[] = { - { GNOME_APP_UI_ITEM, N_("_Small icons"), - N_("Show the shortcuts as small icons"), toggle_small_icons_cb, NULL, - NULL, 0, 0, 0, 0 }, - { GNOME_APP_UI_ITEM, N_("_Large icons"), - N_("Show the shortcuts as large icons"), toggle_large_icons_cb, NULL, - NULL, 0, 0, 0, 0 }, - - GNOMEUIINFO_END -}; - -static GnomeUIInfo right_click_menu_uiinfo[] = { - GNOMEUIINFO_RADIOLIST (icon_size_radio_group_uiinfo), - GNOMEUIINFO_END -}; - -static void -pop_up_right_click_menu_for_group (EShortcutsView *shortcuts_view, - GdkEventButton *event, - int group_num) -{ - RightClickMenuData *menu_data; - GtkWidget *popup_menu; - - menu_data = g_new (RightClickMenuData, 1); - menu_data->shortcuts_view = shortcuts_view; - menu_data->group_num = group_num; - - popup_menu = gnome_popup_menu_new (right_click_menu_uiinfo); - - if (e_shortcut_bar_get_view_type (E_SHORTCUT_BAR (shortcuts_view), group_num) - == E_ICON_BAR_SMALL_ICONS) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (icon_size_radio_group_uiinfo[0].widget), - TRUE); - else - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (icon_size_radio_group_uiinfo[1].widget), - TRUE); - - gnome_popup_menu_do_popup_modal (popup_menu, NULL, NULL, event, menu_data); - - g_free (menu_data); - gtk_widget_destroy (popup_menu); -} - - -/* Shortcut right-click menu. */ - -struct _ShortcutRightClickMenuData { - EShortcutsView *shortcuts_view; - int group_num; - int item_num; -}; -typedef struct _ShortcutRightClickMenuData ShortcutRightClickMenuData; - -static void -activate_shortcut_cb (GtkWidget *widget, - void *data) -{ - ShortcutRightClickMenuData *menu_data; - EShortcutsView *shortcuts_view; - EShortcuts *shortcuts; - const char *uri; - - menu_data = (ShortcutRightClickMenuData *) data; - shortcuts_view = menu_data->shortcuts_view; - shortcuts = shortcuts_view->priv->shortcuts; - - uri = e_shortcuts_get_uri (shortcuts, menu_data->group_num, menu_data->item_num); - if (uri == NULL) - return; - - gtk_signal_emit (GTK_OBJECT (shortcuts_view), signals[ACTIVATE_SHORTCUT], - shortcuts, uri); -} - -static void -remove_shortcut_cb (GtkWidget *widget, - void *data) -{ - ShortcutRightClickMenuData *menu_data; - EShortcutsView *shortcuts_view; - EShortcuts *shortcuts; - - menu_data = (ShortcutRightClickMenuData *) data; - shortcuts_view = menu_data->shortcuts_view; - shortcuts = shortcuts_view->priv->shortcuts; - - e_shortcuts_remove_shortcut (shortcuts, menu_data->group_num, menu_data->item_num); - - /* FIXME not real model-view. */ - e_shortcut_model_remove_item (E_SHORTCUT_BAR (shortcuts_view)->model, - menu_data->group_num, - menu_data->item_num); -} - -static GnomeUIInfo shortcut_right_click_menu_uiinfo[] = { - GNOMEUIINFO_ITEM (N_("Activate"), N_("Activate this shortcut"), - activate_shortcut_cb, NULL), - GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_ITEM_STOCK (N_("Remove"), N_("Remove this shortcut from the shortcut bar"), - remove_shortcut_cb, GNOME_STOCK_MENU_CLOSE), - GNOMEUIINFO_END -}; - -static void -pop_up_right_click_menu_for_shortcut (EShortcutsView *shortcuts_view, - GdkEventButton *event, - int group_num, - int item_num) -{ - ShortcutRightClickMenuData *menu_data; - GtkWidget *popup_menu; - - menu_data = g_new (ShortcutRightClickMenuData, 1); - menu_data->shortcuts_view = shortcuts_view; - menu_data->group_num = group_num; - menu_data->item_num = item_num; - - popup_menu = gnome_popup_menu_new (shortcut_right_click_menu_uiinfo); - - gnome_popup_menu_do_popup_modal (popup_menu, NULL, NULL, event, menu_data); - - g_free (menu_data); - gtk_widget_destroy (popup_menu); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EShortcutsViewPrivate *priv; - EShortcutsView *shortcuts_view; - - shortcuts_view = E_SHORTCUTS_VIEW (object); - - priv = shortcuts_view->priv; - - gtk_object_unref (GTK_OBJECT (priv->shortcuts)); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* EShortcutBar methods. */ - -static void -selected_item (EShortcutBar *shortcut_bar, - GdkEvent *event, - int group_num, - int item_num) -{ - EShortcuts *shortcuts; - EShortcutsView *shortcuts_view; - const char *uri; - - shortcuts_view = E_SHORTCUTS_VIEW (shortcut_bar); - shortcuts = shortcuts_view->priv->shortcuts; - - if (event->button.button == 3) { - if (item_num < 0) - pop_up_right_click_menu_for_group (shortcuts_view, &event->button, - group_num); - else - pop_up_right_click_menu_for_shortcut (shortcuts_view, &event->button, - group_num, item_num); - return; - } else if (event->button.button != 1) { - return; - } - - if (item_num < 0) - return; - - uri = e_shortcuts_get_uri (shortcuts, group_num, item_num); - if (uri == NULL) - return; - - gtk_signal_emit (GTK_OBJECT (shortcuts_view), signals[ACTIVATE_SHORTCUT], - shortcuts, uri); -} - -#if 0 -static void -added_item (EShortcutBar *shortcut_bar, - int group_num, - int item_num) -{ - EShortcutsViewPrivate *priv; - EShortcutBarGroup *group; - EShortcuts *shortcuts; - const char *url; - - priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv; - shortcuts = priv->shortcuts; - - if (shortcuts == NULL) - return; - - /* FIXME ** NASTY ** */ - - group = &g_array_index (shortcut_bar->groups, EShortcutBarGroup, group_num); - url = e_icon_bar_get_item_data (E_ICON_BAR (group->icon_bar), item_num); - - if (url == NULL) { - g_warning ("NULL URL being added to the shortcut bar!?"); - return; - } - - e_shortcuts_add_shortcut (shortcuts, group_num, item_num, url); -} - -static void -removed_item (EShortcutBar *shortcut_bar, - int group_num, - int item_num) -{ - EShortcutsViewPrivate *priv; - EShortcuts *shortcuts; - - priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv; - shortcuts = priv->shortcuts; - - e_shortcuts_remove_shortcut (shortcuts, group_num, item_num); -} - -static void -added_group (EShortcutBar *shortcut_bar, - int group_num) -{ - EShortcutsViewPrivate *priv; - EShortcuts *shortcuts; - EShortcutBarGroup *group; - const char *group_name; - - priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv; - shortcuts = priv->shortcuts; - - if (shortcuts == NULL) - return; - - group = &g_array_index (shortcut_bar->groups, EShortcutBarGroup, group_num); - - /* FIXME Losing EShortcutBar does not give me a method to retrieve the - group name. */ - group_name = "Foo"; - - e_shortcuts_add_group (shortcuts, group_num, group_name); -} - -static void -removed_group (EShortcutBar *shortcut_bar, - int group_num) -{ - EShortcutsViewPrivate *priv; - EShortcuts *shortcuts; - - priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv; - shortcuts = priv->shortcuts; - - if (shortcuts == NULL) - return; - - e_shortcuts_remove_group (shortcuts, group_num); -} -#endif - - -static void -class_init (EShortcutsViewClass *klass) -{ - GtkObjectClass *object_class; - EShortcutBarClass *shortcut_bar_class; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - shortcut_bar_class = E_SHORTCUT_BAR_CLASS (klass); - shortcut_bar_class->selected_item = selected_item; -#if 0 - shortcut_bar_class->added_item = added_item; - shortcut_bar_class->removed_item = removed_item; - shortcut_bar_class->added_group = added_group; - shortcut_bar_class->removed_group = removed_group; -#endif - parent_class = gtk_type_class (e_shortcut_bar_get_type ()); - - signals[ACTIVATE_SHORTCUT] = - gtk_signal_new ("activate_shortcut", - GTK_RUN_LAST | GTK_RUN_ACTION, - object_class->type, - GTK_SIGNAL_OFFSET (EShortcutsViewClass, activate_shortcut), - gtk_marshal_NONE__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_STRING); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EShortcutsView *shortcuts_view) -{ - EShortcutsViewPrivate *priv; - - priv = g_new (EShortcutsViewPrivate, 1); - priv->shortcuts = NULL; - - shortcuts_view->priv = priv; -} - - -void -e_shortcuts_view_construct (EShortcutsView *shortcuts_view, - EShortcuts *shortcuts) -{ - EShortcutsViewPrivate *priv; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts_view->priv; - - e_shortcut_bar_set_model (E_SHORTCUT_BAR (shortcuts_view), - e_shortcut_model_new ()); - - e_shortcut_bar_set_icon_callback (E_SHORTCUT_BAR (shortcuts_view), icon_callback, - shortcuts); - - load_all_shortcuts (shortcuts_view, shortcuts); -} - -GtkWidget * -e_shortcuts_view_new (EShortcuts *shortcuts) -{ - GtkWidget *new; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - new = gtk_type_new (e_shortcuts_view_get_type ()); - e_shortcuts_view_construct (E_SHORTCUTS_VIEW (new), shortcuts); - - return new; -} - - -E_MAKE_TYPE (e_shortcuts_view, "EShortcutsView", EShortcutsView, class_init, init, PARENT_TYPE) diff --git a/shell/e-shortcuts-view.h b/shell/e-shortcuts-view.h deleted file mode 100644 index 8f6f8cb0af..0000000000 --- a/shell/e-shortcuts-view.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts-view.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_SHORTCUTS_VIEW_H_ -#define _E_SHORTCUTS_VIEW_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> - -#include "shortcut-bar/e-shortcut-bar.h" -#include "e-shortcuts.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHORTCUTS_VIEW (e_shortcuts_view_get_type ()) -#define E_SHORTCUTS_VIEW(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHORTCUTS_VIEW, EShortcutsView)) -#define E_SHORTCUTS_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHORTCUTS_VIEW, EShortcutsViewClass)) -#define E_IS_SHORTCUTS_VIEW(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHORTCUTS_VIEW)) -#define E_IS_SHORTCUTS_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHORTCUTS_VIEW)) - - -typedef struct _EShortcutsView EShortcutsView; -typedef struct _EShortcutsViewPrivate EShortcutsViewPrivate; -typedef struct _EShortcutsViewClass EShortcutsViewClass; - -struct _EShortcutsView { - EShortcutBar parent; - - EShortcutsViewPrivate *priv; -}; - -struct _EShortcutsViewClass { - EShortcutBarClass parent_class; - - void (* activate_shortcut) (EShortcutsView *view, - EShortcuts *shortcuts, - const char *uri); -}; - - -GtkType e_shortcuts_view_get_type (void); -void e_shortcuts_view_construct (EShortcutsView *shortcuts_view, - EShortcuts *shortcuts); -GtkWidget *e_shortcuts_view_new (EShortcuts *shortcuts); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHORTCUTS_VIEW_H_ */ diff --git a/shell/e-shortcuts.c b/shell/e-shortcuts.c deleted file mode 100644 index 1828406df3..0000000000 --- a/shell/e-shortcuts.c +++ /dev/null @@ -1,760 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -/* The shortcut list goes this: - - <?xml version="1.0"?> - <shortcuts> - <group title="Evolution shortcuts"> - <item>evolution:/local/Inbox</item> - <item>evolution:/local/Trash</item> - <item>evolution:/local/Calendar</item> - </group> - - <group title="Personal shortcuts"> - <item>evolution:/local/Personal</item> - </group> - </shortcuts> - - FIXME: Do we want to use a namespace for this? - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> -#include <gtk/gtktypeutils.h> - -#include <gnome-xml/parser.h> -#include <gnome-xml/xmlmemory.h> - -#include <string.h> - -#include "e-util/e-util.h" -#include "e-util/e-xml-utils.h" - -#include "shortcut-bar/e-shortcut-bar.h" -#include "e-shortcuts-view.h" - -#include "e-shortcuts.h" - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - -struct _ShortcutGroup { - /* Title of the group. */ - char *title; - - /* A list of strings with the URI for the shortcut. */ - GList *shortcuts; -}; -typedef struct _ShortcutGroup ShortcutGroup; - -struct _EShortcutsPrivate { - /* Name of the file associated with these shortcuts. Changes in the shortcuts - will update this file automatically. */ - char *file_name; - - /* ID of the idle function that will be called to save the shortcuts when they are - changed. */ - int save_idle_id; - - /* Whether these shortcuts need to be saved to disk. */ - gboolean dirty; - - /* The storage set to which these shortcuts are associated. */ - EStorageSet *storage_set; - - /* The folder type registry. */ - EFolderTypeRegistry *folder_type_registry; - - /* A list of ShortcutGroups. */ - GList *groups; - - /* A list of ShortcutViews. */ - GList *views; - - /* A hash table to get a group given its name. */ - GHashTable *title_to_group; -}; - -enum { - NEW_GROUP, - REMOVE_GROUP, - NEW_SHORTCUT, - REMOVE_SHORTCUT, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -static void -unload_shortcuts (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - GList *orig_groups; - GList *p, *q; - - priv = shortcuts->priv; - orig_groups = priv->groups; - - for (p = priv->groups; p != NULL; p = p->next) { - ShortcutGroup *group; - - gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_GROUP], 0); - - group = (ShortcutGroup *) p->data; - - g_hash_table_remove (priv->title_to_group, group->title); - - for (q = group->shortcuts; q != NULL; q = q->next) - g_free (q->data); - g_free (group->title); - - g_list_free (group->shortcuts); - - priv->groups = priv->groups->next; - } - - if (orig_groups != NULL) - g_list_free (orig_groups); - - priv->groups = NULL; - - g_hash_table_destroy (priv->title_to_group); - priv->title_to_group = g_hash_table_new (g_str_hash, g_str_equal); -} - -static gboolean -load_shortcuts (EShortcuts *shortcuts, - const char *file_name) -{ - EShortcutsPrivate *priv; - xmlDoc *doc; - xmlNode *root; - xmlNode *p, *q; - - /* FIXME: Update the views by emitting the appropriate signals. */ - - priv = shortcuts->priv; - - doc = xmlParseFile (file_name); - if (doc == NULL) - return FALSE; - - root = xmlDocGetRootElement (doc); - if (root == NULL || strcmp (root->name, "shortcuts") != 0) { - xmlFreeDoc (doc); - return FALSE; - } - - unload_shortcuts (shortcuts); - - for (p = root->childs; p != NULL; p = p->next) { - ShortcutGroup *shortcut_group; - char *shortcut_group_title; - - if (strcmp ((char *) p->name, "group") != 0) - continue; - - shortcut_group_title = (char *) xmlGetProp (p, "title"); - if (shortcut_group_title == NULL) - continue; - - shortcut_group = g_hash_table_lookup (priv->title_to_group, - shortcut_group_title); - if (shortcut_group != NULL) { - g_warning ("Duplicate shortcut group title -- %s", - shortcut_group_title); - xmlFree (shortcut_group_title); - continue; - } - - shortcut_group = g_new (ShortcutGroup, 1); - shortcut_group->title = g_strdup (shortcut_group_title); - xmlFree (shortcut_group_title); - - shortcut_group->shortcuts = NULL; - for (q = p->childs; q != NULL; q = q->next) { - char *content; - - if (strcmp ((char *) q->name, "item") != 0) - continue; - - content = xmlNodeListGetString (doc, q->childs, 1); - shortcut_group->shortcuts = g_list_prepend (shortcut_group->shortcuts, - g_strdup (content)); - xmlFree (content); - } - shortcut_group->shortcuts = g_list_reverse (shortcut_group->shortcuts); - - priv->groups = g_list_prepend (priv->groups, shortcut_group); - g_hash_table_insert (priv->title_to_group, shortcut_group->title, shortcut_group); - } - - priv->groups = g_list_reverse (priv->groups); - - xmlFreeDoc (doc); - - return TRUE; -} - -static gboolean -save_shortcuts (EShortcuts *shortcuts, - const char *file_name) -{ - EShortcutsPrivate *priv; - xmlDoc *doc; - xmlNode *root; - GList *p, *q; - - priv = shortcuts->priv; - - doc = xmlNewDoc ((xmlChar *) "1.0"); - root = xmlNewDocNode (doc, NULL, (xmlChar *) "shortcuts", NULL); - xmlDocSetRootElement (doc, root); - - for (p = priv->groups; p != NULL; p = p->next) { - ShortcutGroup *group; - xmlNode *group_node; - - group = (ShortcutGroup *) p->data; - group_node = xmlNewChild (root, NULL, (xmlChar *) "group", NULL); - - xmlSetProp (group_node, (xmlChar *) "title", group->title); - - for (q = group->shortcuts; q != NULL; q = q->next) { - const char *shortcut; - - shortcut = (const char *) q->data; - xmlNewChild (group_node, NULL, (xmlChar *) "item", (xmlChar *) shortcut); - } - } - - if (xmlSaveFile (file_name, doc) < 0) { - xmlFreeDoc (doc); - return FALSE; - } - - xmlFreeDoc (doc); - return TRUE; -} - - -/* Idle function to update the file on disk. */ - -static int -idle_cb (void *data) -{ - EShortcuts *shortcuts; - EShortcutsPrivate *priv; - - shortcuts = E_SHORTCUTS (data); - priv = shortcuts->priv; - - if (priv->dirty) { - g_print ("Saving shortcuts -- %s\n", priv->file_name); - if (! e_shortcuts_save (shortcuts, NULL)) - g_warning ("Saving of shortcuts failed -- %s", priv->file_name); - else - priv->dirty = FALSE; - } - - priv->save_idle_id = 0; - - return FALSE; -} - -static void -schedule_idle (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - - priv = shortcuts->priv; - - if (priv->save_idle_id != 0) - return; - - gtk_idle_add (idle_cb, shortcuts); -} - -static void -make_dirty (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - - priv = shortcuts->priv; - - priv->dirty = TRUE; - schedule_idle (shortcuts); -} - - -/* Signal handlers for the views. */ - -static void -view_destroyed_cb (GtkObject *object, - gpointer data) -{ - EShortcuts *shortcuts; - EShortcutsPrivate *priv; - - shortcuts = E_SHORTCUTS (data); - priv = shortcuts->priv; - - priv->views = g_list_remove (priv->views, object); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EShortcuts *shortcuts; - EShortcutsPrivate *priv; - - shortcuts = E_SHORTCUTS (object); - priv = shortcuts->priv; - - g_free (priv->file_name); - - if (priv->storage_set != NULL) - gtk_object_unref (GTK_OBJECT (priv->storage_set)); - - if (priv->folder_type_registry != NULL) - gtk_object_unref (GTK_OBJECT (priv->folder_type_registry)); - - unload_shortcuts (shortcuts); - - if (priv->save_idle_id != 0) - gtk_idle_remove (priv->save_idle_id); - - if (priv->dirty) { - if (! e_shortcuts_save (shortcuts, NULL)) - g_warning (_("Error saving shortcuts.")); /* FIXME */ - } - - g_hash_table_destroy (priv->title_to_group); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (EShortcutsClass *klass) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass*) klass; - object_class->destroy = destroy; - - parent_class = gtk_type_class (gtk_object_get_type ()); - - signals[NEW_GROUP] - = gtk_signal_new ("new_group", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EShortcutsClass, new_group), - gtk_marshal_NONE__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - signals[REMOVE_GROUP] - = gtk_signal_new ("remove_group", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EShortcutsClass, remove_group), - gtk_marshal_NONE__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - signals[NEW_SHORTCUT] - = gtk_signal_new ("new_shortcut", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EShortcutsClass, new_shortcut), - gtk_marshal_NONE__INT_INT, - GTK_TYPE_NONE, 2, - GTK_TYPE_INT, - GTK_TYPE_INT); - - signals[REMOVE_SHORTCUT] - = gtk_signal_new ("remove_shortcut", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EShortcutsClass, remove_shortcut), - gtk_marshal_NONE__INT_INT, - GTK_TYPE_NONE, 2, - GTK_TYPE_INT, - GTK_TYPE_INT); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - - -static void -init (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - - priv = g_new (EShortcutsPrivate, 1); - - priv->file_name = NULL; - priv->storage_set = NULL; - priv->groups = NULL; - priv->views = NULL; - priv->title_to_group = g_hash_table_new (g_str_hash, g_str_equal); - priv->dirty = 0; - priv->save_idle_id = 0; - - shortcuts->priv = priv; -} - - -void -e_shortcuts_construct (EShortcuts *shortcuts, - EStorageSet *storage_set, - EFolderTypeRegistry *folder_type_registry) -{ - EShortcutsPrivate *priv; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - g_return_if_fail (storage_set != NULL); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (shortcuts), GTK_FLOATING); - - priv = shortcuts->priv; - - gtk_object_ref (GTK_OBJECT (storage_set)); - priv->storage_set = storage_set; - - gtk_object_ref (GTK_OBJECT (folder_type_registry)); - priv->folder_type_registry = folder_type_registry; -} - -EShortcuts * -e_shortcuts_new (EStorageSet *storage_set, - EFolderTypeRegistry *folder_type_registry, - const char *file_name) -{ - EShortcuts *new; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - - new = gtk_type_new (e_shortcuts_get_type ()); - e_shortcuts_construct (new, storage_set, folder_type_registry); - - if (! e_shortcuts_load (new, file_name)) { - gtk_object_unref (GTK_OBJECT (new)); - return NULL; - } - - return new; -} - - -GList * -e_shortcuts_get_group_titles (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GList *list; - GList *p; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - priv = shortcuts->priv; - - list = NULL; - - for (p = priv->groups; p != NULL; p = p->next) { - group = (ShortcutGroup *) p->data; - list = g_list_prepend (list, g_strdup (group->title)); - } - - return g_list_reverse (list); -} - -GList * -e_shortcuts_get_shortcuts_in_group (EShortcuts *shortcuts, - const char *group_title) -{ - EShortcutsPrivate *priv; - ShortcutGroup *shortcut_group; - GList *list; - GList *p; - - priv = shortcuts->priv; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - g_return_val_if_fail (group_title != NULL, NULL); - - shortcut_group = g_hash_table_lookup (priv->title_to_group, group_title); - if (shortcut_group == NULL) - return NULL; - - list = NULL; - - for (p = shortcut_group->shortcuts; p != NULL; p = p->next) - list = g_list_prepend (list, g_strdup ((const char *) p->data)); - - return g_list_reverse (list); -} - - -EStorageSet * -e_shortcuts_get_storage_set (EShortcuts *shortcuts) -{ - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - return shortcuts->priv->storage_set; -} - - -GtkWidget * -e_shortcuts_new_view (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - GtkWidget *new; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - priv = shortcuts->priv; - - new = e_shortcuts_view_new (shortcuts); - priv->views = g_list_prepend (priv->views, new); - - gtk_signal_connect (GTK_OBJECT (new), "destroy", view_destroyed_cb, shortcuts); - - return new; -} - - -gboolean -e_shortcuts_load (EShortcuts *shortcuts, - const char *file_name) -{ - EShortcutsPrivate *priv; - char *tmp; - - g_return_val_if_fail (shortcuts != NULL, FALSE); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), FALSE); - g_return_val_if_fail (file_name == NULL || g_path_is_absolute (file_name), FALSE); - - priv = shortcuts->priv; - - if (file_name == NULL) { - if (priv->file_name == NULL) - return FALSE; - file_name = priv->file_name; - } - - if (! load_shortcuts (shortcuts, file_name)) - return FALSE; - - tmp = g_strdup (file_name); - g_free (priv->file_name); - priv->file_name = tmp; - - return TRUE; -} - -gboolean -e_shortcuts_save (EShortcuts *shortcuts, - const char *file_name) -{ - EShortcutsPrivate *priv; - char *tmp; - - g_return_val_if_fail (shortcuts != NULL, FALSE); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), FALSE); - g_return_val_if_fail (file_name == NULL || g_path_is_absolute (file_name), FALSE); - - priv = shortcuts->priv; - - if (file_name == NULL) { - if (priv->file_name == NULL) - return FALSE; - file_name = priv->file_name; - } - - if (! save_shortcuts (shortcuts, file_name)) - return FALSE; - - tmp = g_strdup (file_name); - g_free (priv->file_name); - priv->file_name = tmp; - - return TRUE; -} - - -const char * -e_shortcuts_get_uri (EShortcuts *shortcuts, int group_num, int num) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GList *shortcut_element; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - priv = shortcuts->priv; - - group = g_list_nth (priv->groups, group_num)->data; - if (group == NULL) - return NULL; - - shortcut_element = g_list_nth (group->shortcuts, num); - if (shortcut_element == NULL) - return NULL; - - return shortcut_element->data; -} - - -void -e_shortcuts_remove_shortcut (EShortcuts *shortcuts, - int group_num, - int num) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GList *p; - char *uri; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - p = g_list_nth (priv->groups, group_num); - g_return_if_fail (p != NULL); - - group = (ShortcutGroup *) p->data; - - p = g_list_nth (group->shortcuts, num); - g_return_if_fail (p != NULL); - - gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_SHORTCUT], group_num, num); - - uri = (char *) p->data; - g_free (uri); - - group->shortcuts = g_list_remove_link (group->shortcuts, p); - - make_dirty (shortcuts); -} - -void -e_shortcuts_add_shortcut (EShortcuts *shortcuts, - int group_num, - int num, - const char *uri) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GList *p; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - p = g_list_nth (priv->groups, group_num); - g_return_if_fail (p != NULL); - - group = (ShortcutGroup *) p->data; - - group->shortcuts = g_list_insert (group->shortcuts, g_strdup (uri), num); - - gtk_signal_emit (GTK_OBJECT (shortcuts), signals[NEW_SHORTCUT], group_num, num); - - make_dirty (shortcuts); -} - -void -e_shortcuts_remove_group (EShortcuts *shortcuts, - int group_num) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GList *p; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - p = g_list_nth (priv->groups, group_num); - g_return_if_fail (p != NULL); - - gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_GROUP], group_num); - - group = (ShortcutGroup *) p->data; - - e_free_string_list (group->shortcuts); - - priv->groups = g_list_remove_link (priv->groups, p); - - make_dirty (shortcuts); -} - -void -e_shortcuts_add_group (EShortcuts *shortcuts, - int group_num, - const char *group_name) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - group = g_new (ShortcutGroup, 1); - group->title = g_strdup (group_name); - group->shortcuts = NULL; - - priv->groups = g_list_insert (priv->groups, group, group_num); - - gtk_signal_emit (GTK_OBJECT (shortcuts), signals[NEW_GROUP], group_num); - - make_dirty (shortcuts); -} - - -E_MAKE_TYPE (e_shortcuts, "EShortcuts", EShortcuts, class_init, init, PARENT_TYPE) - diff --git a/shell/e-shortcuts.h b/shell/e-shortcuts.h deleted file mode 100644 index da4dfc1fa0..0000000000 --- a/shell/e-shortcuts.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_SHORTCUTS_H_ -#define _E_SHORTCUTS_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkwidget.h> - -#include "e-folder-type-registry.h" -#include "e-storage-set.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHORTCUTS (e_shortcuts_get_type ()) -#define E_SHORTCUTS(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHORTCUTS, EShortcuts)) -#define E_SHORTCUTS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHORTCUTS, EShortcutsClass)) -#define E_IS_SHORTCUTS(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHORTCUTS)) -#define E_IS_SHORTCUTS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHORTCUTS)) - - -typedef struct _EShortcuts EShortcuts; -typedef struct _EShortcutsPrivate EShortcutsPrivate; -typedef struct _EShortcutsClass EShortcutsClass; - -struct _EShortcuts { - GtkObject parent; - - EShortcutsPrivate *priv; -}; - -struct _EShortcutsClass { - GtkObjectClass parent_class; - - /* Signals. */ - - void (* new_group) (EShortcuts *shortcuts, int group_num); - void (* remove_group) (EShortcuts *shortcuts, int group_num); - void (* new_shortcut) (EShortcuts *shortcuts, int group_num, int item_num); - void (* remove_shortcut) (EShortcuts *shortcuts, int group_num, int item_num);} -; - - -GtkType e_shortcuts_get_type (void); -void e_shortcuts_construct (EShortcuts *shortcuts, - EStorageSet *storage_set, - EFolderTypeRegistry *folder_type_registry); -EShortcuts *e_shortcuts_new (EStorageSet *storage_set, - EFolderTypeRegistry *folder_type_registry, - const char *file_name); - -GList *e_shortcuts_get_group_titles (EShortcuts *shortcuts); -GList *e_shortcuts_get_shortcuts_in_group (EShortcuts *shortcuts, - const char *group_title); -EStorageSet *e_shortcuts_get_storage_set (EShortcuts *shortcuts); -GtkWidget *e_shortcuts_new_view (EShortcuts *shortcuts); - -gboolean e_shortcuts_load (EShortcuts *shortcuts, - const char *path); -gboolean e_shortcuts_save (EShortcuts *shortcuts, - const char *path); - -const char *e_shortcuts_get_uri (EShortcuts *shortcuts, - int group_num, - int num); - -void e_shortcuts_remove_shortcut (EShortcuts *shortcuts, - int group_num, - int num); -void e_shortcuts_add_shortcut (EShortcuts *shortcuts, - int group_num, - int num, - const char *uri); -void e_shortcuts_remove_group (EShortcuts *shortcuts, - int group_num); -void e_shortcuts_add_group (EShortcuts *shortcuts, - int group_num, - const char *group_name); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHORTCUTS_H_ */ diff --git a/shell/e-storage-set-view.c b/shell/e-storage-set-view.c deleted file mode 100644 index ea7eb938ee..0000000000 --- a/shell/e-storage-set-view.c +++ /dev/null @@ -1,1003 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set-view.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> - -#include "e-util/e-util.h" -#include "e-shell-constants.h" - -#include "e-storage-set-view.h" - - -#define PARENT_TYPE GTK_TYPE_CTREE -static GtkCTreeClass *parent_class = NULL; - -struct _EStorageSetViewPrivate { - EStorageSet *storage_set; - - /* These tables must always be kept in sync, and one cannot exist - without the other, as they share the dynamically allocated path. */ - GHashTable *ctree_node_to_path; - GHashTable *path_to_ctree_node; - - /* Path of the row selected by the latest "tree_select_row" signal. */ - const char *selected_row_path; - - /* Path of the row currently being dragged. */ - const char *dragged_row_path; - - /* Path of the row that was selected before the latest click. */ - const char *selected_row_path_before_click; - - /* Whether we are currently performing a drag from this view. */ - int in_drag : 1; - - /* X/Y position for the last button click. */ - int button_x, button_y; - - /* Button used for the drag. This is initialized in the `button_press_event' - handler. */ - int drag_button; -}; - -#define DRAG_RESISTANCE 3 - - -enum { - FOLDER_SELECTED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* DND stuff. */ - -enum _DndTargetType { - DND_TARGET_TYPE_URI_LIST, - DND_TARGET_TYPE_E_SHORTCUT -}; -typedef enum _DndTargetType DndTargetType; - -#define URI_LIST_TYPE "text/uri-list" -#define E_SHORTCUT_TYPE "E-SHORTCUT" - -static GtkTargetEntry drag_types [] = { - { URI_LIST_TYPE, 0, DND_TARGET_TYPE_URI_LIST }, - { E_SHORTCUT_TYPE, 0, DND_TARGET_TYPE_E_SHORTCUT } -}; -static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]); - -static GtkTargetList *target_list; - - -/* Helper functions. */ - -static gboolean -add_node_to_hashes (EStorageSetView *storage_set_view, - const char *path, - GtkCTreeNode *node) -{ - EStorageSetViewPrivate *priv; - char *hash_path; - - g_return_val_if_fail (g_path_is_absolute (path), FALSE); - - priv = storage_set_view->priv; - - if (g_hash_table_lookup (priv->path_to_ctree_node, path) != NULL) { - g_warning ("EStorageSetView: Node already existing while adding -- %s", path); - return FALSE; - } - - g_print ("EStorageSetView: Adding -- %s\n", path); - - hash_path = g_strdup (path); - - g_hash_table_insert (priv->path_to_ctree_node, hash_path, node); - g_hash_table_insert (priv->ctree_node_to_path, node, hash_path); - - return TRUE; -} - -static GtkCTreeNode * -remove_node_from_hashes (EStorageSetView *storage_set_view, - const char *path) -{ - EStorageSetViewPrivate *priv; - GtkCTreeNode *node; - char *hash_path; - - priv = storage_set_view->priv; - - node = g_hash_table_lookup (priv->path_to_ctree_node, path); - if (node == NULL) { - g_warning ("EStorageSetView: Node not found while removing -- %s", path); - return NULL; - } - - g_print ("EStorageSetView: Removing -- %s\n", path); - - hash_path = g_hash_table_lookup (priv->ctree_node_to_path, node); - g_free (hash_path); - - g_hash_table_remove (priv->ctree_node_to_path, node); - g_hash_table_remove (priv->path_to_ctree_node, path); - - return node; -} - -static void -get_pixmap_and_mask_for_folder (EStorageSetView *storage_set_view, - EFolder *folder, - GdkPixmap **pixmap_return, - GdkBitmap **mask_return) -{ - EFolderTypeRegistry *folder_type_registry; - EStorageSet *storage_set; - const char *type_name; - GdkPixbuf *icon_pixbuf; - GdkPixbuf *scaled_pixbuf; - GdkVisual *visual; - GdkGC *gc; - - storage_set = storage_set_view->priv->storage_set; - folder_type_registry = e_storage_set_get_folder_type_registry (storage_set); - - type_name = e_folder_get_type_string (folder); - icon_pixbuf = e_folder_type_registry_get_icon_for_type (folder_type_registry, - type_name, TRUE); - - if (icon_pixbuf == NULL) { - *pixmap_return = NULL; - *mask_return = NULL; - return; - } - - scaled_pixbuf = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (icon_pixbuf), - gdk_pixbuf_get_has_alpha (icon_pixbuf), - gdk_pixbuf_get_bits_per_sample (icon_pixbuf), - E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE); - - gdk_pixbuf_scale (icon_pixbuf, scaled_pixbuf, - 0, 0, E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE, - 0.0, 0.0, - (double) E_SHELL_MINI_ICON_SIZE / gdk_pixbuf_get_width (icon_pixbuf), - (double) E_SHELL_MINI_ICON_SIZE / gdk_pixbuf_get_height (icon_pixbuf), - GDK_INTERP_HYPER); - - visual = gdk_rgb_get_visual (); - *pixmap_return = gdk_pixmap_new (NULL, - E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE, - visual->depth); - - gc = gdk_gc_new (*pixmap_return); - gdk_pixbuf_render_to_drawable (scaled_pixbuf, *pixmap_return, gc, 0, 0, 0, 0, - E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE, - GDK_RGB_DITHER_NORMAL, 0, 0); - gdk_gc_unref (gc); - - *mask_return = gdk_pixmap_new (NULL, E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE, 1); - gdk_pixbuf_render_threshold_alpha (scaled_pixbuf, *mask_return, - 0, 0, 0, 0, - E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE, - 0x7f); - - 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. */ - -static void -hash_foreach_free_path (gpointer key, - gpointer value, - gpointer data) -{ - g_free (value); -} - -static void -destroy (GtkObject *object) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - storage_set_view = E_STORAGE_SET_VIEW (object); - priv = storage_set_view->priv; - - gtk_object_unref (GTK_OBJECT (priv->storage_set)); - - g_hash_table_foreach (priv->ctree_node_to_path, hash_foreach_free_path, NULL); - g_hash_table_destroy (priv->ctree_node_to_path); - g_hash_table_destroy (priv->path_to_ctree_node); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* GtkWidget methods. */ - -static int -button_press_event (GtkWidget *widget, - GdkEventButton *event) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - storage_set_view = E_STORAGE_SET_VIEW (widget); - priv = storage_set_view->priv; - - priv->selected_row_path_before_click = priv->selected_row_path; - - (* GTK_WIDGET_CLASS (parent_class)->button_press_event) (widget, event); - - if (priv->in_drag) - return FALSE; - - priv->drag_button = event->button; - priv->button_x = event->x; - priv->button_y = event->y; - - /* KLUDGE ALERT. So look at this. We need to grab the pointer now, to check for - motion events and maybe start a drag operation. And GtkCTree seems to do it - already in the `button_press_event'. *But* for some reason something is very - broken somewhere and the grab misbehaves when done by GtkCTree's - `button_press_event'. So we have to ungrab the pointer and re-grab it our way. - Weee! */ - - gdk_pointer_ungrab (GDK_CURRENT_TIME); - gdk_flush (); - gtk_grab_remove (widget); - - gdk_pointer_grab (GTK_CLIST (widget)->clist_window, FALSE, - GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, - NULL, NULL, event->time); - gtk_grab_add (widget); - - return TRUE; -} - -static int -motion_notify_event (GtkWidget *widget, - GdkEventMotion *event) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - if (event->window != GTK_CLIST (widget)->clist_window) - return (* GTK_WIDGET_CLASS (parent_class)->motion_notify_event) (widget, event); - - storage_set_view = E_STORAGE_SET_VIEW (widget); - priv = storage_set_view->priv; - - if (priv->in_drag || priv->drag_button == 0) - return FALSE; - - if (ABS (event->x - priv->button_x) < DRAG_RESISTANCE - && ABS (event->y - priv->button_y) < DRAG_RESISTANCE) - return FALSE; - - priv->in_drag = TRUE; - priv->dragged_row_path = priv->selected_row_path; - - gtk_drag_begin (widget, target_list, GDK_ACTION_MOVE, - priv->drag_button, (GdkEvent *) event); - - 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) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - if (event->window != GTK_CLIST (widget)->clist_window) - return (* GTK_WIDGET_CLASS (parent_class)->button_release_event) (widget, event); - - storage_set_view = E_STORAGE_SET_VIEW (widget); - priv = storage_set_view->priv; - - if (! priv->in_drag) { - gdk_pointer_ungrab (GDK_CURRENT_TIME); - gtk_grab_remove (widget); - gdk_flush (); - - if (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); - } - } - - priv->selected_row_path_before_click = NULL; - - return TRUE; -} - -static void -drag_end (GtkWidget *widget, - GdkDragContext *context) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - storage_set_view = E_STORAGE_SET_VIEW (widget); - priv = storage_set_view->priv; - - if (priv->dragged_row_path != NULL) - e_storage_set_view_set_current_folder (storage_set_view, - priv->selected_row_path_before_click); - - priv->in_drag = FALSE; - priv->drag_button = 0; - priv->dragged_row_path = NULL; -} - -static void -set_uri_list_selection (EStorageSetView *storage_set_view, - GtkSelectionData *selection_data) -{ - EStorageSetViewPrivate *priv; - char *uri_list; - - priv = storage_set_view->priv; - - /* FIXME: Get `evolution:' from somewhere instead of hardcoding it here. */ - uri_list = g_strconcat ("evolution:", priv->selected_row_path, "\n", NULL); - gtk_selection_data_set (selection_data, selection_data->target, - 8, (guchar *) uri_list, strlen (uri_list)); - g_free (uri_list); -} - -static void -set_e_shortcut_selection (EStorageSetView *storage_set_view, - GtkSelectionData *selection_data) -{ - EStorageSetViewPrivate *priv; - int shortcut_len; - char *shortcut; - const char *trailing_slash; - const char *name; - - g_return_if_fail(storage_set_view != NULL); - - priv = storage_set_view->priv; - - trailing_slash = strrchr (priv->selected_row_path, '/'); - if (trailing_slash == NULL) - name = NULL; - else - name = trailing_slash + 1; - - /* FIXME: Get `evolution:' from somewhere instead of hardcoding it here. */ - - if (name != NULL) - shortcut_len = strlen (name); - else - shortcut_len = 0; - - shortcut_len ++; /* Separating zero. */ - - shortcut_len += strlen ("evolution:"); - shortcut_len += strlen (priv->selected_row_path); - shortcut_len ++; /* Trailing zero. */ - - shortcut = g_malloc (shortcut_len); - - if (name == NULL) - sprintf (shortcut, "%cevolution:%s", '\0', priv->selected_row_path); - else - sprintf (shortcut, "%s%cevolution:%s", name, '\0', priv->selected_row_path); - - gtk_selection_data_set (selection_data, selection_data->target, - 8, (guchar *) shortcut, shortcut_len); - - g_free (shortcut); -} - -static void -drag_data_get (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint32 time) -{ - EStorageSetView *storage_set_view; - - storage_set_view = E_STORAGE_SET_VIEW (widget); - - switch (info) { - case DND_TARGET_TYPE_URI_LIST: - set_uri_list_selection (storage_set_view, selection_data); - break; - case DND_TARGET_TYPE_E_SHORTCUT: - set_e_shortcut_selection (storage_set_view, selection_data); - break; - default: - g_assert_not_reached (); - } -} - - -/* StorageSet signal handling. */ - -static void -new_storage_cb (EStorageSet *storage_set, - EStorage *storage, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - GtkCTreeNode *node; - char *text[2]; - char *path; - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - - path = g_strconcat (G_DIR_SEPARATOR_S, e_storage_get_name (storage), NULL); - - text[0] = (char *) e_storage_get_name (storage); /* Yuck. */ - text[1] = NULL; - - node = gtk_ctree_insert_node (GTK_CTREE (storage_set_view), NULL, NULL, - text, 3, NULL, NULL, NULL, NULL, FALSE, TRUE); - - if (! add_node_to_hashes (storage_set_view, path, node)) { - g_free (path); - gtk_ctree_remove_node (GTK_CTREE (storage_set_view), node); - return; - } - - g_free (path); - - /* FIXME: We want a more specialized sort, e.g. the local folders should always be - on top. */ - gtk_ctree_sort_node (GTK_CTREE (storage_set_view), NULL); -} - -static void -removed_storage_cb (EStorageSet *storage_set, - EStorage *storage, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - GtkCTreeNode *node; - char *path; - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - - path = g_strconcat (G_DIR_SEPARATOR_S, e_storage_get_name (storage), NULL); - node = remove_node_from_hashes (storage_set_view, path); - g_free (path); - - gtk_ctree_remove_node (GTK_CTREE (storage_set_view), node); -} - -static void -new_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - GtkCTreeNode *parent_node; - GtkCTreeNode *node; - GdkPixmap *pixmap; - GdkBitmap *mask; - char *text[2]; - const char *last_separator; - char *parent_path; - - g_return_if_fail (g_path_is_absolute (path)); - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - - last_separator = strrchr (path, G_DIR_SEPARATOR); - - parent_path = g_strndup (path, last_separator - path); - parent_node = g_hash_table_lookup (priv->path_to_ctree_node, parent_path); - if (parent_node == NULL) { - g_print ("EStorageSetView: EStorageSet reported new subfolder for non-existing folder -- %s\n", - parent_path); - g_free (parent_path); - return; - } - - g_free (parent_path); - - if (parent_node == NULL) - return; - - text[0] = (char *) last_separator + 1; /* Yuck. */ - text[1] = NULL; - - get_pixmap_and_mask_for_folder (storage_set_view, - e_storage_set_get_folder (storage_set, path), - &pixmap, &mask); - node = gtk_ctree_insert_node (GTK_CTREE (storage_set_view), - parent_node, NULL, - text, 3, - pixmap, mask, pixmap, mask, - FALSE, TRUE); - - if (! add_node_to_hashes (storage_set_view, path, node)) { - gtk_ctree_remove_node (GTK_CTREE (storage_set_view), node); - return; - } - - gtk_ctree_sort_node (GTK_CTREE (storage_set_view), parent_node); -} - -static void -removed_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - EStorageSetView *storage_set_view; - GtkCTreeNode *node; - - storage_set_view = E_STORAGE_SET_VIEW (data); - - node = remove_node_from_hashes (storage_set_view, path); - gtk_ctree_remove_node (GTK_CTREE (storage_set_view), node); -} - - -/* GtkCTree methods. */ - -static void -tree_select_row (GtkCTree *ctree, - GtkCTreeNode *row, - gint column) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - const char *path; - - (* GTK_CTREE_CLASS (parent_class)->tree_select_row) (ctree, row, column); - - storage_set_view = E_STORAGE_SET_VIEW (ctree); - priv = storage_set_view->priv; - - path = g_hash_table_lookup (storage_set_view->priv->ctree_node_to_path, row); - if (path == NULL) - return; - - priv->selected_row_path = path; -} - - -static void -class_init (EStorageSetViewClass *klass) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkCTreeClass *ctree_class; - - parent_class = gtk_type_class (gtk_ctree_get_type ()); - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - widget_class = GTK_WIDGET_CLASS (klass); - widget_class->button_press_event = button_press_event; - widget_class->motion_notify_event = motion_notify_event; - widget_class->button_release_event = button_release_event; - widget_class->drag_end = drag_end; - widget_class->drag_data_get = drag_data_get; - - ctree_class = GTK_CTREE_CLASS (klass); - ctree_class->tree_select_row = tree_select_row; - - signals[FOLDER_SELECTED] - = gtk_signal_new ("folder_selected", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EStorageSetViewClass, folder_selected), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); - - /* Set up DND. */ - - target_list = gtk_target_list_new (drag_types, num_drag_types); - g_assert (target_list != NULL); -} - -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); - - priv = g_new (EStorageSetViewPrivate, 1); - - priv->storage_set = NULL; - priv->ctree_node_to_path = g_hash_table_new (g_direct_hash, g_direct_equal); - priv->path_to_ctree_node = g_hash_table_new (g_str_hash, g_str_equal); - priv->selected_row_path = NULL; - priv->dragged_row_path = NULL; - priv->selected_row_path_before_click = NULL; - priv->in_drag = FALSE; - priv->button_x = 0; - 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; -} - - -static int -folder_compare_cb (gconstpointer a, gconstpointer b) -{ - EFolder *folder_a; - EFolder *folder_b; - const char *name_a; - const char *name_b; - - folder_a = E_FOLDER (a); - folder_b = E_FOLDER (b); - - name_a = e_folder_get_name (folder_a); - name_b = e_folder_get_name (folder_b); - - return strcmp (name_a, name_b); -} - -static void -insert_folders (EStorageSetView *storage_set_view, - GtkCTreeNode *parent, - EStorage *storage, - const char *path, - int level) -{ - EStorageSetViewPrivate *priv; - GtkCTree *ctree; - GtkCTreeNode *node; - GList *folder_list; - GList *p; - const char *storage_name; - - ctree = GTK_CTREE (storage_set_view); - priv = storage_set_view->priv; - - storage_name = e_storage_get_name (storage); - - folder_list = e_storage_list_folders (storage, path); - if (folder_list == NULL) - return; - - folder_list = g_list_sort (folder_list, folder_compare_cb); - - for (p = folder_list; p != NULL; p = p->next) { - EFolder *folder; - const char *folder_name; - char *text[2]; - char *subpath; - char *full_path; - GdkPixmap *pixmap; - GdkBitmap *mask; - - folder = E_FOLDER (p->data); - folder_name = e_folder_get_name (folder); - - text[0] = (char *) folder_name; /* Yuck. */ - text[1] = NULL; - - get_pixmap_and_mask_for_folder (storage_set_view, folder, &pixmap, &mask); - node = gtk_ctree_insert_node (ctree, parent, NULL, - text, 3, - pixmap, mask, pixmap, mask, - FALSE, TRUE); - - subpath = g_concat_dir_and_file (path, folder_name); - insert_folders (storage_set_view, node, storage, subpath, level + 1); - - full_path = g_strconcat("/", storage_name, subpath, NULL); - g_hash_table_insert (priv->ctree_node_to_path, node, full_path); - g_hash_table_insert (priv->path_to_ctree_node, full_path, node); - - g_free (subpath); - } - - e_free_object_list (folder_list); -} - -void -e_storage_set_view_construct (EStorageSetView *storage_set_view, - EStorageSet *storage_set) -{ - EStorageSetViewPrivate *priv; - GtkCTreeNode *parent; - GtkCTree *ctree; - EStorage *storage; - GList *storage_list; - GList *p; - const char *name; - char *text[2]; - char *path; - - g_return_if_fail (storage_set_view != NULL); - g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view)); - g_return_if_fail (storage_set != NULL); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - - ctree = GTK_CTREE (storage_set_view); - priv = storage_set_view->priv; - - /* Set up GtkCTree/GtkCList parameters. */ - - gtk_ctree_construct (ctree, 1, 0, NULL); - gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED); - gtk_ctree_set_expander_style (ctree, GTK_CTREE_EXPANDER_SQUARE); - - gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_BROWSE); - gtk_clist_set_row_height (GTK_CLIST (ctree), E_SHELL_MINI_ICON_SIZE); - gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE); - - gtk_object_ref (GTK_OBJECT (storage_set)); - priv->storage_set = storage_set; - - gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "new_storage", - GTK_SIGNAL_FUNC (new_storage_cb), storage_set_view, - GTK_OBJECT (storage_set_view)); - gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "removed_storage", - GTK_SIGNAL_FUNC (removed_storage_cb), storage_set_view, - GTK_OBJECT (storage_set_view)); - gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "new_folder", - GTK_SIGNAL_FUNC (new_folder_cb), storage_set_view, - GTK_OBJECT (storage_set_view)); - gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "removed_folder", - GTK_SIGNAL_FUNC (removed_folder_cb), storage_set_view, - GTK_OBJECT (storage_set_view)); - - storage_list = e_storage_set_get_storage_list (storage_set); - - text[1] = NULL; - - for (p = storage_list; p != NULL; p = p->next) { - storage = E_STORAGE (p->data); - - name = e_storage_get_name (storage); - text[0] = (char *) name; /* Yuck. */ - - parent = gtk_ctree_insert_node (ctree, NULL, NULL, - text, 3, - NULL, NULL, NULL, NULL, - FALSE, TRUE); - - path = g_strconcat ("/", name, NULL); - g_hash_table_insert (priv->ctree_node_to_path, parent, path); - g_hash_table_insert (priv->path_to_ctree_node, path, parent); - - insert_folders (storage_set_view, parent, storage, "/", 1); - } - - e_free_object_list (storage_list); -} - -GtkWidget * -e_storage_set_view_new (EStorageSet *storage_set) -{ - GtkWidget *new; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - - new = gtk_type_new (e_storage_set_view_get_type ()); - e_storage_set_view_construct (E_STORAGE_SET_VIEW (new), storage_set); - - return new; -} - - -void -e_storage_set_view_set_current_folder (EStorageSetView *storage_set_view, - const char *path) -{ - EStorageSetViewPrivate *priv; - GtkCTreeNode *node; - - g_return_if_fail (storage_set_view != NULL); - g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view)); - g_return_if_fail (path == NULL || g_path_is_absolute (path)); - - priv = storage_set_view->priv; - - if (path == NULL) { - gtk_clist_unselect_all (GTK_CLIST (storage_set_view)); - return; - } - - node = g_hash_table_lookup (priv->path_to_ctree_node, path); - if (node == NULL) { - gtk_clist_unselect_all (GTK_CLIST (storage_set_view)); - return; - } - - gtk_ctree_select (GTK_CTREE (storage_set_view), node); - - gtk_signal_emit (GTK_OBJECT (storage_set_view), signals[FOLDER_SELECTED], path); -} - -const char * -e_storage_set_view_get_current_folder (EStorageSetView *storage_set_view) -{ - EStorageSetViewPrivate *priv; - GtkCList *clist; - GtkCTree *ctree; - GtkCTreeRow *ctree_row; - GtkCTreeNode *ctree_node; - const char *path; - - g_return_val_if_fail (storage_set_view != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view), NULL); - - priv = storage_set_view->priv; - - clist = GTK_CLIST (storage_set_view); - ctree = GTK_CTREE (storage_set_view); - - if (clist->selection == NULL) - return NULL; - - ctree_row = GTK_CTREE_ROW (clist->selection->data); - ctree_node = gtk_ctree_find_node_ptr (ctree, ctree_row); - if (ctree_node == NULL) - return NULL; /* Mmh? */ - - path = g_hash_table_lookup (priv->ctree_node_to_path, ctree_node); - - return path; -} - - -E_MAKE_TYPE (e_storage_set_view, "EStorageSetView", EStorageSetView, class_init, init, PARENT_TYPE) diff --git a/shell/e-storage-set-view.h b/shell/e-storage-set-view.h deleted file mode 100644 index 098de0d2a7..0000000000 --- a/shell/e-storage-set-view.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set-view.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_STORAGE_SET_VIEW_H__ -#define __E_STORAGE_SET_VIEW_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkctree.h> -#include "e-storage-set.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_STORAGE_SET_VIEW (e_storage_set_view_get_type ()) -#define E_STORAGE_SET_VIEW(obj) (GTK_CHECK_CAST ((obj), E_TYPE_STORAGE_SET_VIEW, EStorageSetView)) -#define E_STORAGE_SET_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_STORAGE_SET_VIEW, EStorageSetViewClass)) -#define E_IS_STORAGE_SET_VIEW(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_STORAGE_SET_VIEW)) -#define E_IS_STORAGE_SET_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_STORAGE_SET_VIEW)) - - -typedef struct _EStorageSetView EStorageSetView; -typedef struct _EStorageSetViewPrivate EStorageSetViewPrivate; -typedef struct _EStorageSetViewClass EStorageSetViewClass; - -struct _EStorageSetView { - GtkCTree parent; - - EStorageSetViewPrivate *priv; -}; - -struct _EStorageSetViewClass { - GtkCTreeClass parent_class; - - /* Signals. */ - - void (* folder_selected) (EStorageSetView *storage_set_view, - const char *uri); -}; - - -GtkType e_storage_set_view_get_type (void); -GtkWidget *e_storage_set_view_new (EStorageSet *storage_set); -void e_storage_set_view_construct (EStorageSetView *storage_set_view, - EStorageSet *storage_set); -void e_storage_set_view_set_current_folder (EStorageSetView *storage_set_view, - const char *path); -const char *e_storage_set_view_get_current_folder (EStorageSetView *storage_set_view); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_STORAGE_SET_VIEW_H__ */ diff --git a/shell/e-storage-set.c b/shell/e-storage-set.c deleted file mode 100644 index 7b18d93c1c..0000000000 --- a/shell/e-storage-set.c +++ /dev/null @@ -1,576 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> -#include <gtk/gtktypeutils.h> - -#include <string.h> - -#include "e-util/e-util.h" - -#include "e-storage-set-view.h" -#include "e-storage-set.h" - - -#define PARENT_TYPE GTK_TYPE_OBJECT - -static GtkObjectClass *parent_class = NULL; - -/* This is just to make GHashTable happy. */ -struct _NamedStorage { - char *name; - EStorage *storage; -}; -typedef struct _NamedStorage NamedStorage; - -struct _EStorageSetPrivate { - GList *storages; /* EStorage */ - GHashTable *name_to_named_storage; - - EFolderTypeRegistry *folder_type_registry; -}; - -enum { - NEW_STORAGE, - REMOVED_STORAGE, - NEW_FOLDER, - REMOVED_FOLDER, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -static NamedStorage * -named_storage_new (EStorage *storage) -{ - NamedStorage *new; - - new = g_new (NamedStorage, 1); - new->name = g_strdup (e_storage_get_name (storage)); - new->storage = storage; - - return new; -} - -static void -named_storage_destroy (NamedStorage *named_storage) -{ - g_free (named_storage->name); - g_free (named_storage); -} - -static gboolean -name_to_named_storage_foreach_destroy (void *key, - void *value, - void *user_data) -{ - NamedStorage *named_storage; - - named_storage = (NamedStorage *) value; - named_storage_destroy (named_storage); - - return TRUE; -} - - -/* Handling for signals coming from the EStorages. */ - -static char * -make_full_path (EStorage *storage, - const char *path) -{ - const char *storage_name; - char *full_path; - - storage_name = e_storage_get_name (storage); - - if (! g_path_is_absolute (path)) - full_path = g_strconcat (G_DIR_SEPARATOR_S, storage_name, - G_DIR_SEPARATOR_S, path, NULL); - else - full_path = g_strconcat (G_DIR_SEPARATOR_S, storage_name, - path, NULL); - - return full_path; -} - -static void -storage_new_folder_cb (EStorage *storage, - const char *path, - void *data) -{ - EStorageSet *storage_set; - char *full_path; - - storage_set = E_STORAGE_SET (data); - - full_path = make_full_path (storage, path); - gtk_signal_emit (GTK_OBJECT (storage_set), signals[NEW_FOLDER], full_path); - g_free (full_path); -} - -static void -storage_removed_folder_cb (EStorage *storage, - const char *path, - void *data) -{ - EStorageSet *storage_set; - char *full_path; - - storage_set = E_STORAGE_SET (data); - - full_path = make_full_path (storage, path); - g_print ("EStorageSet: Removed folder -- %s\n", full_path); - gtk_signal_emit (GTK_OBJECT (storage_set), signals[REMOVED_FOLDER], full_path); - g_free (full_path); -} - - -static EStorage * -get_storage_for_path (EStorageSet *storage_set, - const char *path, - const char **subpath_return) -{ - EStorage *storage; - char *storage_name; - const char *first_separator; - - g_return_val_if_fail (g_path_is_absolute (path), NULL); - - /* Skip initial separator. */ - path++; - - first_separator = strchr (path, G_DIR_SEPARATOR); - - if (first_separator == NULL || first_separator == path || first_separator[1] == 0) { - *subpath_return = NULL; - return NULL; - } - - storage_name = g_strndup (path, first_separator - path); - storage = e_storage_set_get_storage (storage_set, storage_name); - g_free (storage_name); - - *subpath_return = first_separator; - - return storage; -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EStorageSet *storage_set; - EStorageSetPrivate *priv; - - storage_set = E_STORAGE_SET (object); - priv = storage_set->priv; - - e_free_object_list (priv->storages); - - gtk_object_unref (GTK_OBJECT (priv->folder_type_registry)); - - g_hash_table_foreach (priv->name_to_named_storage, - (GHFunc) named_storage_destroy, NULL); - g_hash_table_destroy (priv->name_to_named_storage); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (EStorageSetClass *klass) -{ - GtkObjectClass *object_class; - - parent_class = gtk_type_class (gtk_object_get_type ()); - object_class = GTK_OBJECT_CLASS (klass); - - object_class->destroy = destroy; - - signals[NEW_STORAGE] = - gtk_signal_new ("new_storage", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EStorageSetClass, new_storage), - gtk_marshal_NONE__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_POINTER); - signals[REMOVED_STORAGE] = - gtk_signal_new ("removed_storage", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EStorageSetClass, removed_storage), - gtk_marshal_NONE__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_POINTER); - signals[NEW_FOLDER] = - gtk_signal_new ("new_folder", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EStorageSetClass, new_folder), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - signals[REMOVED_FOLDER] = - gtk_signal_new ("removed_folder", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EStorageSetClass, removed_folder), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EStorageSet *storage_set) -{ - EStorageSetPrivate *priv; - - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - - priv = g_new (EStorageSetPrivate, 1); - priv->storages = NULL; - priv->name_to_named_storage = g_hash_table_new (g_str_hash, g_str_equal); - priv->folder_type_registry = NULL; - - storage_set->priv = priv; -} - - -void -e_storage_set_construct (EStorageSet *storage_set, - EFolderTypeRegistry *folder_type_registry) -{ - g_return_if_fail (storage_set != NULL); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - - GTK_OBJECT_UNSET_FLAGS (storage_set, GTK_FLOATING); - - gtk_object_ref (GTK_OBJECT (folder_type_registry)); - storage_set->priv->folder_type_registry = folder_type_registry; -} - -EStorageSet * -e_storage_set_new (EFolderTypeRegistry *folder_type_registry) -{ - EStorageSet *new; - - new = gtk_type_new (e_storage_set_get_type ()); - - e_storage_set_construct (new, folder_type_registry); - - return new; -} - - -GList * -e_storage_set_get_storage_list (EStorageSet *storage_set) -{ - EStorageSetPrivate *priv; - GList *list; - GList *p; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - - priv = storage_set->priv; - - list = NULL; - for (p = priv->storages; p != NULL; p = p->next) { - gtk_object_ref (GTK_OBJECT (p->data)); - list = g_list_prepend (list, p->data); - } - - return g_list_reverse (list); /* Lame. */ -} - -/** - * e_storage_set_add_storage: - * @storage_set: - * @storage: - * - * Add @storage to @storage_set. Notice that will ref the storage. - **/ -gboolean -e_storage_set_add_storage (EStorageSet *storage_set, - EStorage *storage) -{ - EStorageSetPrivate *priv; - const char *storage_name; - NamedStorage *named_storage; - - g_return_val_if_fail (storage_set != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), FALSE); - g_return_val_if_fail (storage != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE (storage), FALSE); - - priv = storage_set->priv; - - storage_name = e_storage_get_name (storage); - if (g_hash_table_lookup (priv->name_to_named_storage, storage_name) != NULL) - return FALSE; - - gtk_object_ref (GTK_OBJECT (storage)); - - gtk_signal_connect (GTK_OBJECT (storage), "new_folder", - GTK_SIGNAL_FUNC (storage_new_folder_cb), storage_set); - gtk_signal_connect (GTK_OBJECT (storage), "removed_folder", - GTK_SIGNAL_FUNC (storage_removed_folder_cb), storage_set); - - priv->storages = g_list_append (priv->storages, storage); - - named_storage = named_storage_new (storage); - g_hash_table_insert (priv->name_to_named_storage, named_storage->name, named_storage); - - gtk_signal_emit (GTK_OBJECT (storage_set), signals[NEW_STORAGE], storage); - - return TRUE; -} - -gboolean -e_storage_set_remove_storage (EStorageSet *storage_set, - EStorage *storage) -{ - EStorageSetPrivate *priv; - NamedStorage *named_storage; - - g_return_val_if_fail (storage_set != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), FALSE); - g_return_val_if_fail (storage != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE (storage), FALSE); - - priv = storage_set->priv; - - named_storage = g_hash_table_lookup (priv->name_to_named_storage, - e_storage_get_name (storage)); - if (named_storage == NULL) - return FALSE; - - g_hash_table_remove (priv->name_to_named_storage, named_storage->name); - named_storage_destroy (named_storage); - - priv->storages = g_list_remove (priv->storages, storage); - - gtk_signal_emit (GTK_OBJECT (storage_set), signals[REMOVED_STORAGE], storage); - gtk_object_unref (GTK_OBJECT (storage)); - - return TRUE; -} - -void -e_storage_set_remove_all_storages (EStorageSet *storage_set) -{ - EStorageSetPrivate *priv; - GList *p; - - g_return_if_fail (storage_set != NULL); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - - priv = storage_set->priv; - - for (p = priv->storages; p != NULL; p = p->next) { - EStorage *storage; - - storage = E_STORAGE (p->data); - - gtk_signal_emit (GTK_OBJECT (storage_set), signals[REMOVED_STORAGE], storage); - gtk_object_unref (GTK_OBJECT (storage)); - } - - g_hash_table_foreach_remove (priv->name_to_named_storage, - name_to_named_storage_foreach_destroy, - NULL); - - g_list_free (priv->storages); - priv->storages = NULL; -} - - -EStorage * -e_storage_set_get_storage (EStorageSet *storage_set, - const char *name) -{ - EStorageSetPrivate *priv; - NamedStorage *named_storage; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - g_return_val_if_fail (name != NULL, NULL); - - priv = storage_set->priv; - - named_storage = g_hash_table_lookup (priv->name_to_named_storage, name); - if (named_storage == NULL) - return NULL; - else - return named_storage->storage; -} - -EFolder * -e_storage_set_get_folder (EStorageSet *storage_set, - const char *path) -{ - EStorage *storage; - const char *subpath; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (g_path_is_absolute (path), NULL); - - storage = get_storage_for_path (storage_set, path, &subpath); - - return e_storage_get_folder (storage, subpath); -} - - -GtkWidget * -e_storage_set_new_view (EStorageSet *storage_set) -{ - GtkWidget *storage_set_view; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - - storage_set_view = e_storage_set_view_new (storage_set); - - return storage_set_view; -} - - -void -e_storage_set_async_create_folder (EStorageSet *storage_set, - const char *path, - const char *type, - const char *description, - EStorageResultCallback callback, - void *data) -{ - EStorage *storage; - const char *subpath; - - g_return_if_fail (storage_set != NULL); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - g_return_if_fail (path != NULL); - g_return_if_fail (g_path_is_absolute (path)); - g_return_if_fail (type != NULL); - g_return_if_fail (callback != NULL); - - storage = get_storage_for_path (storage_set, path, &subpath); - - e_storage_async_create_folder (storage, subpath, type, description, callback, data); -} - -void -e_storage_set_async_remove_folder (EStorageSet *storage_set, - const char *path, - EStorageResultCallback callback, - void *data) -{ - EStorage *storage; - const char *subpath; - - g_return_if_fail (storage_set != NULL); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - g_return_if_fail (path != NULL); - g_return_if_fail (g_path_is_absolute (path)); - g_return_if_fail (callback != NULL); - - storage = get_storage_for_path (storage_set, path, &subpath); - - e_storage_async_remove_folder (storage, path, callback, data); -} - - -EFolderTypeRegistry * -e_storage_set_get_folder_type_registry (EStorageSet *storage_set) -{ - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - - return storage_set->priv->folder_type_registry; -} - - -/* Utility functions. */ - -/** - * e_storage_set_get_path_for_physical_uri: - * @storage_set: A storage set - * @physical_uri: A physical URI - * - * Retrieve the path of the folder whose physical URI matches @physical_uri. - * - * Return value: - **/ -char * -e_storage_set_get_path_for_physical_uri (EStorageSet *storage_set, - const char *physical_uri) -{ - EStorageSetPrivate *priv; - GList *p; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - g_return_val_if_fail (physical_uri != NULL, NULL); - - priv = storage_set->priv; - - for (p = priv->storages; p != NULL; p = p->next) { - EStorage *storage; - char *storage_path; - - storage = E_STORAGE (p->data); - - storage_path = e_storage_get_path_for_physical_uri (storage, physical_uri); - if (storage_path != NULL) { - char *storage_set_path; - - storage_set_path = g_strconcat (G_DIR_SEPARATOR_S, - e_storage_get_name (storage), - storage_path, - NULL); - g_free (storage_path); - - return storage_set_path; - } - } - - return NULL; -} - - -E_MAKE_TYPE (e_storage_set, "EStorageSet", EStorageSet, class_init, init, PARENT_TYPE) diff --git a/shell/e-storage-set.h b/shell/e-storage-set.h deleted file mode 100644 index cc0d34811a..0000000000 --- a/shell/e-storage-set.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_STORAGE_SET_H_ -#define _E_STORAGE_SET_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkwidget.h> - -#include "e-folder-type-registry.h" -#include "e-storage.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_STORAGE_SET (e_storage_set_get_type ()) -#define E_STORAGE_SET(obj) (GTK_CHECK_CAST ((obj), E_TYPE_STORAGE_SET, EStorageSet)) -#define E_STORAGE_SET_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_STORAGE_SET, EStorageSetClass)) -#define E_IS_STORAGE_SET(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_STORAGE_SET)) -#define E_IS_STORAGE_SET_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_STORAGE_SET)) - - -typedef struct _EStorageSet EStorageSet; -typedef struct _EStorageSetPrivate EStorageSetPrivate; -typedef struct _EStorageSetClass EStorageSetClass; - -struct _EStorageSet { - GtkObject parent; - - EStorageSetPrivate *priv; -}; - -struct _EStorageSetClass { - GtkObjectClass parent_class; - - /* Signals. */ - - void (* new_storage) (EStorageSet *storage_set, EStorage *storage); - void (* removed_storage) (EStorageSet *storage_set, EStorage *storage); - /* FIXME? Inconsistency between storage and folders. */ - void (* new_folder) (EStorageSet *storage_set, const char *path); - void (* removed_folder) (EStorageSet *storage_set, const char *path); -}; - - -GtkType e_storage_set_get_type (void); -void e_storage_set_construct (EStorageSet *storage_set, - EFolderTypeRegistry *folder_type_registry); -EStorageSet *e_storage_set_new (EFolderTypeRegistry *folder_type_registry); - -gboolean e_storage_set_add_storage (EStorageSet *storage_set, - EStorage *storage); -gboolean e_storage_set_remove_storage (EStorageSet *storage_set, - EStorage *storage); -void e_storage_set_remove_all_storages (EStorageSet *storage_set); - -GList *e_storage_set_get_storage_list (EStorageSet *storage_set); -EStorage *e_storage_set_get_storage (EStorageSet *storage_set, - const char *storage_name); -EFolder *e_storage_set_get_folder (EStorageSet *storage_set, - const char *path); - -GtkWidget *e_storage_set_new_view (EStorageSet *storage_set); - -void e_storage_set_async_create_folder (EStorageSet *storage_set, - const char *path, - const char *type, - const char *description, - EStorageResultCallback callback, - void *data); -void e_storage_set_async_remove_folder (EStorageSet *storage_set, - const char *path, - EStorageResultCallback callback, - void *data); - -EFolderTypeRegistry *e_storage_set_get_folder_type_registry (EStorageSet *storage_set); - -/* Utility functions. */ - -char *e_storage_set_get_path_for_physical_uri (EStorageSet *storage_set, - const char *physical_uri); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_STORAGE_SET_H_ */ diff --git a/shell/e-storage.c b/shell/e-storage.c deleted file mode 100644 index eb03cb36a0..0000000000 --- a/shell/e-storage.c +++ /dev/null @@ -1,593 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> - -#include <gnome.h> - -#include "e-util/e-util.h" - -#include "e-storage.h" - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - -#define ES_CLASS(obj) \ - E_STORAGE_CLASS (GTK_OBJECT (obj)->klass) - -/* This describes a folder and its children. */ -struct _Folder { - struct _Folder *parent; - - char *path; - EFolder *e_folder; - GList *subfolders; -}; -typedef struct _Folder Folder; - -struct _EStoragePrivate { - GHashTable *path_to_folder; /* Folder */ -}; - -enum { - NEW_FOLDER, - REMOVED_FOLDER, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Folder handling. */ - -static Folder * -folder_new (EFolder *e_folder, - const char *path) -{ - Folder *folder; - - folder = g_new (Folder, 1); - folder->path = g_strdup (path); - folder->parent = NULL; - folder->e_folder = e_folder; - folder->subfolders = NULL; - - return folder; -} - -static void -folder_remove_subfolder (Folder *folder, Folder *subfolder) -{ - g_list_remove (folder->subfolders, folder); -} - -static void -folder_add_subfolder (Folder *folder, Folder *subfolder) -{ - folder->subfolders = g_list_prepend (folder->subfolders, subfolder); - subfolder->parent = folder; -} - -static void -folder_destroy (Folder *folder) -{ - g_assert (folder->subfolders == NULL); - - if (folder->parent != NULL) - folder_remove_subfolder (folder->parent, folder); - - g_free (folder->path); - - if (folder->e_folder != NULL) - gtk_object_unref (GTK_OBJECT (folder->e_folder)); - - g_free (folder); -} - -static void -remove_folder (EStorage *storage, - Folder *folder) -{ - EStoragePrivate *priv; - - priv = storage->priv; - - if (folder->subfolders != NULL) { - GList *p; - - for (p = folder->subfolders; p != NULL; p = p->next) { - Folder *subfolder; - - subfolder = (Folder *) p->data; - remove_folder (storage, subfolder); - } - - g_list_free (folder->subfolders); - folder->subfolders = NULL; - } - - g_hash_table_remove (priv->path_to_folder, folder->path); - - folder_destroy (folder); -} - -static void -free_private (EStorage *storage) -{ - EStoragePrivate *priv; - Folder *root_folder; - - priv = storage->priv; - - root_folder = g_hash_table_lookup (priv->path_to_folder, G_DIR_SEPARATOR_S); - remove_folder (storage, root_folder); - - g_hash_table_destroy (priv->path_to_folder); - - g_free (priv); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EStorage *storage; - - storage = E_STORAGE (object); - - free_private (storage); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* EStorage methods. */ - -static GList * -impl_list_folders (EStorage *storage, - const char *path) -{ - Folder *folder; - Folder *subfolder; - GList *list; - GList *p; - - folder = g_hash_table_lookup (storage->priv->path_to_folder, path); - if (folder == NULL) - return NULL; - - list = NULL; - for (p = folder->subfolders; p != NULL; p = p->next) { - subfolder = (Folder *) p->data; - - gtk_object_ref (GTK_OBJECT (subfolder->e_folder)); - list = g_list_prepend (list, subfolder->e_folder); - } - - return list; -} - -static EFolder * -impl_get_folder (EStorage *storage, - const char *path) -{ - EStoragePrivate *priv; - Folder *folder; - - priv = storage->priv; - - folder = g_hash_table_lookup (priv->path_to_folder, path); - if (folder == NULL) - return NULL; - - return folder->e_folder; -} - -static const char * -impl_get_name (EStorage *storage) -{ - return _("(No name)"); -} - -static void -impl_async_create_folder (EStorage *storage, - const char *path, - const char *type, - const char *description, - EStorageResultCallback callback, - void *data) -{ - (* callback) (storage, E_STORAGE_NOTIMPLEMENTED, data); -} - -static void -impl_async_remove_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data) -{ - (* callback) (storage, E_STORAGE_NOTIMPLEMENTED, data); -} - - -/* Initialization. */ - -static void -class_init (EStorageClass *class) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (class); - parent_class = gtk_type_class (gtk_object_get_type ()); - - object_class->destroy = destroy; - - class->list_folders = impl_list_folders; - class->get_folder = impl_get_folder; - class->get_name = impl_get_name; - class->async_create_folder = impl_async_create_folder; - class->async_remove_folder = impl_async_remove_folder; - - signals[NEW_FOLDER] = - gtk_signal_new ("new_folder", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EStorageClass, new_folder), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - signals[REMOVED_FOLDER] = - gtk_signal_new ("removed_folder", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EStorageClass, removed_folder), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EStorage *storage) -{ - EStoragePrivate *priv; - - priv = g_new (EStoragePrivate, 1); - priv->path_to_folder = g_hash_table_new (g_str_hash, g_str_equal); - - storage->priv = priv; -} - - -/* Creation. */ - -void -e_storage_construct (EStorage *storage) -{ - Folder *root_folder; - - g_return_if_fail (storage != NULL); - g_return_if_fail (E_IS_STORAGE (storage)); - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (storage), GTK_FLOATING); - - root_folder = folder_new (NULL, G_DIR_SEPARATOR_S); - g_hash_table_insert (storage->priv->path_to_folder, root_folder->path, root_folder); -} - -EStorage * -e_storage_new (void) -{ - EStorage *new; - - new = gtk_type_new (e_storage_get_type ()); - - e_storage_construct (new); - - return new; -} - - -gboolean -e_storage_path_is_absolute (const char *path) -{ - g_return_val_if_fail (path != NULL, FALSE); - - return *path == G_DIR_SEPARATOR; -} - -gboolean -e_storage_path_is_relative (const char *path) -{ - g_return_val_if_fail (path != NULL, FALSE); - - return *path != G_DIR_SEPARATOR; -} - - -GList * -e_storage_list_folders (EStorage *storage, - const char *path) -{ - g_return_val_if_fail (storage != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE (storage), NULL); - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (g_path_is_absolute (path), NULL); - - return (* ES_CLASS (storage)->list_folders) (storage, path); -} - -EFolder * -e_storage_get_folder (EStorage *storage, - const char *path) -{ - g_return_val_if_fail (storage != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE (storage), NULL); - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (e_storage_path_is_absolute (path), NULL); - - return (* ES_CLASS (storage)->get_folder) (storage, path); -} - -const char * -e_storage_get_name (EStorage *storage) -{ - g_return_val_if_fail (storage != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE (storage), NULL); - - return (* ES_CLASS (storage)->get_name) (storage); -} - - -/* Folder operations. */ - -void -e_storage_async_create_folder (EStorage *storage, - const char *path, - const char *type, - const char *description, - EStorageResultCallback callback, - void *data) -{ - g_return_if_fail (storage != NULL); - g_return_if_fail (E_IS_STORAGE (storage)); - g_return_if_fail (path != NULL); - g_return_if_fail (g_path_is_absolute (path)); - g_return_if_fail (type != NULL); - g_return_if_fail (callback != NULL); - - (* ES_CLASS (storage)->async_create_folder) (storage, path, type, description, callback, data); -} - -void -e_storage_async_remove_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data) -{ - g_return_if_fail (storage != NULL); - g_return_if_fail (E_IS_STORAGE (storage)); - g_return_if_fail (path != NULL); - g_return_if_fail (g_path_is_absolute (path)); - g_return_if_fail (callback != NULL); - - (* ES_CLASS (storage)->async_remove_folder) (storage, path, callback, data); -} - - -const char * -e_storage_result_to_string (EStorageResult result) -{ - switch (result) { - case E_STORAGE_OK: - return _("No error"); - case E_STORAGE_GENERICERROR: - return _("Generic error"); - case E_STORAGE_EXISTS: - return _("A folder with the same name already exists"); - case E_STORAGE_INVALIDTYPE: - return _("The specified folder type is not valid"); - case E_STORAGE_IOERROR: - return _("I/O error"); - case E_STORAGE_NOSPACE: - return _("Not enough space to create the folder"); - case E_STORAGE_NOTFOUND: - return _("The specified folder was not found"); - case E_STORAGE_NOTIMPLEMENTED: - return _("Function not implemented in this storage"); - case E_STORAGE_PERMISSIONDENIED: - return _("Permission denied"); - case E_STORAGE_UNSUPPORTEDOPERATION: - return _("Operation not supported"); - case E_STORAGE_UNSUPPORTEDTYPE: - return _("The specified type is not supported in this storage"); - default: - return _("Unknown error"); - } -} - - -/* Utility functions. */ - -struct _GetPathForPhysicalUriForeachData { - const char *physical_uri; - char *retval; -}; -typedef struct _GetPathForPhysicalUriForeachData GetPathForPhysicalUriForeachData; - -static void -get_path_for_physical_uri_foreach (void *key, - void *value, - void *data) -{ - GetPathForPhysicalUriForeachData *foreach_data; - const char *physical_uri; - Folder *folder; - - foreach_data = (GetPathForPhysicalUriForeachData *) data; - if (foreach_data->retval != NULL) - return; - - folder = (Folder *) value; - if (folder->e_folder == NULL) - return; - - physical_uri = e_folder_get_physical_uri (folder->e_folder); - - if (strcmp (foreach_data->physical_uri, physical_uri) == 0) { - const char *path; - - path = (const char *) key; - foreach_data->retval = g_strdup (path); - } -} - -/** - * e_storage_get_path_for_physical_uri: - * @storage: A storage - * @physical_uri: A physical URI - * - * Look for the folder having the specified @physical_uri. - * - * Return value: The path of the folder having the specified @physical_uri in - * @storage. If such a folder does not exist, just return NULL. The return - * value must be freed by the caller. - **/ -char * -e_storage_get_path_for_physical_uri (EStorage *storage, - const char *physical_uri) -{ - GetPathForPhysicalUriForeachData foreach_data; - EStoragePrivate *priv; - - g_return_val_if_fail (storage != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE (storage), NULL); - g_return_val_if_fail (physical_uri != NULL, NULL); - - priv = storage->priv; - - foreach_data.physical_uri = physical_uri; - foreach_data.retval = NULL; - - g_hash_table_foreach (priv->path_to_folder, get_path_for_physical_uri_foreach, &foreach_data); - - return foreach_data.retval; -} - - -/* Protected functions. */ - -/* These functions are used by subclasses to add and remove folders from the - state stored in the storage object. */ - -gboolean -e_storage_new_folder (EStorage *storage, - const char *path, - EFolder *e_folder) -{ - EStoragePrivate *priv; - Folder *folder; - Folder *parent_folder; - const char *name; - char *full_path; - - g_return_val_if_fail (storage != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE (storage), FALSE); - g_return_val_if_fail (path != NULL, FALSE); - g_return_val_if_fail (g_path_is_absolute (path), FALSE); - g_return_val_if_fail (e_folder != NULL, FALSE); - g_return_val_if_fail (E_IS_FOLDER (e_folder), FALSE); - - priv = storage->priv; - - parent_folder = g_hash_table_lookup (priv->path_to_folder, path); - if (parent_folder == NULL) { - g_warning ("%s: Trying to add a subfolder to a path that does not exist yet -- %s", - __FUNCTION__, path); - return FALSE; - } - - name = e_folder_get_name (e_folder); - g_assert (name != NULL); - g_return_val_if_fail (*name != G_DIR_SEPARATOR, FALSE); - - full_path = g_concat_dir_and_file (path, name); - - folder = g_hash_table_lookup (priv->path_to_folder, full_path); - if (folder != NULL) { - g_warning ("%s: Trying to add a subfolder for a path that already exists -- %s", - __FUNCTION__, full_path); - g_free (full_path); - return FALSE; - } - - folder = folder_new (e_folder, full_path); - folder_add_subfolder (parent_folder, folder); - - g_hash_table_insert (priv->path_to_folder, folder->path, folder); - - gtk_signal_emit (GTK_OBJECT (storage), signals[NEW_FOLDER], folder->path); - - g_free (full_path); - - return TRUE; -} - -gboolean -e_storage_removed_folder (EStorage *storage, - const char *path) -{ - EStoragePrivate *priv; - Folder *folder; - - g_return_val_if_fail (storage != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE (storage), FALSE); - g_return_val_if_fail (path != NULL, FALSE); - g_return_val_if_fail (g_path_is_absolute (path), FALSE); - - priv = storage->priv; - - folder = g_hash_table_lookup (priv->path_to_folder, path); - if (folder == NULL) { - g_warning ("%s: Folder not found -- %s", __FUNCTION__, path); - return FALSE; - } - - gtk_signal_emit (GTK_OBJECT (storage), signals[REMOVED_FOLDER], path); - - remove_folder (storage, folder); - - return TRUE; -} - - -E_MAKE_TYPE (e_storage, "EStorage", EStorage, class_init, init, PARENT_TYPE) diff --git a/shell/e-storage.h b/shell/e-storage.h deleted file mode 100644 index 7b140bda22..0000000000 --- a/shell/e-storage.h +++ /dev/null @@ -1,135 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_STORAGE_H_ -#define _E_STORAGE_H_ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkobject.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_STORAGE (e_storage_get_type ()) -#define E_STORAGE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_STORAGE, EStorage)) -#define E_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_STORAGE, EStorageClass)) -#define E_IS_STORAGE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_STORAGE)) -#define E_IS_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_STORAGE)) - - -typedef struct _EStorage EStorage; -typedef struct _EStoragePrivate EStoragePrivate; -typedef struct _EStorageClass EStorageClass; - -enum _EStorageResult { - E_STORAGE_OK, - E_STORAGE_GENERICERROR, - E_STORAGE_EXISTS, - E_STORAGE_INVALIDTYPE, - E_STORAGE_IOERROR, - E_STORAGE_NOSPACE, - E_STORAGE_NOTFOUND, - E_STORAGE_NOTIMPLEMENTED, - E_STORAGE_PERMISSIONDENIED, - E_STORAGE_UNSUPPORTEDOPERATION, - E_STORAGE_UNSUPPORTEDTYPE -}; -typedef enum _EStorageResult EStorageResult; - -typedef void (* EStorageResultCallback) (EStorage *storage, EStorageResult result, void *data); - -#include "e-folder.h" - -struct _EStorage { - GtkObject parent; - - EStoragePrivate *priv; -}; - -struct _EStorageClass { - GtkObjectClass parent_class; - - /* Signals. */ - - void * (* new_folder) (EStorage *storage, const char *path); - void * (* removed_folder) (EStorage *storage, const char *path); - - /* Virtual methods. */ - - GList * (* list_folders) (EStorage *storage, const char *path); - EFolder * (* get_folder) (EStorage *storage, const char *path); - const char * (* get_name) (EStorage *storage); - - void (* async_create_folder) (EStorage *storage, const char *path, - const char *type, const char *description, - EStorageResultCallback callback, void *data); - void (* async_remove_folder) (EStorage *storage, const char *path, - EStorageResultCallback callback, void *data); -}; - - -GtkType e_storage_get_type (void); -void e_storage_construct (EStorage *storage); -EStorage *e_storage_new (void); -gboolean e_storage_path_is_relative (const char *path); -gboolean e_storage_path_is_absolute (const char *path); - -GList *e_storage_list_folders (EStorage *storage, const char *path); -EFolder *e_storage_get_folder (EStorage *storage, const char *path); - -const char *e_storage_get_name (EStorage *storage); - -/* Folder operations. */ - -void e_storage_async_create_folder (EStorage *storage, - const char *path, - const char *type, - const char *description, - EStorageResultCallback callback, - void *data); -void e_storage_async_remove_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data); - -const char *e_storage_result_to_string (EStorageResult result); - -/* Utility functions. */ - -char *e_storage_get_path_for_physical_uri (EStorage *storage, - const char *physical_uri); - -/* Protected. C++ anyone? */ -gboolean e_storage_new_folder (EStorage *storage, const char *path, EFolder *folder); -gboolean e_storage_removed_folder (EStorage *storage, const char *path); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_STORAGE_H_ */ diff --git a/shell/evolution-session.c b/shell/evolution-session.c deleted file mode 100644 index 1e0acb36b4..0000000000 --- a/shell/evolution-session.c +++ /dev/null @@ -1,213 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-session.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> - -#include "Evolution.h" - -#include "e-util/e-util.h" - -#include "evolution-session.h" - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionSessionPrivate { - int dummy; -}; - -enum { - LOAD_CONFIGURATION, - SAVE_CONFIGURATION, - LAST_SIGNAL -}; - -static int signals[LAST_SIGNAL]; - - -/* GtkObject methods. */ - -static void -impl_destroy (GtkObject *object) -{ - EvolutionSession *session; - EvolutionSessionPrivate *priv; - - session = EVOLUTION_SESSION (object); - priv = session->priv; - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* CORBA interface implementation. */ - -static void -impl_Evolution_Session_save_configuration (PortableServer_Servant servant, - const CORBA_char *prefix, - CORBA_Environment *ev) -{ - BonoboObject *self; - - self = bonobo_object_from_servant (servant); - gtk_signal_emit (GTK_OBJECT (self), signals[SAVE_CONFIGURATION], prefix); -} - -static void -impl_Evolution_Session_load_configuration (PortableServer_Servant servant, - const CORBA_char *prefix, - CORBA_Environment *ev) -{ - BonoboObject *self; - - self = bonobo_object_from_servant (servant); - gtk_signal_emit (GTK_OBJECT (self), signals[LOAD_CONFIGURATION], prefix); -} - - -/* Initialization. */ - -static POA_Evolution_Session__vepv Evolution_Session_vepv; - -static void -corba_class_init (void) -{ - POA_Evolution_Session__vepv *vepv; - POA_Evolution_Session__epv *epv; - PortableServer_ServantBase__epv *base_epv; - - base_epv = g_new0 (PortableServer_ServantBase__epv, 1); - base_epv->_private = NULL; - base_epv->finalize = NULL; - base_epv->default_POA = NULL; - - epv = g_new0 (POA_Evolution_Session__epv, 1); - epv->save_configuration = impl_Evolution_Session_save_configuration; - epv->load_configuration = impl_Evolution_Session_load_configuration; - - vepv = &Evolution_Session_vepv; - vepv->_base_epv = base_epv; - vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); - vepv->Evolution_Session_epv = epv; -} - -static void -class_init (EvolutionSessionClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (klass); - parent_class = gtk_type_class (bonobo_object_get_type ()); - - object_class->destroy = impl_destroy; - - signals[LOAD_CONFIGURATION] - = gtk_signal_new ("load_configuration", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EvolutionSessionClass, load_configuration), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - signals[SAVE_CONFIGURATION] - = gtk_signal_new ("save_configuration", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EvolutionSessionClass, save_configuration), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - - corba_class_init (); -} - -static void -init (EvolutionSession *session) -{ - EvolutionSessionPrivate *priv; - - priv = g_new (EvolutionSessionPrivate, 1); - - session->priv = priv; -} - - -static Evolution_Session -create_corba_session (BonoboObject *object) -{ - POA_Evolution_Session *servant; - CORBA_Environment ev; - - servant = (POA_Evolution_Session *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &Evolution_Session_vepv; - - CORBA_exception_init (&ev); - - POA_Evolution_Session__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION){ - g_free (servant); - CORBA_exception_free (&ev); - return CORBA_OBJECT_NIL; - } - - CORBA_exception_free (&ev); - return (Evolution_Session) bonobo_object_activate_servant (object, servant); -} - -void -evolution_session_construct (EvolutionSession *session, - CORBA_Object corba_session) -{ - g_return_if_fail (session != NULL); - g_return_if_fail (corba_session != CORBA_OBJECT_NIL); - - bonobo_object_construct (BONOBO_OBJECT (session), corba_session); -} - -EvolutionSession * -evolution_session_new (void) -{ - EvolutionSession *session; - Evolution_Session corba_session; - - session = gtk_type_new (evolution_session_get_type ()); - - corba_session = create_corba_session (BONOBO_OBJECT (session)); - if (corba_session == CORBA_OBJECT_NIL) { - bonobo_object_unref (BONOBO_OBJECT (session)); - return NULL; - } - - evolution_session_construct (session, corba_session); - return session; -} - - -E_MAKE_TYPE (evolution_session, "EvolutionSession", EvolutionSession, class_init, init, PARENT_TYPE) diff --git a/shell/evolution-session.h b/shell/evolution-session.h deleted file mode 100644 index 93c0ebed2a..0000000000 --- a/shell/evolution-session.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-session.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __EVOLUTION_SESSION_H__ -#define __EVOLUTION_SESSION_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_SESSION (evolution_session_get_type ()) -#define EVOLUTION_SESSION(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SESSION, EvolutionSession)) -#define EVOLUTION_SESSION_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SESSION, EvolutionSessionClass)) -#define EVOLUTION_IS_SESSION(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SESSION)) -#define EVOLUTION_IS_SESSION_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SESSION)) - - -typedef struct _EvolutionSession EvolutionSession; -typedef struct _EvolutionSessionPrivate EvolutionSessionPrivate; -typedef struct _EvolutionSessionClass EvolutionSessionClass; - -struct _EvolutionSession { - BonoboObject parent; - - EvolutionSessionPrivate *priv; -}; - -struct _EvolutionSessionClass { - BonoboObjectClass parent_class; - - void (* save_configuration) (EvolutionSession *session, const char *prefix); - void (* load_configuration) (EvolutionSession *session, const char *prefix); -}; - - -GtkType evolution_session_get_type (void); -void evolution_session_construct (EvolutionSession *session, - CORBA_Object corba_session); -EvolutionSession *evolution_session_new (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_SESSION_H__ */ diff --git a/shell/evolution-shell-client.c b/shell/evolution-shell-client.c deleted file mode 100644 index 4e4fd830b3..0000000000 --- a/shell/evolution-shell-client.c +++ /dev/null @@ -1,333 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-client.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo.h> - -#include "e-util/e-util.h" - -#include "evolution-shell-client.h" - - -struct _EvolutionShellClientPrivate { - int dummy; -}; - -#define PARENT_TYPE bonobo_object_client_get_type () -static BonoboObjectClientClass *parent_class = NULL; - - -/* Easy-to-use wrapper for Evolution::user_select_folder. */ - -static PortableServer_ServantBase__epv FolderSelectionListener_base_epv; -static POA_Evolution_FolderSelectionListener__epv FolderSelectionListener_epv; -static POA_Evolution_FolderSelectionListener__vepv FolderSelectionListener_vepv; -static gboolean FolderSelectionListener_vtables_initialized = FALSE; - -struct _FolderSelectionListenerServant { - POA_Evolution_FolderSelectionListener servant; - char **uri_return; - char **physical_uri_return; -}; -typedef struct _FolderSelectionListenerServant FolderSelectionListenerServant; - -static void -impl_FolderSelectionListener_selected (PortableServer_Servant servant, - const CORBA_char *uri, - const CORBA_char *physical_uri, - CORBA_Environment *ev) -{ - FolderSelectionListenerServant *listener_servant; - - listener_servant = (FolderSelectionListenerServant *) servant; - - if (listener_servant->uri_return != NULL) - * (listener_servant->uri_return) = g_strdup (uri); - - if (listener_servant->physical_uri_return != NULL) - * (listener_servant->physical_uri_return) = g_strdup (physical_uri); - - gtk_main_quit (); -} - -static void -impl_FolderSelectionListener_cancel (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - FolderSelectionListenerServant *listener_servant; - - listener_servant = (FolderSelectionListenerServant *) servant; - - if (listener_servant->uri_return != NULL) - * (listener_servant->uri_return) = NULL; - - if (listener_servant->physical_uri_return != NULL) - * (listener_servant->physical_uri_return) = NULL; - - gtk_main_quit (); -} - -static void -init_FolderSelectionListener_vtables (void) -{ - FolderSelectionListener_base_epv._private = NULL; - FolderSelectionListener_base_epv.finalize = NULL; - FolderSelectionListener_base_epv.default_POA = NULL; - - FolderSelectionListener_epv.selected = impl_FolderSelectionListener_selected; - FolderSelectionListener_epv.cancel = impl_FolderSelectionListener_cancel; - - FolderSelectionListener_vepv._base_epv = &FolderSelectionListener_base_epv; - FolderSelectionListener_vepv.Evolution_FolderSelectionListener_epv = &FolderSelectionListener_epv; - - FolderSelectionListener_vtables_initialized = TRUE; -} - -static Evolution_FolderSelectionListener -create_folder_selection_listener_interface (char **result, - char **uri_return, - char **physical_uri_return) -{ - Evolution_FolderSelectionListener corba_interface; - CORBA_Environment ev; - FolderSelectionListenerServant *servant; - PortableServer_Servant listener_servant; - - if (! FolderSelectionListener_vtables_initialized) - init_FolderSelectionListener_vtables (); - - servant = g_new0 (FolderSelectionListenerServant, 1); - servant->servant.vepv = &FolderSelectionListener_vepv; - servant->uri_return = uri_return; - servant->physical_uri_return = physical_uri_return; - - listener_servant = (PortableServer_Servant) servant; - - CORBA_exception_init (&ev); - - POA_Evolution_FolderSelectionListener__init (listener_servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free(servant); - return CORBA_OBJECT_NIL; - } - - CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), listener_servant, &ev)); - - corba_interface = PortableServer_POA_servant_to_reference (bonobo_poa (), listener_servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - corba_interface = CORBA_OBJECT_NIL; - - CORBA_exception_free (&ev); - - return corba_interface; -} - -static int -count_string_items (const char *list[]) -{ - int i; - - if (list == NULL) - return 0; - - for (i = 0; list[i] != NULL; i++) - ; - - return i; -} - -static void -user_select_folder (EvolutionShellClient *shell_client, - const char *title, - const char *default_folder, - const char *possible_types[], - char **uri_return, - char **physical_uri_return) -{ - Evolution_FolderSelectionListener listener_interface; - Evolution_Shell corba_shell; - CORBA_Environment ev; - Evolution_Shell_FolderTypeList corba_type_list; - int num_possible_types; - char *result; - - result = NULL; - - listener_interface = create_folder_selection_listener_interface (&result, uri_return, - physical_uri_return); - if (listener_interface == CORBA_OBJECT_NIL) - return; - - CORBA_exception_init (&ev); - - corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client)); - - num_possible_types = count_string_items (possible_types); - - corba_type_list._length = num_possible_types; - corba_type_list._maximum = num_possible_types; - corba_type_list._buffer = (CORBA_char **) possible_types; - - Evolution_Shell_user_select_folder (corba_shell, listener_interface, - title, default_folder, &corba_type_list, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - - if (uri_return != NULL) - *uri_return = NULL; - if (physical_uri_return != NULL) - *physical_uri_return = NULL; - - return; - } - - gtk_main(); - - CORBA_Object_release (listener_interface, &ev); - - CORBA_exception_free (&ev); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EvolutionShellClient *shell_client; - EvolutionShellClientPrivate *priv; - - shell_client = EVOLUTION_SHELL_CLIENT (object); - priv = shell_client->priv; - - /* Nothing to do here. */ - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (EvolutionShellClientClass *klass) -{ - GtkObjectClass *object_class; - - parent_class = gtk_type_class (bonobo_object_get_type ()); - - object_class = GTK_OBJECT_CLASS (klass); - - object_class->destroy = destroy; -} - -static void -init (EvolutionShellClient *shell_client) -{ - EvolutionShellClientPrivate *priv; - - priv = g_new (EvolutionShellClientPrivate, 1); - priv->dummy = 0; - - shell_client->priv = priv; -} - - -/** - * evolution_shell_client_construct: - * @shell_client: - * @corba_shell: - * - * Construct @shell_client associating it to @corba_shell. - **/ -void -evolution_shell_client_construct (EvolutionShellClient *shell_client, - Evolution_Shell corba_shell) -{ - g_return_if_fail (shell_client != NULL); - g_return_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client)); - g_return_if_fail (corba_shell != CORBA_OBJECT_NIL); - - bonobo_object_construct (BONOBO_OBJECT (shell_client), (CORBA_Object) corba_shell); -} - -/** - * evolution_shell_client_new: - * @corba_shell: A pointer to the CORBA Evolution::Shell interface. - * - * Create a new client object for @corba_shell. - * - * Return value: A pointer to the Evolution::Shell client BonoboObject. - **/ -EvolutionShellClient * -evolution_shell_client_new (Evolution_Shell corba_shell) -{ - EvolutionShellClient *shell_client; - - shell_client = gtk_type_new (evolution_shell_client_get_type ()); - - evolution_shell_client_construct (shell_client, corba_shell); - - if (bonobo_object_corba_objref (BONOBO_OBJECT (shell_client)) == CORBA_OBJECT_NIL) { - bonobo_object_unref (BONOBO_OBJECT (shell_client)); - return NULL; - } - - return shell_client; -} - - -/** - * evolution_shell_client_user_select_folder: - * @shell_client: A EvolutionShellClient object - * @title: The title for the folder selection dialog - * @default_folder: URI (physical or evolution:) of the folder initially selected on the dialog - * @uri_return: - * @physical_uri_return: - * - * Pop up the shell's folder selection dialog with the specified @title and - * @default_folder as the initially selected folder. On return, set *@uri and - * *@physical_uri to the evolution: URI and the physical URI of the selected - * folder (or %NULL if the user cancelled the dialog). (The dialog is modal.) - **/ -void -evolution_shell_client_user_select_folder (EvolutionShellClient *shell_client, - const char *title, - const char *default_folder, - const char *possible_types[], - char **uri_return, - char **physical_uri_return) -{ - g_return_if_fail (shell_client != NULL); - g_return_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client)); - g_return_if_fail (title != NULL); - g_return_if_fail (default_folder != NULL); - - user_select_folder (shell_client, title, default_folder, possible_types, - uri_return, physical_uri_return); -} - - -E_MAKE_TYPE (evolution_shell_client, "EvolutionShellClient", EvolutionShellClient, class_init, init, PARENT_TYPE) diff --git a/shell/evolution-shell-client.h b/shell/evolution-shell-client.h deleted file mode 100644 index c9258574f7..0000000000 --- a/shell/evolution-shell-client.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-client.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __EVOLUTION_SHELL_CLIENT_H__ -#define __EVOLUTION_SHELL_CLIENT_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-object-client.h> - -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_SHELL_CLIENT (evolution_shell_client_get_type ()) -#define EVOLUTION_SHELL_CLIENT(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SHELL_CLIENT, EvolutionShellClient)) -#define EVOLUTION_SHELL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SHELL_CLIENT, EvolutionShellClientClass)) -#define EVOLUTION_IS_SHELL_CLIENT(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SHELL_CLIENT)) -#define EVOLUTION_IS_SHELL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SHELL_CLIENT)) - - -typedef struct _EvolutionShellClient EvolutionShellClient; -typedef struct _EvolutionShellClientPrivate EvolutionShellClientPrivate; -typedef struct _EvolutionShellClientClass EvolutionShellClientClass; - -struct _EvolutionShellClient { - BonoboObjectClient parent; - - EvolutionShellClientPrivate *priv; -}; - -struct _EvolutionShellClientClass { - BonoboObjectClientClass parent_class; -}; - - -GtkType evolution_shell_client_get_type (void); -void evolution_shell_client_construct (EvolutionShellClient *shell_client, - Evolution_Shell corba_shell); -EvolutionShellClient *evolution_shell_client_new (Evolution_Shell shell); - -void evolution_shell_client_user_select_folder (EvolutionShellClient *shell_client, - const char *title, - const char *default_folder, - const char *possible_types[], - char **uri_return, - char **physical_uri_return); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_SHELL_CLIENT_H__ */ diff --git a/shell/evolution-shell-component-client.c b/shell/evolution-shell-component-client.c deleted file mode 100644 index c6cb1463dd..0000000000 --- a/shell/evolution-shell-component-client.c +++ /dev/null @@ -1,526 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component-client.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtksignal.h> -#include <gtk/gtktypeutils.h> - -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-widget.h> - -#include <liboaf/liboaf.h> - -#include "e-util/e-util.h" - -#include "evolution-shell-component-client.h" - - -#define PARENT_TYPE BONOBO_OBJECT_CLIENT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionShellComponentClientPrivate { - EvolutionShellComponentClientCallback callback; - void *callback_data; - - Evolution_ShellComponentListener listener_interface; - PortableServer_Servant listener_servant; -}; - - -#define RETURN_ERROR_IF_FAIL(cond) \ - g_return_val_if_fail ((cond), EVOLUTION_SHELL_COMPONENT_INVALIDARG) - - -/* Utility functions. */ - -static EvolutionShellComponentResult -corba_exception_to_result (const CORBA_Environment *ev) -{ - if (ev->_major == CORBA_NO_EXCEPTION) - return EVOLUTION_SHELL_COMPONENT_OK; - - if (ev->_major == CORBA_USER_EXCEPTION) { - if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_AlreadyOwned) == 0) - return EVOLUTION_SHELL_COMPONENT_ALREADYOWNED; - if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_NotOwned) == 0) - return EVOLUTION_SHELL_COMPONENT_NOTOWNED; - if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_NotFound) == 0) - return EVOLUTION_SHELL_COMPONENT_NOTFOUND; - if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_UnsupportedType) == 0) - return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE; - if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_InternalError) == 0) - return EVOLUTION_SHELL_COMPONENT_INTERNALERROR; - if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_Busy) == 0) - return EVOLUTION_SHELL_COMPONENT_BUSY; - - return EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR; - } else { - /* FIXME maybe we need something more specific here. */ - return EVOLUTION_SHELL_COMPONENT_CORBAERROR; - } -} - -static void -dispatch_callback (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentResult result) -{ - EvolutionShellComponentClientPrivate *priv; - EvolutionShellComponentClientCallback callback; - PortableServer_ObjectId *oid; - void *callback_data; - CORBA_Environment ev; - - priv = shell_component_client->priv; - - g_return_if_fail (priv->callback != NULL); - g_return_if_fail (priv->listener_servant != NULL); - - /* Notice that we destroy the interface and reset the callback information before - dispatching the callback so that the callback can generate another request. */ - - CORBA_exception_init (&ev); - - oid = PortableServer_POA_servant_to_id (bonobo_poa (), priv->listener_servant, &ev); - PortableServer_POA_deactivate_object (bonobo_poa (), oid, &ev); - POA_Evolution_ShellComponentListener__fini (priv->listener_servant, &ev); - CORBA_free (oid); - - CORBA_Object_release (priv->listener_interface, &ev); - - CORBA_exception_free (&ev); - - priv->listener_servant = NULL; - priv->listener_interface = CORBA_OBJECT_NIL; - - callback = priv->callback; - callback_data = priv->callback_data; - - priv->callback = NULL; - priv->callback_data = NULL; - - (* callback) (shell_component_client, result, callback_data); -} - - -/* CORBA listener interface implementation. */ - -static PortableServer_ServantBase__epv ShellComponentListener_base_epv; -static POA_Evolution_ShellComponentListener__epv ShellComponentListener_epv; -static POA_Evolution_ShellComponentListener__vepv ShellComponentListener_vepv; -static gboolean ShellComponentListener_vepv_initialized = FALSE; - -struct _ShellComponentListenerServant { - POA_Evolution_ShellComponentListener servant; - EvolutionShellComponentClient *component_client; -}; -typedef struct _ShellComponentListenerServant ShellComponentListenerServant; - -static EvolutionShellComponentClient * -component_client_from_ShellComponentListener_servant (PortableServer_Servant servant) -{ - ShellComponentListenerServant *listener_servant; - - listener_servant = (ShellComponentListenerServant *) servant; - return listener_servant->component_client; -} - -static EvolutionShellComponentResult -result_from_async_corba_result (Evolution_ShellComponentListener_Result async_corba_result) -{ - switch (async_corba_result) { - case Evolution_ShellComponentListener_OK: - return EVOLUTION_SHELL_COMPONENT_OK; - case Evolution_ShellComponentListener_UNSUPPORTED_OPERATION: - return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDOPERATION; - case Evolution_ShellComponentListener_EXISTS: - return EVOLUTION_SHELL_COMPONENT_EXISTS; - case Evolution_ShellComponentListener_INVALID_URI: - return EVOLUTION_SHELL_COMPONENT_INVALIDURI; - case Evolution_ShellComponentListener_PERMISSION_DENIED: - return EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED; - case Evolution_ShellComponentListener_HAS_SUBFOLDERS: - return EVOLUTION_SHELL_COMPONENT_HASSUBFOLDERS; - case Evolution_ShellComponentListener_NO_SPACE: - return EVOLUTION_SHELL_COMPONENT_NOSPACE; - default: - return EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR; - } -} - -static void -impl_ShellComponentListener_report_result (PortableServer_Servant servant, - const Evolution_ShellComponentListener_Result result, - CORBA_Environment *ev) -{ - EvolutionShellComponentClient *component_client; - - component_client = component_client_from_ShellComponentListener_servant (servant); - dispatch_callback (component_client, result_from_async_corba_result (result)); -} - -static void -ShellComponentListener_vepv_initialize (void) -{ - ShellComponentListener_base_epv._private = NULL; - ShellComponentListener_base_epv.finalize = NULL; - ShellComponentListener_base_epv.default_POA = NULL; - - ShellComponentListener_epv.report_result = impl_ShellComponentListener_report_result; - - ShellComponentListener_vepv._base_epv = & ShellComponentListener_base_epv; - ShellComponentListener_vepv.Evolution_ShellComponentListener_epv = & ShellComponentListener_epv; - - ShellComponentListener_vepv_initialized = TRUE; -} - -static PortableServer_Servant * -create_ShellComponentListener_servant (EvolutionShellComponentClient *component_client) -{ - ShellComponentListenerServant *servant; - - if (! ShellComponentListener_vepv_initialized) - ShellComponentListener_vepv_initialize (); - - servant = g_new0 (ShellComponentListenerServant, 1); - servant->servant.vepv = &ShellComponentListener_vepv; - servant->component_client = component_client; - - return (PortableServer_Servant) servant; -} - -static void -free_ShellComponentListener_servant (PortableServer_Servant servant) -{ - g_free (servant); -} - -static void -create_listener_interface (EvolutionShellComponentClient *shell_component_client) -{ - EvolutionShellComponentClientPrivate *priv; - PortableServer_Servant listener_servant; - Evolution_ShellComponentListener corba_interface; - CORBA_Environment ev; - - priv = shell_component_client->priv; - - listener_servant = create_ShellComponentListener_servant (shell_component_client); - - CORBA_exception_init (&ev); - - POA_Evolution_ShellComponentListener__init (listener_servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - free_ShellComponentListener_servant (listener_servant); - return; - } - - CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), listener_servant, &ev)); - - corba_interface = PortableServer_POA_servant_to_reference (bonobo_poa (), listener_servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - corba_interface = CORBA_OBJECT_NIL; - free_ShellComponentListener_servant (listener_servant); - } - - CORBA_exception_free (&ev); - - priv->listener_servant = listener_servant; - priv->listener_interface = corba_interface; -} - - -/* GtkObject methods. */ - -static void -impl_destroy (GtkObject *object) -{ - EvolutionShellComponentClient *shell_component_client; - EvolutionShellComponentClientPrivate *priv; - - shell_component_client = EVOLUTION_SHELL_COMPONENT_CLIENT (object); - priv = shell_component_client->priv; - - if (priv->callback != NULL) - dispatch_callback (shell_component_client, EVOLUTION_SHELL_COMPONENT_INTERRUPTED); - - g_free (priv); - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (EvolutionShellComponentClientClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (klass); - parent_class = gtk_type_class (PARENT_TYPE); - - object_class->destroy = impl_destroy; -} - -static void -init (EvolutionShellComponentClient *shell_component_client) -{ - EvolutionShellComponentClientPrivate *priv; - - priv = g_new (EvolutionShellComponentClientPrivate, 1); - priv->listener_interface = CORBA_OBJECT_NIL; - priv->listener_servant = NULL; - priv->callback = NULL; - priv->callback_data = NULL; - - shell_component_client->priv = priv; -} - - -/* Construction. */ - -void -evolution_shell_component_client_construct (EvolutionShellComponentClient *shell_component_client, - CORBA_Object corba_object) -{ - g_return_if_fail (shell_component_client != NULL); - g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client)); - g_return_if_fail (corba_object != CORBA_OBJECT_NIL); - - bonobo_object_client_construct (BONOBO_OBJECT_CLIENT (shell_component_client), - corba_object); -} - -EvolutionShellComponentClient * -evolution_shell_component_client_new (const char *id) -{ - EvolutionShellComponentClient *new; - CORBA_Environment ev; - CORBA_Object corba_object; - - g_return_val_if_fail (id != NULL, NULL); - - CORBA_exception_init (&ev); - - corba_object = oaf_activate_from_id ((char *) id, 0, NULL, &ev); /* Yuck. */ - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - g_error ("Could not start up component for %s. " - "(See previous error messages?)", id); - } - CORBA_exception_free (&ev); - - if (corba_object == CORBA_OBJECT_NIL) { - g_error ("Could not activate component %s. " - "(Maybe you need to set OAF_INFO_PATH?)", id); - } - - new = gtk_type_new (evolution_shell_component_client_get_type ()); - evolution_shell_component_client_construct (new, corba_object); - - return new; -} - - -/* Synchronous operations. */ - -EvolutionShellComponentResult -evolution_shell_component_client_set_owner (EvolutionShellComponentClient *shell_component_client, - Evolution_Shell shell, - const char *evolution_homedir) -{ - EvolutionShellComponentResult result; - CORBA_Environment ev; - - RETURN_ERROR_IF_FAIL (shell_component_client != NULL); - RETURN_ERROR_IF_FAIL (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client)); - RETURN_ERROR_IF_FAIL (shell != CORBA_OBJECT_NIL); - - CORBA_exception_init (&ev); - - Evolution_ShellComponent_set_owner (bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client)), - shell, evolution_homedir, &ev); - - result = corba_exception_to_result (&ev); - - CORBA_exception_free (&ev); - - return result; -} - -EvolutionShellComponentResult -evolution_shell_component_client_unset_owner (EvolutionShellComponentClient *shell_component_client, - Evolution_Shell shell) -{ - EvolutionShellComponentResult result; - Evolution_ShellComponent corba_component; - CORBA_Environment ev; - - RETURN_ERROR_IF_FAIL (shell_component_client != NULL); - RETURN_ERROR_IF_FAIL (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client)); - RETURN_ERROR_IF_FAIL (shell != CORBA_OBJECT_NIL); - - CORBA_exception_init (&ev); - - corba_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client)); - - Evolution_ShellComponent_unset_owner (corba_component, &ev); - - result = corba_exception_to_result (&ev); - - CORBA_exception_free (&ev); - - return result; -} - -EvolutionShellComponentResult -evolution_shell_component_client_create_view (EvolutionShellComponentClient *shell_component_client, - BonoboUIHandler *uih, - const char *physical_uri, - const char *type_string, - BonoboControl **control_return) -{ - EvolutionShellComponentResult result; - CORBA_Environment ev; - Evolution_ShellComponent corba_component; - Bonobo_Control corba_control; - - RETURN_ERROR_IF_FAIL (shell_component_client != NULL); - RETURN_ERROR_IF_FAIL (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client)); - RETURN_ERROR_IF_FAIL (uih != NULL); - RETURN_ERROR_IF_FAIL (BONOBO_IS_UI_HANDLER (uih)); - RETURN_ERROR_IF_FAIL (physical_uri != NULL); - RETURN_ERROR_IF_FAIL (type_string != NULL); - RETURN_ERROR_IF_FAIL (control_return != NULL); - - CORBA_exception_init (&ev); - - corba_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client)); - corba_control = Evolution_ShellComponent_create_view (corba_component, physical_uri, type_string, &ev); - - result = corba_exception_to_result (&ev); - - if (result != EVOLUTION_SHELL_COMPONENT_OK) { - *control_return = NULL; - } else { - Bonobo_UIHandler corba_uih; - - corba_uih = bonobo_object_corba_objref (BONOBO_OBJECT (uih)); - *control_return = BONOBO_CONTROL (bonobo_widget_new_control_from_objref (corba_control, - corba_uih)); - } - - CORBA_exception_free (&ev); - - return result; -} - - -/* Asyncronous operations. */ - -void -evolution_shell_component_client_async_create_folder (EvolutionShellComponentClient *shell_component_client, - const char *physical_uri, - const char *type, - EvolutionShellComponentClientCallback callback, - void *data) -{ - 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); - g_return_if_fail (callback != NULL); - - priv = shell_component_client->priv; - - if (priv->callback != NULL) { - (* callback) (shell_component_client, EVOLUTION_SHELL_COMPONENT_BUSY, data); - return; - } - - create_listener_interface (shell_component_client); - - CORBA_exception_init (&ev); - - corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client)); - - priv->callback = callback; - priv->callback_data = data; - - Evolution_ShellComponent_async_create_folder (corba_shell_component, - priv->listener_interface, - physical_uri, type, - &ev); - - CORBA_exception_free (&ev); -} - -void -evolution_shell_component_client_async_remove_folder (EvolutionShellComponentClient *shell_component_client, - const char *physical_uri, - 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); -} - - -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 deleted file mode 100644 index fa066cb27d..0000000000 --- a/shell/evolution-shell-component-client.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component-client.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef EVOLUTION_SHELL_COMPONENT_CLIENT_H -#define EVOLUTION_SHELL_COMPONENT_CLIENT_H - -#include <bonobo/bonobo-object-client.h> -#include <bonobo/bonobo-ui-handler.h> - -#include "evolution-shell-component.h" - -#ifdef cplusplus -extern "C" { -#pragma } -#endif /* cplusplus */ - -#define EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT (evolution_shell_component_client_get_type ()) -#define EVOLUTION_SHELL_COMPONENT_CLIENT(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT, EvolutionShellComponentClient)) -#define EVOLUTION_SHELL_COMPONENT_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT, EvolutionShellComponentClientClass)) -#define EVOLUTION_IS_SHELL_COMPONENT_CLIENT(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT)) -#define EVOLUTION_IS_SHELL_COMPONENT_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT)) - - -typedef struct _EvolutionShellComponentClient EvolutionShellComponentClient; -typedef struct _EvolutionShellComponentClientPrivate EvolutionShellComponentClientPrivate; -typedef struct _EvolutionShellComponentClientClass EvolutionShellComponentClientClass; - -struct _EvolutionShellComponentClient { - BonoboObjectClient parent; - - EvolutionShellComponentClientPrivate *priv; -}; - -struct _EvolutionShellComponentClientClass { - BonoboObjectClientClass parent_class; -}; - -typedef void (* EvolutionShellComponentClientCallback) (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentResult result, - void *data); - - -/* Construction. */ -GtkType evolution_shell_component_client_get_type (void); -void evolution_shell_component_client_construct (EvolutionShellComponentClient *shell_component_client, - CORBA_Object corba_object); -EvolutionShellComponentClient *evolution_shell_component_client_new (const char *id); - -/* Synchronous operations. */ -EvolutionShellComponentResult evolution_shell_component_client_set_owner (EvolutionShellComponentClient *shell_component_client, - Evolution_Shell shell, - const char *evolution_homedir); -EvolutionShellComponentResult evolution_shell_component_client_unset_owner (EvolutionShellComponentClient *shell_component_client, - Evolution_Shell shell); -EvolutionShellComponentResult evolution_shell_component_client_create_view (EvolutionShellComponentClient *shell_component_client, - BonoboUIHandler *uih, - const char *physical_uri, - const char *type_string, - BonoboControl **control_return); - -/* Asyncronous operations. */ -void evolution_shell_component_client_async_create_folder (EvolutionShellComponentClient *shell_component_client, - const char *physical_uri, - const char *type, - EvolutionShellComponentClientCallback callback, - void *data); -void evolution_shell_component_client_async_remove_folder (EvolutionShellComponentClient *shell_component_client, - const char *physical_uri, - 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 */ - -#endif /* EVOLUTION_SHELL_COMPONENT_CLIENT_H */ diff --git a/shell/evolution-shell-component.c b/shell/evolution-shell-component.c deleted file mode 100644 index cedcf64b98..0000000000 --- a/shell/evolution-shell-component.c +++ /dev/null @@ -1,498 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo.h> - -#include "Evolution.h" - -#include "e-util/e-util.h" - -#include "evolution-shell-component.h" - - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionShellComponentPrivate { - GList *folder_types; /* EvolutionShellComponentFolderType */ - - EvolutionShellComponentCreateViewFn create_view_fn; - EvolutionShellComponentCreateFolderFn create_folder_fn; - EvolutionShellComponentRemoveFolderFn remove_folder_fn; - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn; - - EvolutionShellClient *owner_client; - - void *closure; -}; - -enum { - OWNER_SET, - OWNER_UNSET, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* CORBA interface implementation. */ - -static POA_Evolution_ShellComponent__vepv ShellComponent_vepv; - -static POA_Evolution_ShellComponent * -create_servant (void) -{ - POA_Evolution_ShellComponent *servant; - CORBA_Environment ev; - - servant = (POA_Evolution_ShellComponent *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &ShellComponent_vepv; - - CORBA_exception_init (&ev); - - POA_Evolution_ShellComponent__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - return servant; -} - -static Evolution_FolderTypeList * -impl_ShellComponent__get_supported_types (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - Evolution_FolderTypeList *folder_type_list; - unsigned int i; - GList *p; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - priv = shell_component->priv; - - folder_type_list = Evolution_FolderTypeList__alloc (); - folder_type_list->_length = g_list_length (priv->folder_types); - folder_type_list->_maximum = folder_type_list->_length; - folder_type_list->_buffer = CORBA_sequence_Evolution_FolderType_allocbuf (folder_type_list->_maximum); - - for (p = priv->folder_types, i = 0; p != NULL; p = p->next, i++) { - Evolution_FolderType *corba_folder_type; - EvolutionShellComponentFolderType *folder_type; - - folder_type = (EvolutionShellComponentFolderType *) p->data; - - corba_folder_type = folder_type_list->_buffer + i; - corba_folder_type->name = CORBA_string_dup (folder_type->name); - corba_folder_type->icon_name = CORBA_string_dup (folder_type->icon_name); - } - - return folder_type_list; -} - -static void -impl_ShellComponent_set_owner (PortableServer_Servant servant, - const Evolution_Shell shell, - const CORBA_char *evolution_homedir, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - Evolution_Shell shell_duplicate; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - priv = shell_component->priv; - - if (priv->owner_client != NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Evolution_ShellComponent_AlreadyOwned, NULL); - return; - } - - shell_duplicate = CORBA_Object_duplicate (shell, ev); - - if (ev->_major == CORBA_NO_EXCEPTION) { - priv->owner_client = evolution_shell_client_new (shell_duplicate); - gtk_signal_emit (GTK_OBJECT (shell_component), signals[OWNER_SET], priv->owner_client, evolution_homedir); - } -} - -static void -impl_ShellComponent_unset_owner (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - priv = shell_component->priv; - - if (priv->owner_client == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Evolution_ShellComponent_NotOwned, NULL); - return; - } - - bonobo_object_unref (BONOBO_OBJECT (priv->owner_client)); - priv->owner_client = NULL; - - gtk_signal_emit (GTK_OBJECT (shell_component), signals[OWNER_UNSET]); -} - -static Bonobo_Control -impl_ShellComponent_create_view (PortableServer_Servant servant, - const CORBA_char *physical_uri, - const CORBA_char *type, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - EvolutionShellComponentResult result; - BonoboControl *control; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - priv = shell_component->priv; - - result = (* priv->create_view_fn) (shell_component, physical_uri, type, - &control, priv->closure); - - if (result != EVOLUTION_SHELL_COMPONENT_OK) { - switch (result) { - case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE: - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Evolution_ShellComponent_UnsupportedType, - NULL); - break; - case EVOLUTION_SHELL_COMPONENT_INTERNALERROR: - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Evolution_ShellComponent_InternalError, - NULL); - break; - default: - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Evolution_ShellComponent_NotFound, - NULL); - } - - return CORBA_OBJECT_NIL; - } - - return bonobo_object_corba_objref (BONOBO_OBJECT (control)); -} - -static void -impl_ShellComponent_async_create_folder (PortableServer_Servant servant, - const Evolution_ShellComponentListener listener, - const CORBA_char *physical_uri, - const CORBA_char *type, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - priv = shell_component->priv; - - if (priv->create_folder_fn == NULL) { - Evolution_ShellComponentListener_report_result (listener, - Evolution_ShellComponentListener_UNSUPPORTED_OPERATION, - ev); - return; - } - - (* priv->create_folder_fn) (shell_component, physical_uri, type, listener, priv->closure); -} - -static void -impl_ShellComponent_async_remove_folder (PortableServer_Servant servant, - const Evolution_ShellComponentListener listener, - const CORBA_char *physical_uri, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - priv = shell_component->priv; - - if (priv->remove_folder_fn == NULL) { - Evolution_ShellComponentListener_report_result (listener, - Evolution_ShellComponentListener_UNSUPPORTED_OPERATION, - ev); - return; - } - - (* priv->remove_folder_fn) (shell_component, physical_uri, listener, priv->closure); -} - -static void -impl_ShellComponent_populate_folder_context_menu (PortableServer_Servant servant, - const Bonobo_UIHandler corba_uih, - const CORBA_char *physical_uri, - const CORBA_char *type, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - BonoboUIHandler *uih; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - priv = shell_component->priv; - - if (priv->populate_folder_context_menu_fn == NULL) - return; - - uih = bonobo_ui_handler_new (); - bonobo_ui_handler_set_container (uih, corba_uih); - bonobo_object_release_unref (corba_uih, NULL); - - (* priv->populate_folder_context_menu_fn) (shell_component, uih, physical_uri, type, priv->closure); - - bonobo_object_unref (BONOBO_OBJECT (uih)); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - CORBA_Environment ev; - GList *p; - - shell_component = EVOLUTION_SHELL_COMPONENT (object); - - priv = shell_component->priv; - - CORBA_exception_init (&ev); - - if (priv->owner_client != NULL) - bonobo_object_unref (BONOBO_OBJECT (priv->owner_client)); - - CORBA_exception_free (&ev); - - for (p = priv->folder_types; p != NULL; p = p->next) { - EvolutionShellComponentFolderType *folder_type; - - folder_type = (EvolutionShellComponentFolderType *) p->data; - - g_free (folder_type->name); - g_free (folder_type->icon_name); - g_free (folder_type); - } - g_list_free (priv->folder_types); - - g_free (priv); -} - - -/* Initialization. */ - -static void -corba_class_init (void) -{ - POA_Evolution_ShellComponent__vepv *vepv; - POA_Evolution_ShellComponent__epv *epv; - PortableServer_ServantBase__epv *base_epv; - - base_epv = g_new0 (PortableServer_ServantBase__epv, 1); - base_epv->_private = NULL; - base_epv->finalize = NULL; - base_epv->default_POA = NULL; - - epv = g_new0 (POA_Evolution_ShellComponent__epv, 1); - epv->_get_supported_types = impl_ShellComponent__get_supported_types; - epv->set_owner = impl_ShellComponent_set_owner; - epv->unset_owner = impl_ShellComponent_unset_owner; - epv->create_view = impl_ShellComponent_create_view; - epv->async_create_folder = impl_ShellComponent_async_create_folder; - epv->async_remove_folder = impl_ShellComponent_async_remove_folder; - epv->populate_folder_context_menu = impl_ShellComponent_populate_folder_context_menu; - - vepv = &ShellComponent_vepv; - vepv->_base_epv = base_epv; - vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); - vepv->Evolution_ShellComponent_epv = epv; -} - -static void -class_init (EvolutionShellComponentClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - signals[OWNER_SET] - = gtk_signal_new ("owner_set", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EvolutionShellComponentClass, owner_set), - gtk_marshal_NONE__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, GTK_TYPE_POINTER); - - signals[OWNER_UNSET] - = gtk_signal_new ("owner_unset", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EvolutionShellComponentClass, owner_unset), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); - - parent_class = gtk_type_class (PARENT_TYPE); - - corba_class_init (); -} - -static void -init (EvolutionShellComponent *shell_component) -{ - EvolutionShellComponentPrivate *priv; - - priv = g_new (EvolutionShellComponentPrivate, 1); - - priv->folder_types = NULL; - priv->create_view_fn = NULL; - priv->create_folder_fn = NULL; - priv->remove_folder_fn = NULL; - priv->populate_folder_context_menu_fn = NULL; - - priv->owner_client = NULL; - priv->closure = NULL; - - shell_component->priv = priv; -} - - -void -evolution_shell_component_construct (EvolutionShellComponent *shell_component, - const EvolutionShellComponentFolderType folder_types[], - Evolution_ShellComponent corba_object, - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_folder_fn, - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn, - void *closure) -{ - EvolutionShellComponentPrivate *priv; - int i; - - g_return_if_fail (shell_component != NULL); - g_return_if_fail (corba_object != CORBA_OBJECT_NIL); - - bonobo_object_construct (BONOBO_OBJECT (shell_component), corba_object); - - priv = shell_component->priv; - - priv->create_view_fn = create_view_fn; - priv->create_folder_fn = create_folder_fn; - priv->remove_folder_fn = remove_folder_fn; - priv->populate_folder_context_menu_fn = populate_folder_context_menu_fn; - - priv->closure = closure; - - for (i = 0; folder_types[i].name != NULL; i++) { - EvolutionShellComponentFolderType *new; - - if (folder_types[i].icon_name == NULL - || folder_types[i].name[0] == '\0' - || folder_types[i].icon_name[0] == '\0') - continue; - - new = g_new (EvolutionShellComponentFolderType, 1); - new->name = g_strdup (folder_types[i].name); - new->icon_name = g_strdup (folder_types[i].icon_name); - - priv->folder_types = g_list_prepend (priv->folder_types, new); - } - - if (priv->folder_types == NULL) - g_warning ("No valid folder types constructing EShellComponent %p", shell_component); -} - -EvolutionShellComponent * -evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[], - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_folder_fn, - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn, - void *closure) -{ - EvolutionShellComponent *new; - POA_Evolution_ShellComponent *servant; - Evolution_ShellComponent corba_object; - - servant = create_servant (); - if (servant == NULL) - return NULL; - - new = gtk_type_new (evolution_shell_component_get_type ()); - - corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant); - evolution_shell_component_construct (new, folder_types, corba_object, - create_view_fn, create_folder_fn, remove_folder_fn, - populate_folder_context_menu_fn, - closure); - - return new; -} - -EvolutionShellClient * -evolution_shell_component_get_owner (EvolutionShellComponent *shell_component) -{ - g_return_val_if_fail (shell_component != NULL, NULL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT (shell_component), NULL); - - return shell_component->priv->owner_client; -} - - -E_MAKE_TYPE (evolution_shell_component, "EvolutionShellComponent", EvolutionShellComponent, - class_init, init, PARENT_TYPE) diff --git a/shell/evolution-shell-component.h b/shell/evolution-shell-component.h deleted file mode 100644 index 6b080e48c3..0000000000 --- a/shell/evolution-shell-component.h +++ /dev/null @@ -1,141 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef EVOLUTION_SHELL_COMPONENT_H -#define EVOLUTION_SHELL_COMPONENT_H - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-control.h> - -#include "Evolution.h" - -#include "evolution-shell-client.h" - -#ifdef cplusplus -extern "C" { -#pragma } -#endif /* cplusplus */ - -#define EVOLUTION_TYPE_SHELL_COMPONENT (evolution_shell_component_get_type ()) -#define EVOLUTION_SHELL_COMPONENT(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SHELL_COMPONENT, EvolutionShellComponent)) -#define EVOLUTION_SHELL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SHELL_COMPONENT, EvolutionShellComponentClass)) -#define EVOLUTION_IS_SHELL_COMPONENT(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SHELL_COMPONENT)) -#define EVOLUTION_IS_SHELL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SHELL_COMPONENT)) - - -typedef struct _EvolutionShellComponent EvolutionShellComponent; -typedef struct _EvolutionShellComponentPrivate EvolutionShellComponentPrivate; -typedef struct _EvolutionShellComponentClass EvolutionShellComponentClass; - -enum _EvolutionShellComponentResult { - EVOLUTION_SHELL_COMPONENT_OK, - EVOLUTION_SHELL_COMPONENT_CORBAERROR, - EVOLUTION_SHELL_COMPONENT_INTERRUPTED, - EVOLUTION_SHELL_COMPONENT_INVALIDARG, - EVOLUTION_SHELL_COMPONENT_ALREADYOWNED, - EVOLUTION_SHELL_COMPONENT_NOTOWNED, - EVOLUTION_SHELL_COMPONENT_NOTFOUND, - EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE, - EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDOPERATION, - EVOLUTION_SHELL_COMPONENT_INTERNALERROR, - EVOLUTION_SHELL_COMPONENT_BUSY, - EVOLUTION_SHELL_COMPONENT_EXISTS, - EVOLUTION_SHELL_COMPONENT_INVALIDURI, - EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED, - EVOLUTION_SHELL_COMPONENT_HASSUBFOLDERS, - EVOLUTION_SHELL_COMPONENT_NOSPACE, - EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR -}; -typedef enum _EvolutionShellComponentResult EvolutionShellComponentResult; - -typedef EvolutionShellComponentResult (* EvolutionShellComponentCreateViewFn) - (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - BonoboControl **control_return, - void *closure); -typedef void (* EvolutionShellComponentCreateFolderFn) (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - const Evolution_ShellComponentListener listener, - void *closure); -typedef void (* EvolutionShellComponentRemoveFolderFn) (EvolutionShellComponent *shell_component, - const char *physical_uri, - const Evolution_ShellComponentListener listener, - void *closure); -typedef void (* EvolutionShellComponentPopulateFolderContextMenu) (EvolutionShellComponent *shell_component, - BonoboUIHandler *uih, - const char *physical_uri, - const char *type, - void *closure); - -struct _EvolutionShellComponentFolderType { - char *name; - char *icon_name; -}; -typedef struct _EvolutionShellComponentFolderType EvolutionShellComponentFolderType; - -struct _EvolutionShellComponent { - BonoboObject parent; - - EvolutionShellComponentPrivate *priv; -}; - -struct _EvolutionShellComponentClass { - BonoboObjectClass parent_class; - - /* Signals. */ - - void (* owner_set) (EvolutionShellComponent *shell_component, - EvolutionShellClient *shell_client, - const char *evolution_homedir); - void (* owner_unset) (EvolutionShellComponent *shell_component); -}; - - -GtkType evolution_shell_component_get_type (void); -void evolution_shell_component_construct (EvolutionShellComponent *shell_component, - const EvolutionShellComponentFolderType folder_types[], - Evolution_ShellComponent corba_object, - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_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, - EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn, - void *closure); -EvolutionShellClient *evolution_shell_component_get_owner (EvolutionShellComponent *shell_component); - -#ifdef cplusplus -} -#endif /* cplusplus */ - -#endif /* EVOLUTION_SHELL_COMPONENT_H */ diff --git a/shell/evolution-shell-view.c b/shell/evolution-shell-view.c deleted file mode 100644 index 8ace962f1b..0000000000 --- a/shell/evolution-shell-view.c +++ /dev/null @@ -1,226 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-view.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> -#include <bonobo.h> - -#include "e-util/e-util.h" - -#include "evolution-shell-view.h" - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionShellViewPrivate { - int dummy; -}; - -enum { - SET_MESSAGE, - UNSET_MESSAGE, - LAST_SIGNAL -}; -static int signals[LAST_SIGNAL] = { 0 }; - - -/* CORBA interface implementation. */ - -static POA_Evolution_ShellView__vepv ShellView_vepv; - -static POA_Evolution_ShellView * -create_servant (void) -{ - POA_Evolution_ShellView *servant; - CORBA_Environment ev; - - servant = (POA_Evolution_ShellView *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &ShellView_vepv; - CORBA_exception_init (&ev); - - POA_Evolution_ShellView__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - return servant; -} - -static void -impl_ShellView_set_message (PortableServer_Servant servant, - const CORBA_char *message, - const CORBA_boolean busy, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - - bonobo_object = bonobo_object_from_servant (servant); - gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[SET_MESSAGE], message, busy); -} - -static void -impl_ShellView_unset_message (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - - bonobo_object = bonobo_object_from_servant (servant); - gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[UNSET_MESSAGE]); -} - - -/* GtkObject methods. */ -static void -destroy (GtkObject *object) -{ - EvolutionShellView *shell_view; - EvolutionShellViewPrivate *priv; - - shell_view = EVOLUTION_SHELL_VIEW (object); - priv = shell_view->priv; - - g_free (priv); -} - - -static void -corba_class_init (void) -{ - POA_Evolution_ShellView__vepv *vepv; - POA_Evolution_ShellView__epv *epv; - PortableServer_ServantBase__epv *base_epv; - - base_epv = g_new0 (PortableServer_ServantBase__epv, 1); - base_epv->_private = NULL; - base_epv->finalize = NULL; - base_epv->default_POA = NULL; - - epv = g_new0 (POA_Evolution_ShellView__epv, 1); - epv->set_message = impl_ShellView_set_message; - epv->unset_message = impl_ShellView_unset_message; - - vepv = &ShellView_vepv; - vepv->_base_epv = base_epv; - vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); - vepv->Evolution_ShellView_epv = epv; -} - -static void -class_init (EvolutionShellViewClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - signals[SET_MESSAGE] - = gtk_signal_new ("set_message", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EvolutionShellViewClass, set_message), - gtk_marshal_NONE__POINTER_INT, - GTK_TYPE_NONE, 2, - GTK_TYPE_STRING, - GTK_TYPE_BOOL); - - signals[UNSET_MESSAGE] - = gtk_signal_new ("unset_message", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EvolutionShellViewClass, unset_message), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); - - parent_class = gtk_type_class (bonobo_object_get_type ()); - - corba_class_init (); -} - -static void -init (EvolutionShellView *shell_view) -{ - EvolutionShellViewPrivate *priv; - - priv = g_new (EvolutionShellViewPrivate, 1); - priv->dummy = 0; - - shell_view->priv = priv; -} - - -/** - * evolution_shell_view_construct: - * @shell_view: - * @corba_object: - * - * Construct @shell_view with the specified @corba_object. - **/ -void -evolution_shell_view_construct (EvolutionShellView *shell_view, - Evolution_ShellView corba_object) -{ - g_return_if_fail (shell_view != NULL); - g_return_if_fail (EVOLUTION_IS_SHELL_VIEW (shell_view)); - - bonobo_object_construct (BONOBO_OBJECT (shell_view), corba_object); -} - -/** - * evolution_shell_view_new: - * - * Create a new EvolutionShellView object. - * - * Return value: The new EvolutionShellView object. - **/ -EvolutionShellView * -evolution_shell_view_new (void) -{ - POA_Evolution_ShellView *servant; - Evolution_ShellView corba_object; - EvolutionShellView *new; - - servant = create_servant (); - if (servant == NULL) - return NULL; - - new = gtk_type_new (evolution_shell_view_get_type ()); - - corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant); - - evolution_shell_view_construct (new, corba_object); - - return new; -} - - -E_MAKE_TYPE (evolution_shell_view, "EvolutionShellView", EvolutionShellView, class_init, init, PARENT_TYPE) diff --git a/shell/evolution-shell-view.h b/shell/evolution-shell-view.h deleted file mode 100644 index e12e8be2e1..0000000000 --- a/shell/evolution-shell-view.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-view.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __EVOLUTION_SHELL_VIEW_H__ -#define __EVOLUTION_SHELL_VIEW_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> - -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_SHELL_VIEW (evolution_shell_view_get_type ()) -#define EVOLUTION_SHELL_VIEW(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SHELL_VIEW, EvolutionShellView)) -#define EVOLUTION_SHELL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SHELL_VIEW, EvolutionShellViewClass)) -#define EVOLUTION_IS_SHELL_VIEW(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SHELL_VIEW)) -#define EVOLUTION_IS_SHELL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SHELL_VIEW)) - - -typedef struct _EvolutionShellView EvolutionShellView; -typedef struct _EvolutionShellViewPrivate EvolutionShellViewPrivate; -typedef struct _EvolutionShellViewClass EvolutionShellViewClass; - -struct _EvolutionShellView { - BonoboObject parent; - - EvolutionShellViewPrivate *priv; -}; - -struct _EvolutionShellViewClass { - BonoboObjectClass parent_class; - - /* Signals. */ - - void (* set_message) (EvolutionShellView *shell_view, const char *message, gboolean busy); - void (* unset_message) (EvolutionShellView *shell_view); -}; - - -GtkType evolution_shell_view_get_type (void); -void evolution_shell_view_construct (EvolutionShellView *shell_view, - Evolution_ShellView corba_object); -EvolutionShellView *evolution_shell_view_new (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_SHELL_VIEW_H__ */ diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c deleted file mode 100644 index 2503905b13..0000000000 --- a/shell/evolution-storage.c +++ /dev/null @@ -1,387 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo.h> - -#include "Evolution.h" - -#include "e-util/e-util.h" - -#include "evolution-storage.h" - - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionStoragePrivate { - char *name; - - Evolution_StorageListener corba_storage_listener; -}; - - -/* CORBA interface implementation. */ - -static POA_Evolution_Storage__vepv Storage_vepv; - -static POA_Evolution_Storage * -create_servant (void) -{ - POA_Evolution_Storage *servant; - CORBA_Environment ev; - - servant = (POA_Evolution_Storage *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &Storage_vepv; - - CORBA_exception_init (&ev); - - POA_Evolution_Storage__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - return servant; -} - -static CORBA_char * -impl_Storage__get_name (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - EvolutionStoragePrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - priv = storage->priv; - - return CORBA_string_dup (priv->name); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EvolutionStorage *storage; - EvolutionStoragePrivate *priv; - CORBA_Environment ev; - - storage = EVOLUTION_STORAGE (object); - priv = storage->priv; - - g_free (priv->name); - - CORBA_exception_init (&ev); - - if (priv->corba_storage_listener != CORBA_OBJECT_NIL) { - Evolution_StorageListener_destroyed (priv->corba_storage_listener, &ev); - - /* (This is not a Bonobo object, so no unref.) */ - CORBA_Object_release (priv->corba_storage_listener, &ev); - } - - CORBA_exception_free (&ev); - - g_free (priv); -} - - -static void -corba_class_init (void) -{ - POA_Evolution_Storage__vepv *vepv; - POA_Evolution_Storage__epv *epv; - PortableServer_ServantBase__epv *base_epv; - - base_epv = g_new0 (PortableServer_ServantBase__epv, 1); - base_epv->_private = NULL; - base_epv->finalize = NULL; - base_epv->default_POA = NULL; - - epv = g_new0 (POA_Evolution_Storage__epv, 1); - epv->_get_name = impl_Storage__get_name; - - vepv = &Storage_vepv; - vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); - vepv->Evolution_Storage_epv = epv; -} - -static void -class_init (EvolutionStorageClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = destroy; - - parent_class = gtk_type_class (bonobo_object_get_type ()); - - corba_class_init (); -} - -static void -init (EvolutionStorage *storage) -{ - EvolutionStoragePrivate *priv; - - priv = g_new (EvolutionStoragePrivate, 1); - priv->name = NULL; - priv->corba_storage_listener = NULL; - - storage->priv = priv; -} - - -void -evolution_storage_construct (EvolutionStorage *storage, - Evolution_Storage corba_object, - const char *name) -{ - EvolutionStoragePrivate *priv; - - g_return_if_fail (storage != NULL); - g_return_if_fail (EVOLUTION_IS_STORAGE (storage)); - g_return_if_fail (corba_object != CORBA_OBJECT_NIL); - g_return_if_fail (name != NULL); - g_return_if_fail (name[0] != '\0'); - - bonobo_object_construct (BONOBO_OBJECT (storage), corba_object); - - priv = storage->priv; - priv->name = g_strdup (name); -} - -EvolutionStorage * -evolution_storage_new (const char *name) -{ - EvolutionStorage *new; - POA_Evolution_Storage *servant; - Evolution_Storage corba_object; - - g_return_val_if_fail (name != NULL, NULL); - g_return_val_if_fail (name[0] != '\0', NULL); - - servant = create_servant (); - if (servant == NULL) - return NULL; - - new = gtk_type_new (evolution_storage_get_type ()); - - corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant); - evolution_storage_construct (new, corba_object, name); - - return new; -} - -EvolutionStorageResult -evolution_storage_register (EvolutionStorage *evolution_storage, - Evolution_StorageRegistry corba_storage_registry) -{ - EvolutionStorageResult result; - Evolution_StorageListener corba_storage_listener; - Evolution_Storage corba_storage; - EvolutionStoragePrivate *priv; - CORBA_Environment ev; - - g_return_val_if_fail (evolution_storage != NULL, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage), - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (corba_storage_registry != CORBA_OBJECT_NIL, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - - priv = evolution_storage->priv; - - if (priv->corba_storage_listener != CORBA_OBJECT_NIL) - return EVOLUTION_STORAGE_ERROR_ALREADYREGISTERED; - - CORBA_exception_init (&ev); - - corba_storage = bonobo_object_corba_objref (BONOBO_OBJECT (evolution_storage)); - corba_storage_listener = Evolution_StorageRegistry_register_storage (corba_storage_registry, - corba_storage, - priv->name, &ev); - - if (ev._major == CORBA_NO_EXCEPTION) { - priv->corba_storage_listener = corba_storage_listener; - result = EVOLUTION_STORAGE_OK; - } else { - if (ev._major != CORBA_USER_EXCEPTION) - result = EVOLUTION_STORAGE_ERROR_CORBA; - else if (strcmp (CORBA_exception_id (&ev), ex_Evolution_StorageRegistry_Exists) == 0) - result = EVOLUTION_STORAGE_ERROR_EXISTS; - else - result = EVOLUTION_STORAGE_ERROR_GENERIC; - } - - CORBA_exception_free (&ev); - - return result; -} - -EvolutionStorageResult -evolution_storage_register_on_shell (EvolutionStorage *evolution_storage, - Evolution_Shell corba_shell) -{ - Evolution_StorageRegistry corba_storage_registry; - EvolutionStorageResult result; - CORBA_Environment ev; - - g_return_val_if_fail (evolution_storage != NULL, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage), - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (corba_shell != CORBA_OBJECT_NIL, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - - CORBA_exception_init (&ev); - - corba_storage_registry = Bonobo_Unknown_query_interface (corba_shell, - "IDL:Evolution/StorageRegistry:1.0", - &ev); - if (corba_storage_registry == CORBA_OBJECT_NIL || ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return EVOLUTION_STORAGE_ERROR_NOREGISTRY; - } - - result = evolution_storage_register (evolution_storage, corba_storage_registry); - - Bonobo_Unknown_unref (corba_storage_registry, &ev); - CORBA_Object_release (corba_storage_registry, &ev); - - CORBA_exception_free (&ev); - - return result; -} - -EvolutionStorageResult -evolution_storage_new_folder (EvolutionStorage *evolution_storage, - const char *path, - const char *type, - const char *physical_uri, - const char *description) -{ - EvolutionStorageResult result; - EvolutionStoragePrivate *priv; - Evolution_Folder corba_folder; - CORBA_Environment ev; - const char *path_basename; - char *parent_path; - - g_return_val_if_fail (evolution_storage != NULL, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage), - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (path != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (g_path_is_absolute (path), EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (description != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (type != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (physical_uri != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - - priv = evolution_storage->priv; - - path_basename = g_basename (path); - - /* Yuck. */ - corba_folder.name = (CORBA_char *) path_basename; - corba_folder.description = (CORBA_char *) description; - corba_folder.type = (CORBA_char *) type; - corba_folder.physical_uri = (CORBA_char *) physical_uri; - - if (path_basename - path > 1) { - parent_path = g_strndup (path, path_basename - path - 1); - } else { - parent_path = g_strdup (G_DIR_SEPARATOR_S); - } - - CORBA_exception_init (&ev); - - Evolution_StorageListener_new_folder (priv->corba_storage_listener, parent_path, - &corba_folder, &ev); - - if (ev._major == CORBA_NO_EXCEPTION) - result = EVOLUTION_STORAGE_OK; - else if (ev._major != CORBA_USER_EXCEPTION) - result = EVOLUTION_STORAGE_ERROR_CORBA; - else if (strcmp (CORBA_exception_id (&ev), ex_Evolution_StorageListener_Exists) == 0) - result = EVOLUTION_STORAGE_ERROR_EXISTS; - else - result = EVOLUTION_STORAGE_ERROR_GENERIC; - - CORBA_exception_free (&ev); - - g_free (parent_path); - - return result; -} - -EvolutionStorageResult -evolution_storage_removed_folder (EvolutionStorage *evolution_storage, - const char *path) -{ - EvolutionStorageResult result; - EvolutionStoragePrivate *priv; - CORBA_Environment ev; - - g_return_val_if_fail (evolution_storage != NULL, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage), - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (path != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - g_return_val_if_fail (g_path_is_absolute (path), EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - - priv = evolution_storage->priv; - - if (priv->corba_storage_listener == CORBA_OBJECT_NIL) - return EVOLUTION_STORAGE_ERROR_NOTREGISTERED; - - CORBA_exception_init (&ev); - - Evolution_StorageListener_removed_folder (priv->corba_storage_listener, path, &ev); - - if (ev._major == CORBA_NO_EXCEPTION) - result = EVOLUTION_STORAGE_OK; - else if (ev._major != CORBA_USER_EXCEPTION) - result = EVOLUTION_STORAGE_ERROR_CORBA; - else if (strcmp (CORBA_exception_id (&ev), ex_Evolution_StorageListener_NotFound) == 0) - result = EVOLUTION_STORAGE_ERROR_NOTFOUND; - else - result = EVOLUTION_STORAGE_ERROR_GENERIC; - - CORBA_exception_free (&ev); - - return result; -} - - -E_MAKE_TYPE (evolution_storage, "EvolutionStorage", EvolutionStorage, class_init, init, PARENT_TYPE) diff --git a/shell/evolution-storage.h b/shell/evolution-storage.h deleted file mode 100644 index 4e96e28df8..0000000000 --- a/shell/evolution-storage.h +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __EVOLUTION_STORAGE_H__ -#define __EVOLUTION_STORAGE_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-object.h> - -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_STORAGE (evolution_storage_get_type ()) -#define EVOLUTION_STORAGE(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_STORAGE, EvolutionStorage)) -#define EVOLUTION_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_STORAGE, EvolutionStorageClass)) -#define EVOLUTION_IS_STORAGE(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_STORAGE)) -#define EVOLUTION_IS_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_STORAGE)) - - -typedef struct _EvolutionStorage EvolutionStorage; -typedef struct _EvolutionStoragePrivate EvolutionStoragePrivate; -typedef struct _EvolutionStorageClass EvolutionStorageClass; - -enum _EvolutionStorageResult { - EVOLUTION_STORAGE_OK, - EVOLUTION_STORAGE_ERROR_ALREADYREGISTERED, - EVOLUTION_STORAGE_ERROR_NOTREGISTERED, - EVOLUTION_STORAGE_ERROR_NOREGISTRY, - EVOLUTION_STORAGE_ERROR_CORBA, - EVOLUTION_STORAGE_ERROR_EXISTS, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER, - EVOLUTION_STORAGE_ERROR_NOTFOUND, - EVOLUTION_STORAGE_ERROR_GENERIC -}; -typedef enum _EvolutionStorageResult EvolutionStorageResult; - -struct _EvolutionStorage { - BonoboObject parent; - - EvolutionStoragePrivate *priv; -}; - -struct _EvolutionStorageClass { - BonoboObjectClass parent_class; -}; - - -GtkType evolution_storage_get_type (void); -void evolution_storage_construct (EvolutionStorage *storage, - Evolution_Storage corba_object, - const char *name); -EvolutionStorage *evolution_storage_new (const char *name); - -EvolutionStorageResult evolution_storage_register (EvolutionStorage *storage, - Evolution_StorageRegistry corba_registry); -EvolutionStorageResult evolution_storage_register_on_shell (EvolutionStorage *evolution_storage, - Evolution_Shell corba_shell); - -EvolutionStorageResult evolution_storage_new_folder (EvolutionStorage *evolution_storage, - const char *path, - const char *type, - const char *physical_uri, - const char *description); -EvolutionStorageResult evolution_storage_removed_folder (EvolutionStorage *evolution_storage, - const char *path); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_STORAGE_H__ */ diff --git a/shell/glade/.cvsignore b/shell/glade/.cvsignore deleted file mode 100644 index 3045c518dc..0000000000 --- a/shell/glade/.cvsignore +++ /dev/null @@ -1,4 +0,0 @@ -.deps -.libs -Makefile.in -Makefile diff --git a/shell/glade/Makefile.am b/shell/glade/Makefile.am deleted file mode 100644 index 9ef3238360..0000000000 --- a/shell/glade/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -gladedir = $(datadir)/evolution/glade - -glade_DATA = e-shell-folder-creation-dialog.glade - -EXTRA_DIST = $(glade_DATA) diff --git a/shell/glade/e-shell-folder-creation-dialog.glade b/shell/glade/e-shell-folder-creation-dialog.glade deleted file mode 100644 index 21701a2a29..0000000000 --- a/shell/glade/e-shell-folder-creation-dialog.glade +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0"?> -<GTK-Interface> - -<project> - <name>Shell</name> - <program_name>shell</program_name> - <directory></directory> - <source_directory>src</source_directory> - <pixmaps_directory>pixmaps</pixmaps_directory> - <language>C</language> - <gnome_support>True</gnome_support> - <gettext_support>True</gettext_support> -</project> - -<widget> - <class>GnomeDialog</class> - <name>create_folder_dialog</name> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <default_width>350</default_width> - <default_height>410</default_height> - <allow_shrink>True</allow_shrink> - <allow_grow>True</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>dialog-vbox1</name> - <homogeneous>False</homogeneous> - <spacing>8</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>dialog-action_area1</name> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>ok_button</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>cancel_button</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> - </widget> - </widget> - - <widget> - <class>GtkVBox</class> - <name>main_vbox</name> - <homogeneous>False</homogeneous> - <spacing>6</spacing> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkLabel</class> - <name>folder_name_label</name> - <label>Folder name:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>7.45058e-09</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>folder_name_entry</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>folder_type_label</name> - <label>Folder type:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>7.45058e-09</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - - <widget> - <class>GtkOptionMenu</class> - <name>folder_type_option_menu</name> - <can_focus>True</can_focus> - <items></items> - <initial_choice>0</initial_choice> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>creation_position_label</name> - <label>Specify where to create the folder:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>7.45058e-09</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - </widget> - </widget> -</widget> - -</GTK-Interface> diff --git a/shell/idl/folder.idl b/shell/idl/folder.idl deleted file mode 100644 index 4a9850a468..0000000000 --- a/shell/idl/folder.idl +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * folder.idl - * Copyright (C) 2000 Helix Code, Inc. - * Author: Christopher James Lahey <clahey@helixcode.com> - * - * Based on original from Matt Loper. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -module Evolution { - - interface FolderListener { - - enum CallStatus { - Success, - RepositoryOffline, - PermissionDenied, - WrongFolderType, - WrongFolderDomain, - FolderNotFound - }; - - void folder_listener_ready (in CallStatus status, - in Folder folder); - - void respond_add_subfolder (in CallStatus status, - in Folder folder); - void respond_move_subfolder (in CallStatus status); - void respond_delete_subfolder (in CallStatus status); - - /* This signals that some piece of data has changed. - The name or icon has changed. */ - void signal_name_changed(in Folder folder); - void signal_icon_changed(in Folder folder); - - /* This says a child/children has been added. */ - void signal_subfolder_added(in FolderList folders); - /* This says a child has been removed. */ - void signal_subfolder_removed(in Folder folder); - }; - - interface Folder { - void set_listener (in FolderListener listener); - - /* - * get a bonobo control for this view; a client won't - * use the goad_id gathered in the above function, b/c - * only the wombat knows how to do that, by surfing - * the physical evolution directory structure - */ - Bonobo::control get_control(); - - /* - * You must know what interface to query_interface() - * for once you get a data source! - */ - Bonobo::Unknown get_data_source(); - - char *get_name(); - char *get_icon(); - - void add_subfolder (in string data_source_id, - in string control_id, - in string viewable_name); - void move_subfolder (in Folder subfolder); - void delete_subfolder (in Folder subfolder); - }; - - interface Wombat { - void get_root_folder(FolderListener listener); - }; -}; diff --git a/shell/main.c b/shell/main.c deleted file mode 100644 index 1e2d3c3cc2..0000000000 --- a/shell/main.c +++ /dev/null @@ -1,174 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* main.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#include <config.h> -#include <gnome.h> -#include <bonobo.h> -#include <libgnomeui/gnome-window-icon.h> -#include <glade/glade.h> -#include <liboaf/liboaf.h> - -#include "e-util/e-gui-utils.h" -#include "e-setup.h" - -#include "e-shell.h" - -#define STARTUP_URI "evolution:/local/Inbox" - -static EShell *shell; - -static void -no_views_left_cb (EShell *shell, gpointer data) -{ - e_shell_quit (shell); - gtk_main_quit (); -} - -static void -destroy_cb (GtkObject *object, gpointer data) -{ - gtk_main_quit (); -} - -static void -development_warning () -{ - GtkWidget *label, *warning_dialog; - int ret; - - warning_dialog = gnome_dialog_new ( - "Evolution" VERSION, - GNOME_STOCK_BUTTON_OK, - NULL); - - label = gtk_label_new ( - _( - "Hi. Thanks for taking the time to download this preview release\n" - "of the Evolution groupware suite.\n" - "\n" - "Over the last month and a half, our focus has been on making\n" - "Evolution usable. Many of the Evolution developers are now using\n" - "Evolution to read their mail full time. You could too. (Just\n" - "be sure to keep a backup.)\n" - "\n" - "But while we have fixed many bugs affecting its stability and\n" - "security, you still get the disclaimer: Evolution will: crash,\n" - "lose your mail when you don't want it to, refuse to delete your\n" - "mail when you do want it to, leave stray processes running,\n" - "consume 100% CPU, race, lock, send HTML mail to random mailing\n" - "lists, and embarass you in front of your friends and co-workers.\n" - "Use only as directed.\n" - "\n" - "We hope that you enjoy the results of our hard work, and we eagerly\n" - "await your contributions!\n" - )); - gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); - gtk_widget_show (label); - - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dialog)->vbox), - label, TRUE, TRUE, 4); - - label = gtk_label_new ( - _( - "Thanks\n" - "The Evolution Team\n" - )); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT); - gtk_misc_set_alignment(GTK_MISC(label), 1, .5); - gtk_widget_show (label); - - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dialog)->vbox), - label, TRUE, TRUE, 0); - - ret = gnome_dialog_run (GNOME_DIALOG (warning_dialog)); - if (ret != -1) - gtk_object_destroy (GTK_OBJECT (warning_dialog)); -} - -static gint -idle_cb (gpointer data) -{ - GtkWidget *view; - char *evolution_directory; - - evolution_directory = (char *) data; - - shell = e_shell_new (evolution_directory); - g_free (evolution_directory); - - if (shell == NULL) { - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("Cannot initialize the Evolution shell.")); - exit (1); - } - - gtk_signal_connect (GTK_OBJECT (shell), "no_views_left", - GTK_SIGNAL_FUNC (no_views_left_cb), NULL); - gtk_signal_connect (GTK_OBJECT (shell), "destroy", - GTK_SIGNAL_FUNC (destroy_cb), NULL); - - if (! e_shell_restore_from_settings (shell)) - view = e_shell_new_view (shell, STARTUP_URI); - - if (!getenv ("EVOLVE_ME_HARDER")) - development_warning (); - - return FALSE; -} - -int -main (int argc, char **argv) -{ - char *evolution_directory; - - bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR); - textdomain (PACKAGE); - - gnome_init_with_popt_table ("Evolution", VERSION, argc, argv, oaf_popt_options, 0, NULL); - oaf_init (argc, argv); - - glade_gnome_init (); - - gnome_window_icon_set_default_from_file (EVOLUTION_IMAGES "/evolution-inbox.png"); - - if (! bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL)) { - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("Cannot initialize the Bonobo component system.")); - exit (1); - } - - /* FIXME */ - evolution_directory = g_concat_dir_and_file (g_get_home_dir (), "evolution"); - - if (! e_setup (evolution_directory)) { - g_free (evolution_directory); - exit (1); - } - - gtk_idle_add (idle_cb, evolution_directory); - - bonobo_main (); - - return 0; -} - |